diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -1,102 +1,103 @@
 Makefile$
 Makefile\.in$
 \.deps$
 \.libs$
 \.l[ao]$
 \.so$
 \.so\.
 \.o$
 ~$
 \.pyc$
 \.codereplace$
 \.orig$
 \.tar\.(gz|bz2)$
 ^autom4te.cache$
 ^config.herwig$
 ^config.log$
 ^config.status$
 ^configure$
 ^include/Herwig$
 ^Config/config.guess$
 ^Config/config.h$
 ^Config/config.h.in$
 ^Config/config.sub$
 ^Config/depcomp$
 ^Config/compile$
 ^Config/install-sh$
 ^Config/missing$
 ^Config/stamp-h1$
 ^Config/ar-lib$
 ^Contrib/make_makefiles.sh$
+^Contrib/.*/.*\.(log|out|tex|run)$
 ^Utilities/hgstamp.inc$
 ^Doc/HerwigDefaults.in$
 ^Doc/refman-html$
 ^Doc/fixinterfaces.pl$
 ^Doc/refman.conf$
 ^Doc/refman.h$
 ^Doc/AllInterfaces.h$
 ^Doc/HerwigDefaults.rpo$
 ^Doc/Herwig-refman.tag$
 ^Doc/tagfileThePEG.tag$
 ^Doc/.*\.log$
 ^INSTALL$
 ^aclocal.m4$
 ^confdefs.h$
 ^conftest.c$
 ^conftest.err$
 ^include/done-all-links$
 ^libtool$
 \.dirstamp$
 ^src/hgstamp.inc$
 ^src/herwigopts.h$
 ^src/herwigopts.c$
 ^src/defaults/Analysis.in$
 ^src/defaults/Decays.in$
 ^src/defaults/decayers.in$
 ^src/herwig-config$
 ^src/.*\.(run|tex|out|log|rpo|spc|top|dump|dot|aux|pdf|ps|png|svg|hepmc|dvi)$
 ^src/Makefile-UserModules$
 ^lib/done-all-links$
 ^lib/apple-fixes$
 ^src/defaults/PDF.in$
 ^src/defaults/done-all-links$
 ^src/tune$
 ^src/Herwig$
 ^src/Herwig-scratch$
 ^src/tests/.*\.(time|mult|Bmult|chisq)$
 ^Tests/.*/.*\.(top|ps|pyc|info|dat|pdf|png)$
 ^Tests/.*\.(top|ps|pyc|info|dat|pdf|png|log|out)$
 ^Tests/.*\.(top|run|tex|mult|Bmult|aida|yoda)$
 ^Tests/Rivet-.*$
 ^Tests/Rivet/(LEP|DIS|LHC|TVT|Star|BFactory|ISR|SppS)-.*\.in$
 ^Tests/plots$
 ^Tests/Herwig$
 ^Tests/.*index.html$
 ^Herwig\-
 ^Models/Feynrules/python/Makefile-FR$
 ^MatrixElement/Matchbox/External/MadGraph/mg2herwig.py$
 ^MatrixElement/Matchbox/Scales/MatchboxScale.cc$
 ^Utilities/Statistics/herwig-combinedistributions$
 ^Utilities/Statistics/herwig-combineruns$
 ^Utilities/Statistics/herwig-makedistributions$
 ^src/defaults/MatchboxDefaults.in$
 ^src/defaults/setup.gosam.in$
 ^src/Matchbox/LO-DefaultShower.in$
 ^src/Matchbox/LO-DipoleShower.in$
 ^src/Matchbox/LO-NoShower.in$
 ^src/Matchbox/MCatLO-DefaultShower.in$
 ^src/Matchbox/MCatLO-DipoleShower.in$
 ^src/Matchbox/MCatNLO-DefaultShower.in$
 ^src/Matchbox/MCatNLO-DipoleShower.in$
 ^src/Matchbox/NLO-NoShower.in$
 ^src/Matchbox/Powheg-DefaultShower.in$
 ^src/Matchbox/Powheg-DipoleShower.in$
 ^src/Matchbox/done-all-links$
 ^src/snippets/done-all-links$
 ^Utilities/XML/xml_test$
 ^Utilities/utilities_test$
 ^Utilities/versionstring.h$
 test\.(log|trs)$
 test-suite\.log$
 ^Config/test-driver$
 param_card\.dat$
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -1,21 +1,22 @@
 168ae2110e964d62fbc1331a1c2e095952a67748 release-2-5-2
 3abb4fa42e20e332796c2572334c2d77204cd0e0 release-2-4-2
 4796ca080aafd5daa3b7349b015cb1df944428a2 release-2-5-0
 76da042f056eb153981b4d005d5474ffb90a5e88 release-2-4-1
 81a684a558413c69df314365eabf09893ffd43d8 release-2-6-0
 bd75cd00d99f4bdbaed992daf98f0a73c0f91e9b release-2-4-0
 ff6ecc8d49ce10299303b050394bd5cb5837f1c3 release-2-5-1
 d0389f5453b2c210923e1adc7b872b18269de668 release-2-6-1
 f8998033021185942533b824607285feb3fbd2dc release-2-6-1a
 cead23e428b9aacaf2d709e722624e54f844498b release-2-6-1b
 191db4655439045f912cb21bd905e729d59ec7bc release-2-6-2
 edb538156e9c3d64bb842934b4cebf0126aeb9ea release-2-6-3
 eb4a104591859ecac18746b1ad54d6aa0c2a5d1a release-2-7-0
 568971ac5b3c1d044c9259f2280a8304fc5a62e9 trunk-before-QED
 6e3edb6cfeb4ee48687eb4eb3d016026fc59d602 trunk-after-QED
 633abb80b571aa23088957df60e9b0000bbb8a22 release-2-7-1
 1bdde095d2346c15ee548e5406a96f0fc6d6e0f1 beforeHQ
 a0f9fb821396092bdbeee532bcb0bd624f58335b before_MB_merge
 270c1e6b34aa7f758f1d9868c4d3e1ec4bf4e709 herwig-7-0-0
 6e0f198c1c2603ecd1a0b6cfe40105cda4bd58c5 herwig-7-0-1
 566c1de845a8070559cda45b1bdb40afa18cb2cc herwig-7-0-2
+f5c4aa956880f2def763ebd57de7b5bfa55cb1db herwig-7-0-3
diff --git a/AUTHORS b/AUTHORS
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,56 +1,56 @@
 ================================================================================
-Herwig 7.0.2
+Herwig 7.0.3
 ================================================================================
 
 Please contact <herwig@projects.hepforge.org> for any queries.
 
 --------------------------------------------------------------------------------
 Herwig is actively developed by:
 --------------------------------------------------------------------------------
 
 Johannes Bellm
 Stefan Gieseke
 David Grellscheid
 Simon Plätzer
 Michael Rauch
 Christian Reuschle
 Peter Richardson
 Peter Schichtel
 Mike Seymour
 Andrzej Siödmok
 Alix Wilcock
 
 --------------------------------------------------------------------------------
 With contributions by:
 --------------------------------------------------------------------------------
 
 Nadine Fischer
 Marco A. Harrendorf
 Graeme Nail
 Andreas Papaefstathiou
 Daniel Rauch
 
 --------------------------------------------------------------------------------
 Former authors are:
 --------------------------------------------------------------------------------
 
 Ken Arnold
 Manuel Bähr
 Luca d'Errico
 Martyn Gigg
 Keith Hamilton
 Seyi Latunde-Dada
 Alberto Ribon
 Christian Röhr
 Pavel Růžička
 Alex Schofield
 Thomas Schuh
 Alexander Sherstnev
 Philip Stephens
 Martin Stoll
 Louise Suter
 Jon Tully
 Bryan Webber
 David Winn
 Benedikt Zimmermann
 
diff --git a/Analysis/Makefile.am b/Analysis/Makefile.am
--- a/Analysis/Makefile.am
+++ b/Analysis/Makefile.am
@@ -1,59 +1,59 @@
 pkglib_LTLIBRARIES = HwAnalysis.la
 HwAnalysis_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 10:0:0
 HwAnalysis_la_SOURCES = \
 EventShapes.cc EventShapes.fh EventShapes.h  \
 EventShapesMasterAnalysis.cc EventShapesMasterAnalysis.h \
 BasicConsistency.cc BasicConsistency.h \
 LEPMultiplicityCount.cc LEPMultiplicityCount.h \
 MultiplicityInfo.h \
 LEPBMultiplicity.cc\
 LEPBMultiplicity.h \
 SimpleLHCAnalysis.h SimpleLHCAnalysis.cc\
 TTbarAnalysis.h TTbarAnalysis.cc\
 LPairAnalysis.h LPairAnalysis.cc\
 GammaGammaAnalysis.h GammaGammaAnalysis.cc\
 GammaJetAnalysis.h GammaJetAnalysis.cc\
 HiggsJetAnalysis.h HiggsJetAnalysis.cc \
 ParallelRunAnalysis.h ParallelRunAnalysis.cc \
 DrellYanPT.h DrellYanPT.cc
 
 pkglib_LTLIBRARIES += HwJetsAnalysis.la
-HwJetsAnalysis_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:0:0
+HwJetsAnalysis_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 3:0:0
 HwJetsAnalysis_la_SOURCES = \
 LeptonsJetsAnalysis.h LeptonsJetsAnalysis.cc \
 JetsPlusAnalysis.h JetsPlusAnalysis.cc \
 HJetsAnalysis.h HJetsAnalysis.cc \
 ZJetsAnalysis.h ZJetsAnalysis.cc \
 TTJetsAnalysis.h TTJetsAnalysis.cc \
 CrossSectionAnalysis.h CrossSectionAnalysis.cc
 
 pkglib_LTLIBRARIES +=  HwLEPAnalysis.la
 HwLEPAnalysis_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 7:0:0
 HwLEPAnalysis_la_SOURCES = \
 BFragmentationAnalysisHandler.cc BFragmentationAnalysisHandler.h\
 SingleParticleAnalysis.cc SingleParticleAnalysis.h\
 LEPEventShapes.cc LEPEventShapes.h\
 IdentifiedParticleAnalysis.cc IdentifiedParticleAnalysis.h\
 BELLECharmAnalysis.h BELLECharmAnalysis.cc\
 CLEOCharmAnalysis.h CLEOCharmAnalysis.cc
 
 # analysis code which depends on fastjet
 if WANT_LIBFASTJET
 pkglib_LTLIBRARIES += HwLEPJetAnalysis.la
 HwLEPJetAnalysis_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 9:1:0
 HwLEPJetAnalysis_la_CPPFLAGS = $(AM_CPPFLAGS) $(FASTJETINCLUDE) \
 -I$(FASTJETPATH)
 HwLEPJetAnalysis_la_LIBADD = $(FASTJETLIBS)
 HwLEPJetAnalysis_la_SOURCES = \
 LEPJetAnalysis.cc LEPJetAnalysis.h\
 LEPFourJetsAnalysis.cc LEPFourJetsAnalysis.h
 endif
 
 pkglib_LTLIBRARIES += HwTevatronAnalysis.la
 HwTevatronAnalysis_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:0:0
 HwTevatronAnalysis_la_CPPFLAGS = $(AM_CPPFLAGS)
 HwTevatronAnalysis_la_SOURCES = \
 ZpTRun2.cc ZpTRun2.h \
 ZpTRun1.cc ZpTRun1.h \
 Wpt.cc Wpt.h \
 Zrapidity.cc Zrapidity.h
diff --git a/Config/ltmain.sh b/Config/ltmain.sh
--- a/Config/ltmain.sh
+++ b/Config/ltmain.sh
@@ -1,11147 +1,11149 @@
 #! /bin/sh
 ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
 ##               by inline-source v2014-01-03.01
 
 # libtool (GNU libtool) 2.4.6
 # Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
 # Copyright (C) 1996-2015 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.
 
 # GNU Libtool is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
 #
 # As a special exception to the GNU General Public License,
 # if you distribute this file as part of a program or library that
 # is built using GNU Libtool, you may include this file under the
 # same distribution terms that you use for the rest of that program.
 #
 # GNU Libtool is distributed in the hope that it will be useful, but
 # WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 PROGRAM=libtool
 PACKAGE=libtool
 VERSION=2.4.6
 package_revision=2.4.6
 
 
 ## ------ ##
 ## Usage. ##
 ## ------ ##
 
 # Run './libtool --help' for help with using this script from the
 # command line.
 
 
 ## ------------------------------- ##
 ## User overridable command paths. ##
 ## ------------------------------- ##
 
 # After configure completes, it has a better idea of some of the
 # shell tools we need than the defaults used by the functions shared
 # with bootstrap, so set those here where they can still be over-
 # ridden by the user, but otherwise take precedence.
 
 : ${AUTOCONF="autoconf"}
 : ${AUTOMAKE="automake"}
 
 
 ## -------------------------- ##
 ## Source external libraries. ##
 ## -------------------------- ##
 
 # Much of our low-level functionality needs to be sourced from external
 # libraries, which are installed to $pkgauxdir.
 
 # Set a version string for this script.
 scriptversion=2015-01-20.17; # UTC
 
 # General shell script boiler plate, and helper functions.
 # Written by Gary V. Vaughan, 2004
 
 # Copyright (C) 2004-2015 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.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 
 # As a special exception to the GNU General Public License, if you distribute
 # this file as part of a program or library that is built using GNU Libtool,
 # you may include this file under the same distribution terms that you use
 # for the rest of that program.
 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
 # General Public License for more details.
 
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
 # Please report bugs or propose patches to gary@gnu.org.
 
 
 ## ------ ##
 ## Usage. ##
 ## ------ ##
 
 # Evaluate this file near the top of your script to gain access to
 # the functions and variables defined here:
 #
 #   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
 #
 # If you need to override any of the default environment variable
 # settings, do that before evaluating this file.
 
 
 ## -------------------- ##
 ## Shell normalisation. ##
 ## -------------------- ##
 
 # Some shells need a little help to be as Bourne compatible as possible.
 # Before doing anything else, make sure all that help has been provided!
 
 DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
   case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
 fi
 
 # NLS nuisances: We save the old values in case they are required later.
 _G_user_locale=
 _G_safe_locale=
 for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
 do
   eval "if test set = \"\${$_G_var+set}\"; then
           save_$_G_var=\$$_G_var
           $_G_var=C
 	  export $_G_var
 	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
 	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
 	fi"
 done
 
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 # Make sure IFS has a sensible default
 sp=' '
 nl='
 '
 IFS="$sp	$nl"
 
 # There are apparently some retarded systems that use ';' as a PATH separator!
 if test "${PATH_SEPARATOR+set}" != set; then
   PATH_SEPARATOR=:
   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
       PATH_SEPARATOR=';'
   }
 fi
 
 
 
 ## ------------------------- ##
 ## Locate command utilities. ##
 ## ------------------------- ##
 
 
 # func_executable_p FILE
 # ----------------------
 # Check that FILE is an executable regular file.
 func_executable_p ()
 {
     test -f "$1" && test -x "$1"
 }
 
 
 # func_path_progs PROGS_LIST CHECK_FUNC [PATH]
 # --------------------------------------------
 # Search for either a program that responds to --version with output
 # containing "GNU", or else returned by CHECK_FUNC otherwise, by
 # trying all the directories in PATH with each of the elements of
 # PROGS_LIST.
 #
 # CHECK_FUNC should accept the path to a candidate program, and
 # set $func_check_prog_result if it truncates its output less than
 # $_G_path_prog_max characters.
 func_path_progs ()
 {
     _G_progs_list=$1
     _G_check_func=$2
     _G_PATH=${3-"$PATH"}
 
     _G_path_prog_max=0
     _G_path_prog_found=false
     _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
     for _G_dir in $_G_PATH; do
       IFS=$_G_save_IFS
       test -z "$_G_dir" && _G_dir=.
       for _G_prog_name in $_G_progs_list; do
         for _exeext in '' .EXE; do
           _G_path_prog=$_G_dir/$_G_prog_name$_exeext
           func_executable_p "$_G_path_prog" || continue
           case `"$_G_path_prog" --version 2>&1` in
             *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
             *)     $_G_check_func $_G_path_prog
 		   func_path_progs_result=$func_check_prog_result
 		   ;;
           esac
           $_G_path_prog_found && break 3
         done
       done
     done
     IFS=$_G_save_IFS
     test -z "$func_path_progs_result" && {
       echo "no acceptable sed could be found in \$PATH" >&2
       exit 1
     }
 }
 
 
 # We want to be able to use the functions in this file before configure
 # has figured out where the best binaries are kept, which means we have
 # to search for them ourselves - except when the results are already set
 # where we skip the searches.
 
 # Unless the user overrides by setting SED, search the path for either GNU
 # sed, or the sed that truncates its output the least.
 test -z "$SED" && {
   _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
   for _G_i in 1 2 3 4 5 6 7; do
     _G_sed_script=$_G_sed_script$nl$_G_sed_script
   done
   echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
   _G_sed_script=
 
   func_check_prog_sed ()
   {
     _G_path_prog=$1
 
     _G_count=0
     printf 0123456789 >conftest.in
     while :
     do
       cat conftest.in conftest.in >conftest.tmp
       mv conftest.tmp conftest.in
       cp conftest.in conftest.nl
       echo '' >> conftest.nl
       "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
       diff conftest.out conftest.nl >/dev/null 2>&1 || break
       _G_count=`expr $_G_count + 1`
       if test "$_G_count" -gt "$_G_path_prog_max"; then
         # Best one so far, save it but keep looking for a better one
         func_check_prog_result=$_G_path_prog
         _G_path_prog_max=$_G_count
       fi
       # 10*(2^10) chars as input seems more than enough
       test 10 -lt "$_G_count" && break
     done
     rm -f conftest.in conftest.tmp conftest.nl conftest.out
   }
 
   func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
   rm -f conftest.sed
   SED=$func_path_progs_result
 }
 
 
 # Unless the user overrides by setting GREP, search the path for either GNU
 # grep, or the grep that truncates its output the least.
 test -z "$GREP" && {
   func_check_prog_grep ()
   {
     _G_path_prog=$1
 
     _G_count=0
     _G_path_prog_max=0
     printf 0123456789 >conftest.in
     while :
     do
       cat conftest.in conftest.in >conftest.tmp
       mv conftest.tmp conftest.in
       cp conftest.in conftest.nl
       echo 'GREP' >> conftest.nl
       "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
       diff conftest.out conftest.nl >/dev/null 2>&1 || break
       _G_count=`expr $_G_count + 1`
       if test "$_G_count" -gt "$_G_path_prog_max"; then
         # Best one so far, save it but keep looking for a better one
         func_check_prog_result=$_G_path_prog
         _G_path_prog_max=$_G_count
       fi
       # 10*(2^10) chars as input seems more than enough
       test 10 -lt "$_G_count" && break
     done
     rm -f conftest.in conftest.tmp conftest.nl conftest.out
   }
 
   func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
   GREP=$func_path_progs_result
 }
 
 
 ## ------------------------------- ##
 ## User overridable command paths. ##
 ## ------------------------------- ##
 
 # All uppercase variable names are used for environment variables.  These
 # variables can be overridden by the user before calling a script that
 # uses them if a suitable command of that name is not already available
 # in the command search PATH.
 
 : ${CP="cp -f"}
 : ${ECHO="printf %s\n"}
 : ${EGREP="$GREP -E"}
 : ${FGREP="$GREP -F"}
 : ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
 
 
 ## -------------------- ##
 ## Useful sed snippets. ##
 ## -------------------- ##
 
 sed_dirname='s|/[^/]*$||'
 sed_basename='s|^.*/||'
 
 # Sed substitution that helps us do robust quoting.  It backslashifies
 # metacharacters that are still active within double-quoted strings.
 sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
 
 # Same as above, but do not quote variable references.
 sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
 # Sed substitution that turns a string into a regex matching for the
 # string literally.
 sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
 
 # Sed substitution that converts a w32 file name or path
 # that contains forward slashes, into one that contains
 # (escaped) backslashes.  A very naive implementation.
 sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
 
 # Re-'\' parameter expansions in output of sed_double_quote_subst that
 # were '\'-ed in input to the same.  If an odd number of '\' preceded a
 # '$' in input to sed_double_quote_subst, that '$' was protected from
 # expansion.  Since each input '\' is now two '\'s, look for any number
 # of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
 _G_bs='\\'
 _G_bs2='\\\\'
 _G_bs4='\\\\\\\\'
 _G_dollar='\$'
 sed_double_backslash="\
   s/$_G_bs4/&\\
 /g
   s/^$_G_bs2$_G_dollar/$_G_bs&/
   s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
   s/\n//g"
 
 
 ## ----------------- ##
 ## Global variables. ##
 ## ----------------- ##
 
 # Except for the global variables explicitly listed below, the following
 # functions in the '^func_' namespace, and the '^require_' namespace
 # variables initialised in the 'Resource management' section, sourcing
 # this file will not pollute your global namespace with anything
 # else. There's no portable way to scope variables in Bourne shell
 # though, so actually running these functions will sometimes place
 # results into a variable named after the function, and often use
 # temporary variables in the '^_G_' namespace. If you are careful to
 # avoid using those namespaces casually in your sourcing script, things
 # should continue to work as you expect. And, of course, you can freely
 # overwrite any of the functions or variables defined here before
 # calling anything to customize them.
 
 EXIT_SUCCESS=0
 EXIT_FAILURE=1
 EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
 EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
 
 # Allow overriding, eg assuming that you follow the convention of
 # putting '$debug_cmd' at the start of all your functions, you can get
 # bash to show function call trace with:
 #
 #    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
 debug_cmd=${debug_cmd-":"}
 exit_cmd=:
 
 # By convention, finish your script with:
 #
 #    exit $exit_status
 #
 # so that you can set exit_status to non-zero if you want to indicate
 # something went wrong during execution without actually bailing out at
 # the point of failure.
 exit_status=$EXIT_SUCCESS
 
 # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
 # is ksh but when the shell is invoked as "sh" and the current value of
 # the _XPG environment variable is not equal to 1 (one), the special
 # positional parameter $0, within a function call, is the name of the
 # function.
 progpath=$0
 
 # The name of this program.
 progname=`$ECHO "$progpath" |$SED "$sed_basename"`
 
 # Make sure we have an absolute progpath for reexecution:
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
      progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
      progdir=`cd "$progdir" && pwd`
      progpath=$progdir/$progname
      ;;
   *)
      _G_IFS=$IFS
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
        IFS=$_G_IFS
        test -x "$progdir/$progname" && break
      done
      IFS=$_G_IFS
      test -n "$progdir" || progdir=`pwd`
      progpath=$progdir/$progname
      ;;
 esac
 
 
 ## ----------------- ##
 ## Standard options. ##
 ## ----------------- ##
 
 # The following options affect the operation of the functions defined
 # below, and should be set appropriately depending on run-time para-
 # meters passed on the command line.
 
 opt_dry_run=false
 opt_quiet=false
 opt_verbose=false
 
 # Categories 'all' and 'none' are always available.  Append any others
 # you will pass as the first argument to func_warning from your own
 # code.
 warning_categories=
 
 # By default, display warnings according to 'opt_warning_types'.  Set
 # 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
 # treat the next displayed warning as a fatal error.
 warning_func=func_warn_and_continue
 
 # Set to 'all' to display all warnings, 'none' to suppress all
 # warnings, or a space delimited list of some subset of
 # 'warning_categories' to display only the listed warnings.
 opt_warning_types=all
 
 
 ## -------------------- ##
 ## Resource management. ##
 ## -------------------- ##
 
 # This section contains definitions for functions that each ensure a
 # particular resource (a file, or a non-empty configuration variable for
 # example) is available, and if appropriate to extract default values
 # from pertinent package files. Call them using their associated
 # 'require_*' variable to ensure that they are executed, at most, once.
 #
 # It's entirely deliberate that calling these functions can set
 # variables that don't obey the namespace limitations obeyed by the rest
 # of this file, in order that that they be as useful as possible to
 # callers.
 
 
 # require_term_colors
 # -------------------
 # Allow display of bold text on terminals that support it.
 require_term_colors=func_require_term_colors
 func_require_term_colors ()
 {
     $debug_cmd
 
     test -t 1 && {
       # COLORTERM and USE_ANSI_COLORS environment variables take
       # precedence, because most terminfo databases neglect to describe
       # whether color sequences are supported.
       test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
 
       if test 1 = "$USE_ANSI_COLORS"; then
         # Standard ANSI escape sequences
         tc_reset=''
         tc_bold='';   tc_standout=''
         tc_red='';   tc_green=''
         tc_blue='';  tc_cyan=''
       else
         # Otherwise trust the terminfo database after all.
         test -n "`tput sgr0 2>/dev/null`" && {
           tc_reset=`tput sgr0`
           test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
           tc_standout=$tc_bold
           test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
           test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
           test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
           test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
           test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
         }
       fi
     }
 
     require_term_colors=:
 }
 
 
 ## ----------------- ##
 ## Function library. ##
 ## ----------------- ##
 
 # This section contains a variety of useful functions to call in your
 # scripts. Take note of the portable wrappers for features provided by
 # some modern shells, which will fall back to slower equivalents on
 # less featureful shells.
 
 
 # func_append VAR VALUE
 # ---------------------
 # Append VALUE onto the existing contents of VAR.
 
   # We should try to minimise forks, especially on Windows where they are
   # unreasonably slow, so skip the feature probes when bash or zsh are
   # being used:
   if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
     : ${_G_HAVE_ARITH_OP="yes"}
     : ${_G_HAVE_XSI_OPS="yes"}
     # The += operator was introduced in bash 3.1
     case $BASH_VERSION in
       [12].* | 3.0 | 3.0*) ;;
       *)
         : ${_G_HAVE_PLUSEQ_OP="yes"}
         ;;
     esac
   fi
 
   # _G_HAVE_PLUSEQ_OP
   # Can be empty, in which case the shell is probed, "yes" if += is
   # useable or anything else if it does not work.
   test -z "$_G_HAVE_PLUSEQ_OP" \
     && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
     && _G_HAVE_PLUSEQ_OP=yes
 
 if test yes = "$_G_HAVE_PLUSEQ_OP"
 then
   # This is an XSI compatible shell, allowing a faster implementation...
   eval 'func_append ()
   {
     $debug_cmd
 
     eval "$1+=\$2"
   }'
 else
   # ...otherwise fall back to using expr, which is often a shell builtin.
   func_append ()
   {
     $debug_cmd
 
     eval "$1=\$$1\$2"
   }
 fi
 
 
 # func_append_quoted VAR VALUE
 # ----------------------------
 # Quote VALUE and append to the end of shell variable VAR, separated
 # by a space.
 if test yes = "$_G_HAVE_PLUSEQ_OP"; then
   eval 'func_append_quoted ()
   {
     $debug_cmd
 
     func_quote_for_eval "$2"
     eval "$1+=\\ \$func_quote_for_eval_result"
   }'
 else
   func_append_quoted ()
   {
     $debug_cmd
 
     func_quote_for_eval "$2"
     eval "$1=\$$1\\ \$func_quote_for_eval_result"
   }
 fi
 
 
 # func_append_uniq VAR VALUE
 # --------------------------
 # Append unique VALUE onto the existing contents of VAR, assuming
 # entries are delimited by the first character of VALUE.  For example:
 #
 #   func_append_uniq options " --another-option option-argument"
 #
 # will only append to $options if " --another-option option-argument "
 # is not already present somewhere in $options already (note spaces at
 # each end implied by leading space in second argument).
 func_append_uniq ()
 {
     $debug_cmd
 
     eval _G_current_value='`$ECHO $'$1'`'
     _G_delim=`expr "$2" : '\(.\)'`
 
     case $_G_delim$_G_current_value$_G_delim in
       *"$2$_G_delim"*) ;;
       *) func_append "$@" ;;
     esac
 }
 
 
 # func_arith TERM...
 # ------------------
 # Set func_arith_result to the result of evaluating TERMs.
   test -z "$_G_HAVE_ARITH_OP" \
     && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
     && _G_HAVE_ARITH_OP=yes
 
 if test yes = "$_G_HAVE_ARITH_OP"; then
   eval 'func_arith ()
   {
     $debug_cmd
 
     func_arith_result=$(( $* ))
   }'
 else
   func_arith ()
   {
     $debug_cmd
 
     func_arith_result=`expr "$@"`
   }
 fi
 
 
 # func_basename FILE
 # ------------------
 # Set func_basename_result to FILE with everything up to and including
 # the last / stripped.
 if test yes = "$_G_HAVE_XSI_OPS"; then
   # If this shell supports suffix pattern removal, then use it to avoid
   # forking. Hide the definitions single quotes in case the shell chokes
   # on unsupported syntax...
   _b='func_basename_result=${1##*/}'
   _d='case $1 in
         */*) func_dirname_result=${1%/*}$2 ;;
         *  ) func_dirname_result=$3        ;;
       esac'
 
 else
   # ...otherwise fall back to using sed.
   _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
   _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
       if test "X$func_dirname_result" = "X$1"; then
         func_dirname_result=$3
       else
         func_append func_dirname_result "$2"
       fi'
 fi
 
 eval 'func_basename ()
 {
     $debug_cmd
 
     '"$_b"'
 }'
 
 
 # func_dirname FILE APPEND NONDIR_REPLACEMENT
 # -------------------------------------------
 # Compute the dirname of FILE.  If nonempty, add APPEND to the result,
 # otherwise set result to NONDIR_REPLACEMENT.
 eval 'func_dirname ()
 {
     $debug_cmd
 
     '"$_d"'
 }'
 
 
 # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
 # --------------------------------------------------------
 # Perform func_basename and func_dirname in a single function
 # call:
 #   dirname:  Compute the dirname of FILE.  If nonempty,
 #             add APPEND to the result, otherwise set result
 #             to NONDIR_REPLACEMENT.
 #             value returned in "$func_dirname_result"
 #   basename: Compute filename of FILE.
 #             value retuned in "$func_basename_result"
 # For efficiency, we do not delegate to the functions above but instead
 # duplicate the functionality here.
 eval 'func_dirname_and_basename ()
 {
     $debug_cmd
 
     '"$_b"'
     '"$_d"'
 }'
 
 
 # func_echo ARG...
 # ----------------
 # Echo program name prefixed message.
 func_echo ()
 {
     $debug_cmd
 
     _G_message=$*
 
     func_echo_IFS=$IFS
     IFS=$nl
     for _G_line in $_G_message; do
       IFS=$func_echo_IFS
       $ECHO "$progname: $_G_line"
     done
     IFS=$func_echo_IFS
 }
 
 
 # func_echo_all ARG...
 # --------------------
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
     $ECHO "$*"
 }
 
 
 # func_echo_infix_1 INFIX ARG...
 # ------------------------------
 # Echo program name, followed by INFIX on the first line, with any
 # additional lines not showing INFIX.
 func_echo_infix_1 ()
 {
     $debug_cmd
 
     $require_term_colors
 
     _G_infix=$1; shift
     _G_indent=$_G_infix
     _G_prefix="$progname: $_G_infix: "
     _G_message=$*
 
     # Strip color escape sequences before counting printable length
     for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
     do
       test -n "$_G_tc" && {
         _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
         _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
       }
     done
     _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
 
     func_echo_infix_1_IFS=$IFS
     IFS=$nl
     for _G_line in $_G_message; do
       IFS=$func_echo_infix_1_IFS
       $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
       _G_prefix=$_G_indent
     done
     IFS=$func_echo_infix_1_IFS
 }
 
 
 # func_error ARG...
 # -----------------
 # Echo program name prefixed message to standard error.
 func_error ()
 {
     $debug_cmd
 
     $require_term_colors
 
     func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
 }
 
 
 # func_fatal_error ARG...
 # -----------------------
 # Echo program name prefixed message to standard error, and exit.
 func_fatal_error ()
 {
     $debug_cmd
 
     func_error "$*"
     exit $EXIT_FAILURE
 }
 
 
 # func_grep EXPRESSION FILENAME
 # -----------------------------
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
     $debug_cmd
 
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
 # func_len STRING
 # ---------------
 # Set func_len_result to the length of STRING. STRING may not
 # start with a hyphen.
   test -z "$_G_HAVE_XSI_OPS" \
     && (eval 'x=a/b/c;
       test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
     && _G_HAVE_XSI_OPS=yes
 
 if test yes = "$_G_HAVE_XSI_OPS"; then
   eval 'func_len ()
   {
     $debug_cmd
 
     func_len_result=${#1}
   }'
 else
   func_len ()
   {
     $debug_cmd
 
     func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
   }
 fi
 
 
 # func_mkdir_p DIRECTORY-PATH
 # ---------------------------
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
     $debug_cmd
 
     _G_directory_path=$1
     _G_dir_list=
 
     if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
 
       # Protect directory names starting with '-'
       case $_G_directory_path in
         -*) _G_directory_path=./$_G_directory_path ;;
       esac
 
       # While some portion of DIR does not yet exist...
       while test ! -d "$_G_directory_path"; do
         # ...make a list in topmost first order.  Use a colon delimited
 	# list incase some portion of path contains whitespace.
         _G_dir_list=$_G_directory_path:$_G_dir_list
 
         # If the last portion added has no slash in it, the list is done
         case $_G_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
         _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
       done
       _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
 
       func_mkdir_p_IFS=$IFS; IFS=:
       for _G_dir in $_G_dir_list; do
 	IFS=$func_mkdir_p_IFS
         # mkdir can fail with a 'File exist' error if two processes
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
         $MKDIR "$_G_dir" 2>/dev/null || :
       done
       IFS=$func_mkdir_p_IFS
 
       # Bail out if we (or some other process) failed to create a directory.
       test -d "$_G_directory_path" || \
         func_fatal_error "Failed to create '$1'"
     fi
 }
 
 
 # func_mktempdir [BASENAME]
 # -------------------------
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
 # given, BASENAME is the basename for that directory.
 func_mktempdir ()
 {
     $debug_cmd
 
     _G_template=${TMPDIR-/tmp}/${1-$progname}
 
     if test : = "$opt_dry_run"; then
       # Return a directory name, but don't create it in dry-run mode
       _G_tmpdir=$_G_template-$$
     else
 
       # If mktemp works, use that first and foremost
       _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
 
       if test ! -d "$_G_tmpdir"; then
         # Failing that, at least try and use $RANDOM to avoid a race
         _G_tmpdir=$_G_template-${RANDOM-0}$$
 
         func_mktempdir_umask=`umask`
         umask 0077
         $MKDIR "$_G_tmpdir"
         umask $func_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
       test -d "$_G_tmpdir" || \
         func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
     fi
 
     $ECHO "$_G_tmpdir"
 }
 
 
 # func_normal_abspath PATH
 # ------------------------
 # Remove doubled-up and trailing slashes, "." path components,
 # and cancel out any ".." path components in PATH after making
 # it an absolute path.
 func_normal_abspath ()
 {
     $debug_cmd
 
     # These SED scripts presuppose an absolute path with a trailing slash.
     _G_pathcar='s|^/\([^/]*\).*$|\1|'
     _G_pathcdr='s|^/[^/]*||'
     _G_removedotparts=':dotsl
 		s|/\./|/|g
 		t dotsl
 		s|/\.$|/|'
     _G_collapseslashes='s|/\{1,\}|/|g'
     _G_finalslash='s|/*$|/|'
 
     # Start from root dir and reassemble the path.
     func_normal_abspath_result=
     func_normal_abspath_tpath=$1
     func_normal_abspath_altnamespace=
     case $func_normal_abspath_tpath in
       "")
         # Empty path, that just means $cwd.
         func_stripname '' '/' "`pwd`"
         func_normal_abspath_result=$func_stripname_result
         return
         ;;
       # The next three entries are used to spot a run of precisely
       # two leading slashes without using negated character classes;
       # we take advantage of case's first-match behaviour.
       ///*)
         # Unusual form of absolute path, do nothing.
         ;;
       //*)
         # Not necessarily an ordinary path; POSIX reserves leading '//'
         # and for example Cygwin uses it to access remote file shares
         # over CIFS/SMB, so we conserve a leading double slash if found.
         func_normal_abspath_altnamespace=/
         ;;
       /*)
         # Absolute path, do nothing.
         ;;
       *)
         # Relative path, prepend $cwd.
         func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
         ;;
     esac
 
     # Cancel out all the simple stuff to save iterations.  We also want
     # the path to end with a slash for ease of parsing, so make sure
     # there is one (and only one) here.
     func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
           -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
     while :; do
       # Processed it all yet?
       if test / = "$func_normal_abspath_tpath"; then
         # If we ascended to the root using ".." the result may be empty now.
         if test -z "$func_normal_abspath_result"; then
           func_normal_abspath_result=/
         fi
         break
       fi
       func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
           -e "$_G_pathcar"`
       func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
           -e "$_G_pathcdr"`
       # Figure out what to do with it
       case $func_normal_abspath_tcomponent in
         "")
           # Trailing empty path component, ignore it.
           ;;
         ..)
           # Parent dir; strip last assembled component from result.
           func_dirname "$func_normal_abspath_result"
           func_normal_abspath_result=$func_dirname_result
           ;;
         *)
           # Actual path component, append it.
           func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
           ;;
       esac
     done
     # Restore leading double-slash if one was found on entry.
     func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
 }
 
 
 # func_notquiet ARG...
 # --------------------
 # Echo program name prefixed message only when not in quiet mode.
 func_notquiet ()
 {
     $debug_cmd
 
     $opt_quiet || func_echo ${1+"$@"}
 
     # A bug in bash halts the script if the last line of a function
     # fails when set -e is in force, so we need another command to
     # work around that:
     :
 }
 
 
 # func_relative_path SRCDIR DSTDIR
 # --------------------------------
 # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
 func_relative_path ()
 {
     $debug_cmd
 
     func_relative_path_result=
     func_normal_abspath "$1"
     func_relative_path_tlibdir=$func_normal_abspath_result
     func_normal_abspath "$2"
     func_relative_path_tbindir=$func_normal_abspath_result
 
     # Ascend the tree starting from libdir
     while :; do
       # check if we have found a prefix of bindir
       case $func_relative_path_tbindir in
         $func_relative_path_tlibdir)
           # found an exact match
           func_relative_path_tcancelled=
           break
           ;;
         $func_relative_path_tlibdir*)
           # found a matching prefix
           func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
           func_relative_path_tcancelled=$func_stripname_result
           if test -z "$func_relative_path_result"; then
             func_relative_path_result=.
           fi
           break
           ;;
         *)
           func_dirname $func_relative_path_tlibdir
           func_relative_path_tlibdir=$func_dirname_result
           if test -z "$func_relative_path_tlibdir"; then
             # Have to descend all the way to the root!
             func_relative_path_result=../$func_relative_path_result
             func_relative_path_tcancelled=$func_relative_path_tbindir
             break
           fi
           func_relative_path_result=../$func_relative_path_result
           ;;
       esac
     done
 
     # Now calculate path; take care to avoid doubling-up slashes.
     func_stripname '' '/' "$func_relative_path_result"
     func_relative_path_result=$func_stripname_result
     func_stripname '/' '/' "$func_relative_path_tcancelled"
     if test -n "$func_stripname_result"; then
       func_append func_relative_path_result "/$func_stripname_result"
     fi
 
     # Normalisation. If bindir is libdir, return '.' else relative path.
     if test -n "$func_relative_path_result"; then
       func_stripname './' '' "$func_relative_path_result"
       func_relative_path_result=$func_stripname_result
     fi
 
     test -n "$func_relative_path_result" || func_relative_path_result=.
 
     :
 }
 
 
 # func_quote_for_eval ARG...
 # --------------------------
 # Aesthetically quote ARGs to be evaled later.
 # This function returns two values:
 #   i) func_quote_for_eval_result
 #      double-quoted, suitable for a subsequent eval
 #  ii) func_quote_for_eval_unquoted_result
 #      has all characters that are still active within double
 #      quotes backslashified.
 func_quote_for_eval ()
 {
     $debug_cmd
 
     func_quote_for_eval_unquoted_result=
     func_quote_for_eval_result=
     while test 0 -lt $#; do
       case $1 in
         *[\\\`\"\$]*)
 	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
         *)
           _G_unquoted_arg=$1 ;;
       esac
       if test -n "$func_quote_for_eval_unquoted_result"; then
 	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
       else
         func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
       fi
 
       case $_G_unquoted_arg in
         # Double-quote args containing shell metacharacters to delay
         # word splitting, command substitution and variable expansion
         # for a subsequent eval.
         # Many Bourne shells cannot handle close brackets correctly
         # in scan sets, so we specify it separately.
         *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
           _G_quoted_arg=\"$_G_unquoted_arg\"
           ;;
         *)
           _G_quoted_arg=$_G_unquoted_arg
 	  ;;
       esac
 
       if test -n "$func_quote_for_eval_result"; then
 	func_append func_quote_for_eval_result " $_G_quoted_arg"
       else
         func_append func_quote_for_eval_result "$_G_quoted_arg"
       fi
       shift
     done
 }
 
 
 # func_quote_for_expand ARG
 # -------------------------
 # Aesthetically quote ARG to be evaled later; same as above,
 # but do not quote variable references.
 func_quote_for_expand ()
 {
     $debug_cmd
 
     case $1 in
       *[\\\`\"]*)
 	_G_arg=`$ECHO "$1" | $SED \
 	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
       *)
         _G_arg=$1 ;;
     esac
 
     case $_G_arg in
       # Double-quote args containing shell metacharacters to delay
       # word splitting and command substitution for a subsequent eval.
       # Many Bourne shells cannot handle close brackets correctly
       # in scan sets, so we specify it separately.
       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
         _G_arg=\"$_G_arg\"
         ;;
     esac
 
     func_quote_for_expand_result=$_G_arg
 }
 
 
 # func_stripname PREFIX SUFFIX NAME
 # ---------------------------------
 # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
 # PREFIX and SUFFIX must not contain globbing or regex special
 # characters, hashes, percent signs, but SUFFIX may contain a leading
 # dot (in which case that matches only a dot).
 if test yes = "$_G_HAVE_XSI_OPS"; then
   eval 'func_stripname ()
   {
     $debug_cmd
 
     # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
     # positional parameters, so assign one to ordinary variable first.
     func_stripname_result=$3
     func_stripname_result=${func_stripname_result#"$1"}
     func_stripname_result=${func_stripname_result%"$2"}
   }'
 else
   func_stripname ()
   {
     $debug_cmd
 
     case $2 in
       .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
       *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
     esac
   }
 fi
 
 
 # func_show_eval CMD [FAIL_EXP]
 # -----------------------------
 # Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
 # not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
 # is given, then evaluate it.
 func_show_eval ()
 {
     $debug_cmd
 
     _G_cmd=$1
     _G_fail_exp=${2-':'}
 
     func_quote_for_expand "$_G_cmd"
     eval "func_notquiet $func_quote_for_expand_result"
 
     $opt_dry_run || {
       eval "$_G_cmd"
       _G_status=$?
       if test 0 -ne "$_G_status"; then
 	eval "(exit $_G_status); $_G_fail_exp"
       fi
     }
 }
 
 
 # func_show_eval_locale CMD [FAIL_EXP]
 # ------------------------------------
 # Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
 # not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
 # is given, then evaluate it.  Use the saved locale for evaluation.
 func_show_eval_locale ()
 {
     $debug_cmd
 
     _G_cmd=$1
     _G_fail_exp=${2-':'}
 
     $opt_quiet || {
       func_quote_for_expand "$_G_cmd"
       eval "func_echo $func_quote_for_expand_result"
     }
 
     $opt_dry_run || {
       eval "$_G_user_locale
 	    $_G_cmd"
       _G_status=$?
       eval "$_G_safe_locale"
       if test 0 -ne "$_G_status"; then
 	eval "(exit $_G_status); $_G_fail_exp"
       fi
     }
 }
 
 
 # func_tr_sh
 # ----------
 # Turn $1 into a string suitable for a shell variable name.
 # Result is stored in $func_tr_sh_result.  All characters
 # not in the set a-zA-Z0-9_ are replaced with '_'. Further,
 # if $1 begins with a digit, a '_' is prepended as well.
 func_tr_sh ()
 {
     $debug_cmd
 
     case $1 in
     [0-9]* | *[!a-zA-Z0-9_]*)
       func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
       ;;
     * )
       func_tr_sh_result=$1
       ;;
     esac
 }
 
 
 # func_verbose ARG...
 # -------------------
 # Echo program name prefixed message in verbose mode only.
 func_verbose ()
 {
     $debug_cmd
 
     $opt_verbose && func_echo "$*"
 
     :
 }
 
 
 # func_warn_and_continue ARG...
 # -----------------------------
 # Echo program name prefixed warning message to standard error.
 func_warn_and_continue ()
 {
     $debug_cmd
 
     $require_term_colors
 
     func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
 }
 
 
 # func_warning CATEGORY ARG...
 # ----------------------------
 # Echo program name prefixed warning message to standard error. Warning
 # messages can be filtered according to CATEGORY, where this function
 # elides messages where CATEGORY is not listed in the global variable
 # 'opt_warning_types'.
 func_warning ()
 {
     $debug_cmd
 
     # CATEGORY must be in the warning_categories list!
     case " $warning_categories " in
       *" $1 "*) ;;
       *) func_internal_error "invalid warning category '$1'" ;;
     esac
 
     _G_category=$1
     shift
 
     case " $opt_warning_types " in
       *" $_G_category "*) $warning_func ${1+"$@"} ;;
     esac
 }
 
 
 # func_sort_ver VER1 VER2
 # -----------------------
 # 'sort -V' is not generally available.
 # Note this deviates from the version comparison in automake
 # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
 # but this should suffice as we won't be specifying old
 # version formats or redundant trailing .0 in bootstrap.conf.
 # If we did want full compatibility then we should probably
 # use m4_version_compare from autoconf.
 func_sort_ver ()
 {
     $debug_cmd
 
     printf '%s\n%s\n' "$1" "$2" \
       | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
 }
 
 # func_lt_ver PREV CURR
 # ---------------------
 # Return true if PREV and CURR are in the correct order according to
 # func_sort_ver, otherwise false.  Use it like this:
 #
 #  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
 func_lt_ver ()
 {
     $debug_cmd
 
     test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
 }
 
 
 # Local variables:
 # mode: shell-script
 # sh-indentation: 2
 # eval: (add-hook 'before-save-hook 'time-stamp)
 # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
 # time-stamp-time-zone: "UTC"
 # End:
 #! /bin/sh
 
 # Set a version string for this script.
 scriptversion=2014-01-07.03; # UTC
 
 # A portable, pluggable option parser for Bourne shell.
 # Written by Gary V. Vaughan, 2010
 
 # Copyright (C) 2010-2015 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.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # Please report bugs or propose patches to gary@gnu.org.
 
 
 ## ------ ##
 ## Usage. ##
 ## ------ ##
 
 # This file is a library for parsing options in your shell scripts along
 # with assorted other useful supporting features that you can make use
 # of too.
 #
 # For the simplest scripts you might need only:
 #
 #   #!/bin/sh
 #   . relative/path/to/funclib.sh
 #   . relative/path/to/options-parser
 #   scriptversion=1.0
 #   func_options ${1+"$@"}
 #   eval set dummy "$func_options_result"; shift
 #   ...rest of your script...
 #
 # In order for the '--version' option to work, you will need to have a
 # suitably formatted comment like the one at the top of this file
 # starting with '# Written by ' and ending with '# warranty; '.
 #
 # For '-h' and '--help' to work, you will also need a one line
 # description of your script's purpose in a comment directly above the
 # '# Written by ' line, like the one at the top of this file.
 #
 # The default options also support '--debug', which will turn on shell
 # execution tracing (see the comment above debug_cmd below for another
 # use), and '--verbose' and the func_verbose function to allow your script
 # to display verbose messages only when your user has specified
 # '--verbose'.
 #
 # After sourcing this file, you can plug processing for additional
 # options by amending the variables from the 'Configuration' section
 # below, and following the instructions in the 'Option parsing'
 # section further down.
 
 ## -------------- ##
 ## Configuration. ##
 ## -------------- ##
 
 # You should override these variables in your script after sourcing this
 # file so that they reflect the customisations you have added to the
 # option parser.
 
 # The usage line for option parsing errors and the start of '-h' and
 # '--help' output messages. You can embed shell variables for delayed
 # expansion at the time the message is displayed, but you will need to
 # quote other shell meta-characters carefully to prevent them being
 # expanded when the contents are evaled.
 usage='$progpath [OPTION]...'
 
 # Short help message in response to '-h' and '--help'.  Add to this or
 # override it after sourcing this library to reflect the full set of
 # options your script accepts.
 usage_message="\
        --debug        enable verbose shell tracing
    -W, --warnings=CATEGORY
                       report the warnings falling in CATEGORY [all]
    -v, --verbose      verbosely report processing
        --version      print version information and exit
    -h, --help         print short or long help message and exit
 "
 
 # Additional text appended to 'usage_message' in response to '--help'.
 long_help_message="
 Warning categories include:
        'all'          show all warnings
        'none'         turn off all the warnings
        'error'        warnings are treated as fatal errors"
 
 # Help message printed before fatal option parsing errors.
 fatal_help="Try '\$progname --help' for more information."
 
 
 
 ## ------------------------- ##
 ## Hook function management. ##
 ## ------------------------- ##
 
 # This section contains functions for adding, removing, and running hooks
 # to the main code.  A hook is just a named list of of function, that can
 # be run in order later on.
 
 # func_hookable FUNC_NAME
 # -----------------------
 # Declare that FUNC_NAME will run hooks added with
 # 'func_add_hook FUNC_NAME ...'.
 func_hookable ()
 {
     $debug_cmd
 
     func_append hookable_fns " $1"
 }
 
 
 # func_add_hook FUNC_NAME HOOK_FUNC
 # ---------------------------------
 # Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
 # first have been declared "hookable" by a call to 'func_hookable'.
 func_add_hook ()
 {
     $debug_cmd
 
     case " $hookable_fns " in
       *" $1 "*) ;;
       *) func_fatal_error "'$1' does not accept hook functions." ;;
     esac
 
     eval func_append ${1}_hooks '" $2"'
 }
 
 
 # func_remove_hook FUNC_NAME HOOK_FUNC
 # ------------------------------------
 # Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
 func_remove_hook ()
 {
     $debug_cmd
 
     eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
 }
 
 
 # func_run_hooks FUNC_NAME [ARG]...
 # ---------------------------------
 # Run all hook functions registered to FUNC_NAME.
 # It is assumed that the list of hook functions contains nothing more
 # than a whitespace-delimited list of legal shell function names, and
 # no effort is wasted trying to catch shell meta-characters or preserve
 # whitespace.
 func_run_hooks ()
 {
     $debug_cmd
 
     case " $hookable_fns " in
       *" $1 "*) ;;
       *) func_fatal_error "'$1' does not support hook funcions.n" ;;
     esac
 
     eval _G_hook_fns=\$$1_hooks; shift
 
     for _G_hook in $_G_hook_fns; do
       eval $_G_hook '"$@"'
 
       # store returned options list back into positional
       # parameters for next 'cmd' execution.
       eval _G_hook_result=\$${_G_hook}_result
       eval set dummy "$_G_hook_result"; shift
     done
 
     func_quote_for_eval ${1+"$@"}
     func_run_hooks_result=$func_quote_for_eval_result
 }
 
 
 
 ## --------------- ##
 ## Option parsing. ##
 ## --------------- ##
 
 # In order to add your own option parsing hooks, you must accept the
 # full positional parameter list in your hook function, remove any
 # options that you action, and then pass back the remaining unprocessed
 # options in '<hooked_function_name>_result', escaped suitably for
 # 'eval'.  Like this:
 #
 #    my_options_prep ()
 #    {
 #        $debug_cmd
 #
 #        # Extend the existing usage message.
 #        usage_message=$usage_message'
 #      -s, --silent       don'\''t print informational messages
 #    '
 #
 #        func_quote_for_eval ${1+"$@"}
 #        my_options_prep_result=$func_quote_for_eval_result
 #    }
 #    func_add_hook func_options_prep my_options_prep
 #
 #
 #    my_silent_option ()
 #    {
 #        $debug_cmd
 #
 #        # Note that for efficiency, we parse as many options as we can
 #        # recognise in a loop before passing the remainder back to the
 #        # caller on the first unrecognised argument we encounter.
 #        while test $# -gt 0; do
 #          opt=$1; shift
 #          case $opt in
 #            --silent|-s) opt_silent=: ;;
 #            # Separate non-argument short options:
 #            -s*)         func_split_short_opt "$_G_opt"
 #                         set dummy "$func_split_short_opt_name" \
 #                             "-$func_split_short_opt_arg" ${1+"$@"}
 #                         shift
 #                         ;;
 #            *)            set dummy "$_G_opt" "$*"; shift; break ;;
 #          esac
 #        done
 #
 #        func_quote_for_eval ${1+"$@"}
 #        my_silent_option_result=$func_quote_for_eval_result
 #    }
 #    func_add_hook func_parse_options my_silent_option
 #
 #
 #    my_option_validation ()
 #    {
 #        $debug_cmd
 #
 #        $opt_silent && $opt_verbose && func_fatal_help "\
 #    '--silent' and '--verbose' options are mutually exclusive."
 #
 #        func_quote_for_eval ${1+"$@"}
 #        my_option_validation_result=$func_quote_for_eval_result
 #    }
 #    func_add_hook func_validate_options my_option_validation
 #
 # You'll alse need to manually amend $usage_message to reflect the extra
 # options you parse.  It's preferable to append if you can, so that
 # multiple option parsing hooks can be added safely.
 
 
 # func_options [ARG]...
 # ---------------------
 # All the functions called inside func_options are hookable. See the
 # individual implementations for details.
 func_hookable func_options
 func_options ()
 {
     $debug_cmd
 
     func_options_prep ${1+"$@"}
     eval func_parse_options \
         ${func_options_prep_result+"$func_options_prep_result"}
     eval func_validate_options \
         ${func_parse_options_result+"$func_parse_options_result"}
 
     eval func_run_hooks func_options \
         ${func_validate_options_result+"$func_validate_options_result"}
 
     # save modified positional parameters for caller
     func_options_result=$func_run_hooks_result
 }
 
 
 # func_options_prep [ARG]...
 # --------------------------
 # All initialisations required before starting the option parse loop.
 # Note that when calling hook functions, we pass through the list of
 # positional parameters.  If a hook function modifies that list, and
 # needs to propogate that back to rest of this script, then the complete
 # modified list must be put in 'func_run_hooks_result' before
 # returning.
 func_hookable func_options_prep
 func_options_prep ()
 {
     $debug_cmd
 
     # Option defaults:
     opt_verbose=false
     opt_warning_types=
 
     func_run_hooks func_options_prep ${1+"$@"}
 
     # save modified positional parameters for caller
     func_options_prep_result=$func_run_hooks_result
 }
 
 
 # func_parse_options [ARG]...
 # ---------------------------
 # The main option parsing loop.
 func_hookable func_parse_options
 func_parse_options ()
 {
     $debug_cmd
 
     func_parse_options_result=
 
     # this just eases exit handling
     while test $# -gt 0; do
       # Defer to hook functions for initial option parsing, so they
       # get priority in the event of reusing an option name.
       func_run_hooks func_parse_options ${1+"$@"}
 
       # Adjust func_parse_options positional parameters to match
       eval set dummy "$func_run_hooks_result"; shift
 
       # Break out of the loop if we already parsed every option.
       test $# -gt 0 || break
 
       _G_opt=$1
       shift
       case $_G_opt in
         --debug|-x)   debug_cmd='set -x'
                       func_echo "enabling shell trace mode"
                       $debug_cmd
                       ;;
 
         --no-warnings|--no-warning|--no-warn)
                       set dummy --warnings none ${1+"$@"}
                       shift
 		      ;;
 
         --warnings|--warning|-W)
                       test $# = 0 && func_missing_arg $_G_opt && break
                       case " $warning_categories $1" in
                         *" $1 "*)
                           # trailing space prevents matching last $1 above
                           func_append_uniq opt_warning_types " $1"
                           ;;
                         *all)
                           opt_warning_types=$warning_categories
                           ;;
                         *none)
                           opt_warning_types=none
                           warning_func=:
                           ;;
                         *error)
                           opt_warning_types=$warning_categories
                           warning_func=func_fatal_error
                           ;;
                         *)
                           func_fatal_error \
                              "unsupported warning category: '$1'"
                           ;;
                       esac
                       shift
                       ;;
 
         --verbose|-v) opt_verbose=: ;;
         --version)    func_version ;;
         -\?|-h)       func_usage ;;
         --help)       func_help ;;
 
 	# Separate optargs to long options (plugins may need this):
 	--*=*)        func_split_equals "$_G_opt"
 	              set dummy "$func_split_equals_lhs" \
                           "$func_split_equals_rhs" ${1+"$@"}
                       shift
                       ;;
 
        # Separate optargs to short options:
         -W*)
                       func_split_short_opt "$_G_opt"
                       set dummy "$func_split_short_opt_name" \
                           "$func_split_short_opt_arg" ${1+"$@"}
                       shift
                       ;;
 
         # Separate non-argument short options:
         -\?*|-h*|-v*|-x*)
                       func_split_short_opt "$_G_opt"
                       set dummy "$func_split_short_opt_name" \
                           "-$func_split_short_opt_arg" ${1+"$@"}
                       shift
                       ;;
 
         --)           break ;;
         -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
         *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
       esac
     done
 
     # save modified positional parameters for caller
     func_quote_for_eval ${1+"$@"}
     func_parse_options_result=$func_quote_for_eval_result
 }
 
 
 # func_validate_options [ARG]...
 # ------------------------------
 # Perform any sanity checks on option settings and/or unconsumed
 # arguments.
 func_hookable func_validate_options
 func_validate_options ()
 {
     $debug_cmd
 
     # Display all warnings if -W was not given.
     test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
 
     func_run_hooks func_validate_options ${1+"$@"}
 
     # Bail if the options were screwed!
     $exit_cmd $EXIT_FAILURE
 
     # save modified positional parameters for caller
     func_validate_options_result=$func_run_hooks_result
 }
 
 
 
 ## ----------------- ##
 ## Helper functions. ##
 ## ----------------- ##
 
 # This section contains the helper functions used by the rest of the
 # hookable option parser framework in ascii-betical order.
 
 
 # func_fatal_help ARG...
 # ----------------------
 # Echo program name prefixed message to standard error, followed by
 # a help hint, and exit.
 func_fatal_help ()
 {
     $debug_cmd
 
     eval \$ECHO \""Usage: $usage"\"
     eval \$ECHO \""$fatal_help"\"
     func_error ${1+"$@"}
     exit $EXIT_FAILURE
 }
 
 
 # func_help
 # ---------
 # Echo long help message to standard output and exit.
 func_help ()
 {
     $debug_cmd
 
     func_usage_message
     $ECHO "$long_help_message"
     exit 0
 }
 
 
 # func_missing_arg ARGNAME
 # ------------------------
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
     $debug_cmd
 
     func_error "Missing argument for '$1'."
     exit_cmd=exit
 }
 
 
 # func_split_equals STRING
 # ------------------------
 # Set func_split_equals_lhs and func_split_equals_rhs shell variables after
 # splitting STRING at the '=' sign.
 test -z "$_G_HAVE_XSI_OPS" \
     && (eval 'x=a/b/c;
       test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
     && _G_HAVE_XSI_OPS=yes
 
 if test yes = "$_G_HAVE_XSI_OPS"
 then
   # This is an XSI compatible shell, allowing a faster implementation...
   eval 'func_split_equals ()
   {
       $debug_cmd
 
       func_split_equals_lhs=${1%%=*}
       func_split_equals_rhs=${1#*=}
       test "x$func_split_equals_lhs" = "x$1" \
         && func_split_equals_rhs=
   }'
 else
   # ...otherwise fall back to using expr, which is often a shell builtin.
   func_split_equals ()
   {
       $debug_cmd
 
       func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
       func_split_equals_rhs=
       test "x$func_split_equals_lhs" = "x$1" \
         || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
   }
 fi #func_split_equals
 
 
 # func_split_short_opt SHORTOPT
 # -----------------------------
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
 if test yes = "$_G_HAVE_XSI_OPS"
 then
   # This is an XSI compatible shell, allowing a faster implementation...
   eval 'func_split_short_opt ()
   {
       $debug_cmd
 
       func_split_short_opt_arg=${1#??}
       func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
   }'
 else
   # ...otherwise fall back to using expr, which is often a shell builtin.
   func_split_short_opt ()
   {
       $debug_cmd
 
       func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
       func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
   }
 fi #func_split_short_opt
 
 
 # func_usage
 # ----------
 # Echo short help message to standard output and exit.
 func_usage ()
 {
     $debug_cmd
 
     func_usage_message
     $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
     exit 0
 }
 
 
 # func_usage_message
 # ------------------
 # Echo short help message to standard output.
 func_usage_message ()
 {
     $debug_cmd
 
     eval \$ECHO \""Usage: $usage"\"
     echo
     $SED -n 's|^# ||
         /^Written by/{
           x;p;x
         }
 	h
 	/^Written by/q' < "$progpath"
     echo
     eval \$ECHO \""$usage_message"\"
 }
 
 
 # func_version
 # ------------
 # Echo version message to standard output and exit.
 func_version ()
 {
     $debug_cmd
 
     printf '%s\n' "$progname $scriptversion"
     $SED -n '
         /(C)/!b go
         :more
         /\./!{
           N
           s|\n# | |
           b more
         }
         :go
         /^# Written by /,/# warranty; / {
           s|^# ||
           s|^# *$||
           s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
           p
         }
         /^# Written by / {
           s|^# ||
           p
         }
         /^warranty; /q' < "$progpath"
 
     exit $?
 }
 
 
 # Local variables:
 # mode: shell-script
 # sh-indentation: 2
 # eval: (add-hook 'before-save-hook 'time-stamp)
 # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
 # time-stamp-time-zone: "UTC"
 # End:
 
 # Set a version string.
 scriptversion='(GNU libtool) 2.4.6'
 
 
 # func_echo ARG...
 # ----------------
 # Libtool also displays the current mode in messages, so override
 # funclib.sh func_echo with this custom definition.
 func_echo ()
 {
     $debug_cmd
 
     _G_message=$*
 
     func_echo_IFS=$IFS
     IFS=$nl
     for _G_line in $_G_message; do
       IFS=$func_echo_IFS
       $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
     done
     IFS=$func_echo_IFS
 }
 
 
 # func_warning ARG...
 # -------------------
 # Libtool warnings are not categorized, so override funclib.sh
 # func_warning with this simpler definition.
 func_warning ()
 {
     $debug_cmd
 
     $warning_func ${1+"$@"}
 }
 
 
 ## ---------------- ##
 ## Options parsing. ##
 ## ---------------- ##
 
 # Hook in the functions to make sure our own options are parsed during
 # the option parsing loop.
 
 usage='$progpath [OPTION]... [MODE-ARG]...'
 
 # Short help message in response to '-h'.
 usage_message="Options:
        --config             show all configuration variables
        --debug              enable verbose shell tracing
    -n, --dry-run            display commands without modifying any files
        --features           display basic configuration information and exit
        --mode=MODE          use operation mode MODE
        --no-warnings        equivalent to '-Wnone'
        --preserve-dup-deps  don't remove duplicate dependency libraries
        --quiet, --silent    don't print informational messages
        --tag=TAG            use configuration variables from tag TAG
    -v, --verbose            print more informational messages than default
        --version            print version information
    -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
    -h, --help, --help-all   print short, long, or detailed help message
 "
 
 # Additional text appended to 'usage_message' in response to '--help'.
 func_help ()
 {
     $debug_cmd
 
     func_usage_message
     $ECHO "$long_help_message
 
 MODE must be one of the following:
 
        clean           remove files from the build directory
        compile         compile a source file into a libtool object
        execute         automatically set library path, then run a program
        finish          complete the installation of libtool libraries
        install         install libraries or executables
        link            create a library or an executable
        uninstall       remove libraries from an installed directory
 
 MODE-ARGS vary depending on the MODE.  When passed as first option,
 '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
 Try '$progname --help --mode=MODE' for a more detailed description of MODE.
 
 When reporting a bug, please describe a test case to reproduce it and
 include the following information:
 
        host-triplet:   $host
        shell:          $SHELL
        compiler:       $LTCC
        compiler flags: $LTCFLAGS
        linker:         $LD (gnu? $with_gnu_ld)
        version:        $progname (GNU libtool) 2.4.6
        automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
        autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
 
 Report bugs to <bug-libtool@gnu.org>.
 GNU libtool home page: <http://www.gnu.org/software/libtool/>.
 General help using GNU software: <http://www.gnu.org/gethelp/>."
     exit 0
 }
 
 
 # func_lo2o OBJECT-NAME
 # ---------------------
 # Transform OBJECT-NAME from a '.lo' suffix to the platform specific
 # object suffix.
 
 lo2o=s/\\.lo\$/.$objext/
 o2lo=s/\\.$objext\$/.lo/
 
 if test yes = "$_G_HAVE_XSI_OPS"; then
   eval 'func_lo2o ()
   {
     case $1 in
       *.lo) func_lo2o_result=${1%.lo}.$objext ;;
       *   ) func_lo2o_result=$1               ;;
     esac
   }'
 
   # func_xform LIBOBJ-OR-SOURCE
   # ---------------------------
   # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
   # suffix to a '.lo' libtool-object suffix.
   eval 'func_xform ()
   {
     func_xform_result=${1%.*}.lo
   }'
 else
   # ...otherwise fall back to using sed.
   func_lo2o ()
   {
     func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
   }
 
   func_xform ()
   {
     func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
   }
 fi
 
 
 # func_fatal_configuration ARG...
 # -------------------------------
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
     func__fatal_error ${1+"$@"} \
       "See the $PACKAGE documentation for more information." \
       "Fatal configuration error."
 }
 
 
 # func_config
 # -----------
 # Display the configuration for all the tags in this script.
 func_config ()
 {
     re_begincf='^# ### BEGIN LIBTOOL'
     re_endcf='^# ### END LIBTOOL'
 
     # Default configuration.
     $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
 
     # Now print the configurations for the tags.
     for tagname in $taglist; do
       $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
     done
 
     exit $?
 }
 
 
 # func_features
 # -------------
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
     if test yes = "$build_libtool_libs"; then
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
     if test yes = "$build_old_libs"; then
       echo "enable static libraries"
     else
       echo "disable static libraries"
     fi
 
     exit $?
 }
 
 
 # func_enable_tag TAGNAME
 # -----------------------
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
     # Global variable:
     tagname=$1
 
     re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
     re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
     sed_extractcf=/$re_begincf/,/$re_endcf/p
 
     # Validate tagname.
     case $tagname in
       *[!-_A-Za-z0-9,/]*)
         func_fatal_error "invalid tag name: $tagname"
         ;;
     esac
 
     # Don't test for the "default" C tag, as we know it's
     # there but not specially marked.
     case $tagname in
         CC) ;;
     *)
         if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
 	  taglist="$taglist $tagname"
 
 	  # Evaluate the configuration.  Be careful to quote the path
 	  # and the sed script, to avoid splitting on whitespace, but
 	  # also don't use non-portable quotes within backquotes within
 	  # quotes we have to do it in 2 steps:
 	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
 	  eval "$extractedcf"
         else
 	  func_error "ignoring unknown tag $tagname"
         fi
         ;;
     esac
 }
 
 
 # func_check_version_match
 # ------------------------
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
     if test "$package_revision" != "$macro_revision"; then
       if test "$VERSION" != "$macro_version"; then
         if test -z "$macro_version"; then
           cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
         else
           cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
         fi
       else
         cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
       fi
 
       exit $EXIT_MISMATCH
     fi
 }
 
 
 # libtool_options_prep [ARG]...
 # -----------------------------
 # Preparation for options parsed by libtool.
 libtool_options_prep ()
 {
     $debug_mode
 
     # Option defaults:
     opt_config=false
     opt_dlopen=
     opt_dry_run=false
     opt_help=false
     opt_mode=
     opt_preserve_dup_deps=false
     opt_quiet=false
 
     nonopt=
     preserve_args=
 
     # Shorthand for --mode=foo, only valid as the first argument
     case $1 in
     clean|clea|cle|cl)
       shift; set dummy --mode clean ${1+"$@"}; shift
       ;;
     compile|compil|compi|comp|com|co|c)
       shift; set dummy --mode compile ${1+"$@"}; shift
       ;;
     execute|execut|execu|exec|exe|ex|e)
       shift; set dummy --mode execute ${1+"$@"}; shift
       ;;
     finish|finis|fini|fin|fi|f)
       shift; set dummy --mode finish ${1+"$@"}; shift
       ;;
     install|instal|insta|inst|ins|in|i)
       shift; set dummy --mode install ${1+"$@"}; shift
       ;;
     link|lin|li|l)
       shift; set dummy --mode link ${1+"$@"}; shift
       ;;
     uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
       shift; set dummy --mode uninstall ${1+"$@"}; shift
       ;;
     esac
 
     # Pass back the list of options.
     func_quote_for_eval ${1+"$@"}
     libtool_options_prep_result=$func_quote_for_eval_result
 }
 func_add_hook func_options_prep libtool_options_prep
 
 
 # libtool_parse_options [ARG]...
 # ---------------------------------
 # Provide handling for libtool specific options.
 libtool_parse_options ()
 {
     $debug_cmd
 
     # Perform our own loop to consume as many options as possible in
     # each iteration.
     while test $# -gt 0; do
       _G_opt=$1
       shift
       case $_G_opt in
         --dry-run|--dryrun|-n)
                         opt_dry_run=:
                         ;;
 
         --config)       func_config ;;
 
         --dlopen|-dlopen)
                         opt_dlopen="${opt_dlopen+$opt_dlopen
 }$1"
                         shift
                         ;;
 
         --preserve-dup-deps)
                         opt_preserve_dup_deps=: ;;
 
         --features)     func_features ;;
 
         --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
 
         --help)         opt_help=: ;;
 
         --help-all)     opt_help=': help-all' ;;
 
         --mode)         test $# = 0 && func_missing_arg $_G_opt && break
                         opt_mode=$1
                         case $1 in
                           # Valid mode arguments:
                           clean|compile|execute|finish|install|link|relink|uninstall) ;;
 
                           # Catch anything else as an error
                           *) func_error "invalid argument for $_G_opt"
                              exit_cmd=exit
                              break
                              ;;
                         esac
                         shift
                         ;;
 
         --no-silent|--no-quiet)
                         opt_quiet=false
                         func_append preserve_args " $_G_opt"
                         ;;
 
         --no-warnings|--no-warning|--no-warn)
                         opt_warning=false
                         func_append preserve_args " $_G_opt"
                         ;;
 
         --no-verbose)
                         opt_verbose=false
                         func_append preserve_args " $_G_opt"
                         ;;
 
         --silent|--quiet)
                         opt_quiet=:
                         opt_verbose=false
                         func_append preserve_args " $_G_opt"
                         ;;
 
         --tag)          test $# = 0 && func_missing_arg $_G_opt && break
                         opt_tag=$1
                         func_append preserve_args " $_G_opt $1"
                         func_enable_tag "$1"
                         shift
                         ;;
 
         --verbose|-v)   opt_quiet=false
                         opt_verbose=:
                         func_append preserve_args " $_G_opt"
                         ;;
 
 	# An option not handled by this hook function:
         *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
       esac
     done
 
 
     # save modified positional parameters for caller
     func_quote_for_eval ${1+"$@"}
     libtool_parse_options_result=$func_quote_for_eval_result
 }
 func_add_hook func_parse_options libtool_parse_options
 
 
 
 # libtool_validate_options [ARG]...
 # ---------------------------------
 # Perform any sanity checks on option settings and/or unconsumed
 # arguments.
 libtool_validate_options ()
 {
     # save first non-option argument
     if test 0 -lt $#; then
       nonopt=$1
       shift
     fi
 
     # preserve --debug
     test : = "$debug_cmd" || func_append preserve_args " --debug"
 
     case $host in
       # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
       # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
       *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
         # don't eliminate duplications in $postdeps and $predeps
         opt_duplicate_compiler_generated_deps=:
         ;;
       *)
         opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
         ;;
     esac
 
     $opt_help || {
       # Sanity checks first:
       func_check_version_match
 
       test yes != "$build_libtool_libs" \
         && test yes != "$build_old_libs" \
         && func_fatal_configuration "not configured to build any kind of library"
 
       # Darwin sucks
       eval std_shrext=\"$shrext_cmds\"
 
       # Only execute mode is allowed to have -dlopen flags.
       if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
         func_error "unrecognized option '-dlopen'"
         $ECHO "$help" 1>&2
         exit $EXIT_FAILURE
       fi
 
       # Change the help message to a mode-specific one.
       generic_help=$help
       help="Try '$progname --help --mode=$opt_mode' for more information."
     }
 
     # Pass back the unparsed argument list
     func_quote_for_eval ${1+"$@"}
     libtool_validate_options_result=$func_quote_for_eval_result
 }
 func_add_hook func_validate_options libtool_validate_options
 
 
 # Process options as early as possible so that --help and --version
 # can return quickly.
 func_options ${1+"$@"}
 eval set dummy "$func_options_result"; shift
 
 
 
 ## ----------- ##
 ##    Main.    ##
 ## ----------- ##
 
 magic='%%%MAGIC variable%%%'
 magic_exe='%%%MAGIC EXE variable%%%'
 
 # Global variables.
 extracted_archives=
 extracted_serial=0
 
 # If this variable is set in any of the actions, the command in it
 # will be execed at the end.  This prevents here-documents from being
 # left over by shells.
 exec_cmd=
 
 
 # A function that is used when there is no print builtin or printf.
 func_fallback_echo ()
 {
   eval 'cat <<_LTECHO_EOF
 $1
 _LTECHO_EOF'
 }
 
 # func_generated_by_libtool
 # True iff stdin has been generated by Libtool. This function is only
 # a basic sanity check; it will hardly flush out determined imposters.
 func_generated_by_libtool_p ()
 {
   $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
 }
 
 # func_lalib_p file
 # True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
       $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_lalib_unsafe_p file
 # True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
 # fatal anyway.  Works if 'file' does not exist.
 func_lalib_unsafe_p ()
 {
     lalib_p=no
     if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
 	for lalib_p_l in 1 2 3 4
 	do
 	    read lalib_p_line
 	    case $lalib_p_line in
 		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
 	    esac
 	done
 	exec 0<&5 5<&-
     fi
     test yes = "$lalib_p"
 }
 
 # func_ltwrapper_script_p file
 # True iff FILE is a libtool wrapper script
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_ltwrapper_script_p ()
 {
     test -f "$1" &&
       $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_ltwrapper_executable_p file
 # True iff FILE is a libtool wrapper executable
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_ltwrapper_executable_p ()
 {
     func_ltwrapper_exec_suffix=
     case $1 in
     *.exe) ;;
     *) func_ltwrapper_exec_suffix=.exe ;;
     esac
     $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
 }
 
 # func_ltwrapper_scriptname file
 # Assumes file is an ltwrapper_executable
 # uses $file to determine the appropriate filename for a
 # temporary ltwrapper_script.
 func_ltwrapper_scriptname ()
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
     func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
 }
 
 # func_ltwrapper_p file
 # True iff FILE is a libtool wrapper script or wrapper executable
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_ltwrapper_p ()
 {
     func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
 }
 
 
 # func_execute_cmds commands fail_cmd
 # Execute tilde-delimited COMMANDS.
 # If FAIL_CMD is given, eval that upon failure.
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
     $debug_cmd
 
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
       IFS=$sp$nl
       eval cmd=\"$cmd\"
       IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
 }
 
 
 # func_source file
 # Source FILE, adding directory component if necessary.
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
 # 'FILE.' does not work on cygwin managed mounts.
 func_source ()
 {
     $debug_cmd
 
     case $1 in
     */* | *\\*)	. "$1" ;;
     *)		. "./$1" ;;
     esac
 }
 
 
 # func_resolve_sysroot PATH
 # Replace a leading = in PATH with a sysroot.  Store the result into
 # func_resolve_sysroot_result
 func_resolve_sysroot ()
 {
   func_resolve_sysroot_result=$1
   case $func_resolve_sysroot_result in
   =*)
     func_stripname '=' '' "$func_resolve_sysroot_result"
     func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
     ;;
   esac
 }
 
 # func_replace_sysroot PATH
 # If PATH begins with the sysroot, replace it with = and
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
   case $lt_sysroot:$1 in
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
     func_replace_sysroot_result='='$func_stripname_result
     ;;
   *)
     # Including no sysroot.
     func_replace_sysroot_result=$1
     ;;
   esac
 }
 
 # func_infer_tag arg
 # Infer tagged configuration to use if any are available and
 # if one wasn't chosen via the "--tag" command line option.
 # Only attempt this if the compiler in the base compile
 # command doesn't match the default compiler.
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
     $debug_cmd
 
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
 	func_append_quoted CC_quoted "$arg"
       done
       CC_expanded=`func_echo_all $CC`
       CC_quoted_expanded=`func_echo_all $CC_quoted`
       case $@ in
       # Blanks in the command may have been stripped by the calling shell,
       # but not from the CC environment variable when configure was run.
       " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
       " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
       # Blanks at the start of $base_compile will cause this to fail
       # if we don't check for them as well.
       *)
 	for z in $available_tags; do
 	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
 	    # Evaluate the configuration.
 	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
 	    CC_quoted=
 	    for arg in $CC; do
 	      # Double-quote args containing other shell metacharacters.
 	      func_append_quoted CC_quoted "$arg"
 	    done
 	    CC_expanded=`func_echo_all $CC`
 	    CC_quoted_expanded=`func_echo_all $CC_quoted`
 	    case "$@ " in
 	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
 	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
 	      # The compiler in the base compile command matches
 	      # the one in the tagged configuration.
 	      # Assume this is the tagged configuration we want.
 	      tagname=$z
 	      break
 	      ;;
 	    esac
 	  fi
 	done
 	# If $tagname still isn't set, then no tagged configuration
 	# was found and let the user know that the "--tag" command
 	# line option must be used.
 	if test -z "$tagname"; then
 	  func_echo "unable to infer tagged configuration"
 	  func_fatal_error "specify a tag with '--tag'"
 #	else
 #	  func_verbose "using $tagname tagged configuration"
 	fi
 	;;
       esac
     fi
 }
 
 
 
 # func_write_libtool_object output_name pic_name nonpic_name
 # Create a libtool object file (analogous to a ".la" file),
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
     write_libobj=$1
     if test yes = "$build_libtool_libs"; then
       write_lobj=\'$2\'
     else
       write_lobj=none
     fi
 
     if test yes = "$build_old_libs"; then
       write_oldobj=\'$3\'
     else
       write_oldobj=none
     fi
 
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
 # Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
 
 # Name of the PIC object.
 pic_object=$write_lobj
 
 # Name of the non-PIC object
 non_pic_object=$write_oldobj
 
 EOF
       $MV "${write_libobj}T" "$write_libobj"
     }
 }
 
 
 ##################################################
 # FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
 ##################################################
 
 # func_convert_core_file_wine_to_w32 ARG
 # Helper function used by file name conversion functions when $build is *nix,
 # and $host is mingw, cygwin, or some other w32 environment. Relies on a
 # correctly configured wine environment available, with the winepath program
 # in $build's $PATH.
 #
 # ARG is the $build file name to be converted to w32 format.
 # Result is available in $func_convert_core_file_wine_to_w32_result, and will
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
   $debug_cmd
 
   func_convert_core_file_wine_to_w32_result=$1
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
     # command is not found, the shell will set an exit code of 127 and print
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
     if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
         $SED -e "$sed_naive_backslashify"`
     else
       func_convert_core_file_wine_to_w32_result=
     fi
   fi
 }
 # end: func_convert_core_file_wine_to_w32
 
 
 # func_convert_core_path_wine_to_w32 ARG
 # Helper function used by path conversion functions when $build is *nix, and
 # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
 # configured wine environment available, with the winepath program in $build's
 # $PATH. Assumes ARG has no leading or trailing path separator characters.
 #
 # ARG is path to be converted from $build format to win32.
 # Result is available in $func_convert_core_path_wine_to_w32_result.
 # Unconvertible file (directory) names in ARG are skipped; if no directory names
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
   $debug_cmd
 
   # unfortunately, winepath doesn't convert paths, only file names
   func_convert_core_path_wine_to_w32_result=
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
       if test -n "$func_convert_core_file_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
           func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
       fi
     done
     IFS=$oldIFS
   fi
 }
 # end: func_convert_core_path_wine_to_w32
 
 
 # func_cygpath ARGS...
 # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
 # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
 # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
 # (2), returns the Cygwin file name or path in func_cygpath_result (input
 # file name or path is assumed to be in w32 format, as previously converted
 # from $build's *nix or MSYS format). In case (3), returns the w32 file name
 # or path in func_cygpath_result (input file name or path is assumed to be in
 # Cygwin format). Returns an empty string on error.
 #
 # ARGS are passed to cygpath, with the last one being the file name or path to
 # be converted.
 #
 # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
   $debug_cmd
 
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
       # on failure, ensure result is empty
       func_cygpath_result=
     fi
   else
     func_cygpath_result=
     func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
   fi
 }
 #end: func_cygpath
 
 
 # func_convert_core_msys_to_w32 ARG
 # Convert file name or path ARG from MSYS format to w32 format.  Return
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
   $debug_cmd
 
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
     $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
 }
 #end: func_convert_core_msys_to_w32
 
 
 # func_convert_file_check ARG1 ARG2
 # Verify that ARG1 (a file name in $build format) was converted to $host
 # format in ARG2. Otherwise, emit an error message, but continue (resetting
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
   $debug_cmd
 
   if test -z "$2" && test -n "$1"; then
     func_error "Could not determine host file name corresponding to"
     func_error "  '$1'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
     func_to_host_file_result=$1
   fi
 }
 # end func_convert_file_check
 
 
 # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
 # Verify that FROM_PATH (a path in $build format) was converted to $host
 # format in TO_PATH. Otherwise, emit an error message, but continue, resetting
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
   $debug_cmd
 
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
     func_error "  '$3'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
     if test "x$1" != "x$2"; then
       lt_replace_pathsep_chars="s|$1|$2|g"
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
       func_to_host_path_result=$3
     fi
   fi
 }
 # end func_convert_path_check
 
 
 # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
 # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
   $debug_cmd
 
   case $4 in
   $1 ) func_to_host_path_result=$3$func_to_host_path_result
     ;;
   esac
   case $4 in
   $2 ) func_append func_to_host_path_result "$3"
     ;;
   esac
 }
 # end func_convert_path_front_back_pathsep
 
 
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
 # invoked via '$to_host_file_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
 
 
 # func_to_host_file ARG
 # Converts the file name ARG from $build format to $host format. Return result
 # in func_to_host_file_result.
 func_to_host_file ()
 {
   $debug_cmd
 
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
 
 
 # func_to_tool_file ARG LAZY
 # converts the file name ARG from $build format to toolchain format. Return
 # result in func_to_tool_file_result.  If the conversion in use is listed
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
   $debug_cmd
 
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
       ;;
     *)
       $to_tool_file_cmd "$1"
       func_to_tool_file_result=$func_to_host_file_result
       ;;
   esac
 }
 # end func_to_tool_file
 
 
 # func_convert_file_noop ARG
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
   func_to_host_file_result=$1
 }
 # end func_convert_file_noop
 
 
 # func_convert_file_msys_to_w32 ARG
 # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
 # conversion to w32 is not available inside the cwrapper.  Returns result in
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
   $debug_cmd
 
   func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_to_host_file_result=$func_convert_core_msys_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
 # end func_convert_file_msys_to_w32
 
 
 # func_convert_file_cygwin_to_w32 ARG
 # Convert file name ARG from Cygwin to w32 format.  Returns result in
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
   $debug_cmd
 
   func_to_host_file_result=$1
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
     func_to_host_file_result=`cygpath -m "$1"`
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
 # end func_convert_file_cygwin_to_w32
 
 
 # func_convert_file_nix_to_w32 ARG
 # Convert file name ARG from *nix to w32 format.  Requires a wine environment
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
   $debug_cmd
 
   func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
     func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
 # end func_convert_file_nix_to_w32
 
 
 # func_convert_file_msys_to_cygwin ARG
 # Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
   $debug_cmd
 
   func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
     func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
 # end func_convert_file_msys_to_cygwin
 
 
 # func_convert_file_nix_to_cygwin ARG
 # Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
 # in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
   $debug_cmd
 
   func_to_host_file_result=$1
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
     func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
 # end func_convert_file_nix_to_cygwin
 
 
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
 # invoked via '$to_host_path_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
 #
 # Path separators are also converted from $build format to $host format.  If
 # ARG begins or ends with a path separator character, it is preserved (but
 # converted to $host format) on output.
 #
 # All path conversion functions are named using the following convention:
 #   file name conversion function    : func_convert_file_X_to_Y ()
 #   path conversion function         : func_convert_path_X_to_Y ()
 # where, for any given $build/$host combination the 'X_to_Y' value is the
 # same.  If conversion functions are added for new $build/$host combinations,
 # the two new functions must follow this pattern, or func_init_to_host_path_cmd
 # will break.
 
 
 # func_init_to_host_path_cmd
 # Ensures that function "pointer" variable $to_host_path_cmd is set to the
 # appropriate value, based on the value of $to_host_file_cmd.
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
   $debug_cmd
 
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
     to_host_path_cmd=func_convert_path_$func_stripname_result
   fi
 }
 
 
 # func_to_host_path ARG
 # Converts the path ARG from $build format to $host format. Return result
 # in func_to_host_path_result.
 func_to_host_path ()
 {
   $debug_cmd
 
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
 # end func_to_host_path
 
 
 # func_convert_path_noop ARG
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
   func_to_host_path_result=$1
 }
 # end func_convert_path_noop
 
 
 # func_convert_path_msys_to_w32 ARG
 # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
 # conversion to w32 is not available inside the cwrapper.  Returns result in
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
   $debug_cmd
 
   func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
     # and winepath ignores them completely.
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_to_host_path_result=$func_convert_core_msys_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
   fi
 }
 # end func_convert_path_msys_to_w32
 
 
 # func_convert_path_cygwin_to_w32 ARG
 # Convert path ARG from Cygwin to w32 format.  Returns result in
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
   $debug_cmd
 
   func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
   fi
 }
 # end func_convert_path_cygwin_to_w32
 
 
 # func_convert_path_nix_to_w32 ARG
 # Convert path ARG from *nix to w32 format.  Requires a wine environment and
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
   $debug_cmd
 
   func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
   fi
 }
 # end func_convert_path_nix_to_w32
 
 
 # func_convert_path_msys_to_cygwin ARG
 # Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
   $debug_cmd
 
   func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
     func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
   fi
 }
 # end func_convert_path_msys_to_cygwin
 
 
 # func_convert_path_nix_to_cygwin ARG
 # Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
 # a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
   $debug_cmd
 
   func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
     # into '.;' and ';.', and winepath ignores them completely.
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
     func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
   fi
 }
 # end func_convert_path_nix_to_cygwin
 
 
 # func_dll_def_p FILE
 # True iff FILE is a Windows DLL '.def' file.
 # Keep in sync with _LT_DLL_DEF_P in libtool.m4
 func_dll_def_p ()
 {
   $debug_cmd
 
   func_dll_def_p_tmp=`$SED -n \
     -e 's/^[	 ]*//' \
     -e '/^\(;.*\)*$/d' \
     -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
     -e q \
     "$1"`
   test DEF = "$func_dll_def_p_tmp"
 }
 
 
 # func_mode_compile arg...
 func_mode_compile ()
 {
     $debug_cmd
 
     # Get the compilation command and the source file.
     base_compile=
     srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
     libobj=
     later=
     pie_flag=
 
     for arg
     do
       case $arg_mode in
       arg  )
 	# do not "continue".  Instead, add this to base_compile
 	lastarg=$arg
 	arg_mode=normal
 	;;
 
       target )
 	libobj=$arg
 	arg_mode=normal
 	continue
 	;;
 
       normal )
 	# Accept any command-line options.
 	case $arg in
 	-o)
 	  test -n "$libobj" && \
 	    func_fatal_error "you cannot specify '-o' more than once"
 	  arg_mode=target
 	  continue
 	  ;;
 
 	-pie | -fpie | -fPIE)
           func_append pie_flag " $arg"
 	  continue
 	  ;;
 
 	-shared | -static | -prefer-pic | -prefer-non-pic)
 	  func_append later " $arg"
 	  continue
 	  ;;
 
 	-no-suppress)
 	  suppress_opt=no
 	  continue
 	  ;;
 
 	-Xcompiler)
 	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
 	  continue      #  The current "srcfile" will either be retained or
 	  ;;            #  replaced later.  I would guess that would be a bug.
 
 	-Wc,*)
 	  func_stripname '-Wc,' '' "$arg"
 	  args=$func_stripname_result
 	  lastarg=
 	  save_ifs=$IFS; IFS=,
 	  for arg in $args; do
 	    IFS=$save_ifs
 	    func_append_quoted lastarg "$arg"
 	  done
 	  IFS=$save_ifs
 	  func_stripname ' ' '' "$lastarg"
 	  lastarg=$func_stripname_result
 
 	  # Add the arguments to base_compile.
 	  func_append base_compile " $lastarg"
 	  continue
 	  ;;
 
 	*)
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
 	  lastarg=$srcfile
 	  srcfile=$arg
 	  ;;
 	esac  #  case $arg
 	;;
       esac    #  case $arg_mode
 
       # Aesthetically quote the previous argument.
       func_append_quoted base_compile "$lastarg"
     done # for arg
 
     case $arg_mode in
     arg)
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
       func_fatal_error "you must specify a target with '-o'"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
 	func_basename "$srcfile"
 	libobj=$func_basename_result
       }
       ;;
     esac
 
     # Recognize several different file suffixes.
     # If the user specifies -o file.o, it is replaced with file.lo
     case $libobj in
     *.[cCFSifmso] | \
     *.ada | *.adb | *.ads | *.asm | \
     *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
     *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
       func_xform "$libobj"
       libobj=$func_xform_result
       ;;
     esac
 
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
       func_fatal_error "cannot determine name of library object from '$libobj'"
       ;;
     esac
 
     func_infer_tag $base_compile
 
     for arg in $later; do
       case $arg in
       -shared)
 	test yes = "$build_libtool_libs" \
 	  || func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	continue
 	;;
 
       -static)
 	build_libtool_libs=no
 	build_old_libs=yes
 	continue
 	;;
 
       -prefer-pic)
 	pic_mode=yes
 	continue
 	;;
 
       -prefer-non-pic)
 	pic_mode=no
 	continue
 	;;
       esac
     done
 
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
       && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
     objname=$func_basename_result
     xdir=$func_dirname_result
     lobj=$xdir$objdir/$objname
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
     if test yes = "$build_old_libs"; then
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
     fi
 
     # On Cygwin there's no "real" PIC flag so we must build both object types
     case $host_os in
     cygwin* | mingw* | pw32* | os2* | cegcc*)
       pic_mode=default
       ;;
     esac
     if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
     if test no = "$compiler_c_o"; then
       output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
       lockfile=$output_obj.lock
     else
       output_obj=
       need_locks=no
       lockfile=
     fi
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
     if test yes = "$need_locks"; then
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
     elif test warn = "$need_locks"; then
       if test -f "$lockfile"; then
 	$ECHO "\
 *** ERROR, $lockfile exists and contains:
 `cat $lockfile 2>/dev/null`
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
 your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
 	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
       func_append removelist " $output_obj"
       $ECHO "$srcfile" > "$lockfile"
     fi
 
     $opt_dry_run || $RM $removelist
     func_append removelist " $lockfile"
     trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
 
     func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
     srcfile=$func_to_tool_file_result
     func_quote_for_eval "$srcfile"
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
     if test yes = "$build_libtool_libs"; then
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
       if test no != "$pic_mode"; then
 	command="$base_compile $qsrcfile $pic_flag"
       else
 	# Don't build PIC code
 	command="$base_compile $qsrcfile"
       fi
 
       func_mkdir_p "$xdir$objdir"
 
       if test -z "$output_obj"; then
 	# Place PIC objects in $objdir
 	func_append command " -o $lobj"
       fi
 
       func_show_eval_locale "$command"	\
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
       if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
 `cat $lockfile 2>/dev/null`
 
 but it should contain:
 $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
 your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
 	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
 
       # Just move the object if needed, then go on to compile the next one
       if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
 	func_show_eval '$MV "$output_obj" "$lobj"' \
 	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
       fi
 
       # Allow error messages only from the first compilation.
       if test yes = "$suppress_opt"; then
 	suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
     if test yes = "$build_old_libs"; then
       if test yes != "$pic_mode"; then
 	# Don't build PIC code
 	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
       if test yes = "$compiler_c_o"; then
 	func_append command " -o $obj"
       fi
 
       # Suppress compiler output if we already did a PIC compilation.
       func_append command "$suppress_output"
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
       if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
 `cat $lockfile 2>/dev/null`
 
 but it should contain:
 $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
 your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 
 	$opt_dry_run || $RM $removelist
 	exit $EXIT_FAILURE
       fi
 
       # Just move the object if needed
       if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
 	func_show_eval '$MV "$output_obj" "$obj"' \
 	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
       fi
     fi
 
     $opt_dry_run || {
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
       if test no != "$need_locks"; then
 	removelist=$lockfile
         $RM "$lockfile"
       fi
     }
 
     exit $EXIT_SUCCESS
 }
 
 $opt_help || {
   test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
 {
     # We need to display help for each of the modes.
     case $opt_mode in
       "")
         # Generic help is extracted from the usage comments
         # at the start of this file.
         func_help
         ;;
 
       clean)
         $ECHO \
 "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
 
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
 (typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
 with it are deleted. Otherwise, only FILE itself is deleted using RM."
         ;;
 
       compile)
       $ECHO \
 "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
 
 Compile a source file into a libtool library object.
 
 This mode accepts the following additional options:
 
   -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
   -shared           do not build a '.o' file suitable for static linking
   -static           only build a '.o' file suitable for static linking
   -Wc,FLAG          pass FLAG directly to the compiler
 
 COMPILE-COMMAND is a command to be used in creating a 'standard' object file
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
 SOURCEFILE, then substituting the C source code suffix '.c' with the
 library object suffix, '.lo'."
         ;;
 
       execute)
         $ECHO \
 "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
 
 Automatically set library path, then run a program.
 
 This mode accepts the following additional options:
 
   -dlopen FILE      add the directory containing FILE to the library path
 
 This mode sets the library path environment variable according to '-dlopen'
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
 into their corresponding uninstalled binary, and any of their required library
 directories are added to the library path.
 
 Then, COMMAND is executed, with ARGS as arguments."
         ;;
 
       finish)
         $ECHO \
 "Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
 
 Complete the installation of libtool libraries.
 
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
 the '--dry-run' option if you just want to see what would be executed."
         ;;
 
       install)
         $ECHO \
 "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
 
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
 either the 'install' or 'cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
   -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
 
 The rest of the components are interpreted as arguments to that command (only
 BSD-compatible install options are recognized)."
         ;;
 
       link)
         $ECHO \
 "Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
 
 Link object files or libraries together to form another library, or to
 create an executable program.
 
 LINK-COMMAND is a command using the C compiler that you would use to create
 a program from several object files.
 
 The following components of LINK-COMMAND are treated specially:
 
   -all-static       do not do any dynamic linking at all
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
   -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
                     try to export only the symbols listed in SYMFILE
   -export-symbols-regex REGEX
                     try to export only the symbols matching REGEX
   -LLIBDIR          search LIBDIR for required installed libraries
   -lNAME            OUTPUT-FILE requires the installed library libNAME
   -module           build a library that can dlopened
   -no-fast-install  disable the fast-install mode
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
   -objectlist FILE  use a list of object files found in FILE to specify objects
   -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
   -rpath LIBDIR     the created library will eventually be installed in LIBDIR
   -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
   -shared           only do dynamic linking of libtool libraries
   -shrext SUFFIX    override the standard shared library file extension
   -static           do not do any dynamic linking of uninstalled libtool libraries
   -static-libtool-libs
                     do not do any dynamic linking of libtool libraries
   -version-info CURRENT[:REVISION[:AGE]]
                     specify library version info [each variable defaults to 0]
   -weak LIBNAME     declare that the target provides the LIBNAME interface
   -Wc,FLAG
   -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
   -Wl,FLAG
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
 All other options (arguments beginning with '-') are ignored.
 
 Every other argument is treated as a filename.  Files ending in '.la' are
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
 If the OUTPUT-FILE ends in '.la', then a libtool library is created,
 only library objects ('.lo' files) may be specified, and '-rpath' is
 required, except when creating a convenience library.
 
 If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
 using 'ar' and 'ranlib', or on Windows using 'lib'.
 
 If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
 is created, otherwise an executable program is created."
         ;;
 
       uninstall)
         $ECHO \
 "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
 
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
 (typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
 Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
         func_fatal_help "invalid operation mode '$opt_mode'"
         ;;
     esac
 
     echo
     $ECHO "Try '$progname --help' for more information about other modes."
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
   if test : = "$opt_help"; then
     func_mode_help
   else
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
 	func_mode_help
       done
     } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
 	echo
 	func_mode_help
       done
     } |
     $SED '1d
       /^When reporting/,/^Report/{
 	H
 	d
       }
       $x
       /information about other modes/d
       /more detailed .*MODE/d
       s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
   fi
   exit $?
 fi
 
 
 # func_mode_execute arg...
 func_mode_execute ()
 {
     $debug_cmd
 
     # The first argument is the command name.
     cmd=$nonopt
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
 	|| func_fatal_help "'$file' is not a file"
 
       dir=
       case $file in
       *.la)
 	func_resolve_sysroot "$file"
 	file=$func_resolve_sysroot_result
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
 	  || func_fatal_help "'$lib' is not a valid libtool archive"
 
 	# Read the libtool library.
 	dlname=
 	library_names=
 	func_source "$file"
 
 	# Skip this library if it cannot be dlopened.
 	if test -z "$dlname"; then
 	  # Warn if it was a shared library.
 	  test -n "$library_names" && \
 	    func_warning "'$file' was not linked with '-export-dynamic'"
 	  continue
 	fi
 
 	func_dirname "$file" "" "."
 	dir=$func_dirname_result
 
 	if test -f "$dir/$objdir/$dlname"; then
 	  func_append dir "/$objdir"
 	else
 	  if test ! -f "$dir/$dlname"; then
 	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
 	  fi
 	fi
 	;;
 
       *.lo)
 	# Just add the directory containing the .lo file.
 	func_dirname "$file" "" "."
 	dir=$func_dirname_result
 	;;
 
       *)
 	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
       test -n "$absdir" && dir=$absdir
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
 	eval "$shlibpath_var=\"\$dir\""
       else
 	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
       fi
     done
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
     libtool_execute_magic=$magic
 
     # Check if any of the arguments is a wrapper script.
     args=
     for file
     do
       case $file in
       -* | *.la | *.lo ) ;;
       *)
 	# Do a test to see if this is really a libtool program.
 	if func_ltwrapper_script_p "$file"; then
 	  func_source "$file"
 	  # Transform arg to wrapped name.
 	  file=$progdir/$program
 	elif func_ltwrapper_executable_p "$file"; then
 	  func_ltwrapper_scriptname "$file"
 	  func_source "$func_ltwrapper_scriptname_result"
 	  # Transform arg to wrapped name.
 	  file=$progdir/$program
 	fi
 	;;
       esac
       # Quote arguments (to preserve shell metacharacters).
       func_append_quoted args "$file"
     done
 
     if $opt_dry_run; then
       # Display what would be done.
       if test -n "$shlibpath_var"; then
 	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
 	echo "export $shlibpath_var"
       fi
       $ECHO "$cmd$args"
       exit $EXIT_SUCCESS
     else
       if test -n "$shlibpath_var"; then
 	# Export the shlibpath_var.
 	eval "export $shlibpath_var"
       fi
 
       # Restore saved environment variables
       for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
       do
 	eval "if test \"\${save_$lt_var+set}\" = set; then
                 $lt_var=\$save_$lt_var; export $lt_var
 	      else
 		$lt_unset $lt_var
 	      fi"
       done
 
       # Now prepare to actually exec the command.
       exec_cmd=\$cmd$args
     fi
 }
 
 test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
     $debug_cmd
 
     libs=
     libdirs=
     admincmds=
 
     for opt in "$nonopt" ${1+"$@"}
     do
       if test -d "$opt"; then
 	func_append libdirs " $opt"
 
       elif test -f "$opt"; then
 	if func_lalib_unsafe_p "$opt"; then
 	  func_append libs " $opt"
 	else
 	  func_warning "'$opt' is not a valid libtool archive"
 	fi
 
       else
 	func_fatal_error "invalid argument '$opt'"
       fi
     done
 
     if test -n "$libs"; then
       if test -n "$lt_sysroot"; then
         sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
         sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
       else
         sysroot_cmd=
       fi
 
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
           echo "removing references to $lt_sysroot and '=' prefixes from $lib"
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
 	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
 	    > $tmpdir/tmp-la
 	  mv -f $tmpdir/tmp-la $lib
 	done
         ${RM}r "$tmpdir"
       fi
     fi
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       for libdir in $libdirs; do
 	if test -n "$finish_cmds"; then
 	  # Do each command in the finish commands.
 	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
 '"$cmd"'"'
 	fi
 	if test -n "$finish_eval"; then
 	  # Do the single finish_eval.
 	  eval cmds=\"$finish_eval\"
 	  $opt_dry_run || eval "$cmds" || func_append admincmds "
        $cmds"
 	fi
       done
     fi
 
     # Exit here if they wanted silent mode.
     $opt_quiet && exit $EXIT_SUCCESS
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
       echo "Libraries have been installed in:"
       for libdir in $libdirs; do
 	$ECHO "   $libdir"
       done
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
       echo "specify the full pathname of the library, or use the '-LLIBDIR'"
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
 	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
 	echo "     during execution"
       fi
       if test -n "$runpath_var"; then
 	echo "   - add LIBDIR to the '$runpath_var' environment variable"
 	echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
 	libdir=LIBDIR
 	eval flag=\"$hardcode_libdir_flag_spec\"
 
 	$ECHO "   - use the '$flag' linker flag"
       fi
       if test -n "$admincmds"; then
 	$ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
 	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
       fi
       echo
 
       echo "See any operating system documentation about shared libraries for"
       case $host in
 	solaris2.[6789]|solaris2.1[0-9])
 	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
 	  echo "pages."
 	  ;;
 	*)
 	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
 	  ;;
       esac
       echo "----------------------------------------------------------------------"
     fi
     exit $EXIT_SUCCESS
 }
 
 test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
     $debug_cmd
 
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
     if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
        # Allow the use of GNU shtool's install command.
        case $nonopt in *shtool*) :;; *) false;; esac
     then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
       arg=$1
       shift
     else
       install_prog=
       arg=$nonopt
     fi
 
     # The real first argument should be the name of the installation program.
     # Aesthetically quote it.
     func_quote_for_eval "$arg"
     func_append install_prog "$func_quote_for_eval_result"
     install_shared_prog=$install_prog
     case " $install_prog " in
       *[\\\ /]cp\ *) install_cp=: ;;
       *) install_cp=false ;;
     esac
 
     # We need to accept at least all the BSD install flags.
     dest=
     files=
     opts=
     prev=
     install_type=
     isdir=false
     stripme=
     no_mode=:
     for arg
     do
       arg2=
       if test -n "$dest"; then
 	func_append files " $dest"
 	dest=$arg
 	continue
       fi
 
       case $arg in
       -d) isdir=: ;;
       -f)
 	if $install_cp; then :; else
 	  prev=$arg
 	fi
 	;;
       -g | -m | -o)
 	prev=$arg
 	;;
       -s)
 	stripme=" -s"
 	continue
 	;;
       -*)
 	;;
       *)
 	# If the previous option needed an argument, then skip it.
 	if test -n "$prev"; then
 	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
 	    arg2=$install_override_mode
 	    no_mode=false
 	  fi
 	  prev=
 	else
 	  dest=$arg
 	  continue
 	fi
 	;;
       esac
 
       # Aesthetically quote the argument.
       func_quote_for_eval "$arg"
       func_append install_prog " $func_quote_for_eval_result"
       if test -n "$arg2"; then
 	func_quote_for_eval "$arg2"
       fi
       func_append install_shared_prog " $func_quote_for_eval_result"
     done
 
     test -z "$install_prog" && \
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
       func_fatal_help "the '$prev' option requires an argument"
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
 	func_quote_for_eval "$install_override_mode"
 	func_append install_shared_prog " -m $func_quote_for_eval_result"
       fi
     fi
 
     if test -z "$files"; then
       if test -z "$dest"; then
 	func_fatal_help "no file or destination specified"
       else
 	func_fatal_help "you must specify a destination"
       fi
     fi
 
     # Strip any trailing slash from the destination.
     func_stripname '' '/' "$dest"
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
     test -d "$dest" && isdir=:
     if $isdir; then
       destdir=$dest
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
       destdir=$func_dirname_result
       destname=$func_basename_result
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
 	func_fatal_help "'$dest' is not a directory"
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
     *)
       for file in $files; do
 	case $file in
 	*.lo) ;;
 	*)
 	  func_fatal_help "'$destdir' must be an absolute directory name"
 	  ;;
 	esac
       done
       ;;
     esac
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
     libtool_install_magic=$magic
 
     staticlibs=
     future_libdirs=
     current_libdirs=
     for file in $files; do
 
       # Do each installation.
       case $file in
       *.$libext)
 	# Do the static libraries later.
 	func_append staticlibs " $file"
 	;;
 
       *.la)
 	func_resolve_sysroot "$file"
 	file=$func_resolve_sysroot_result
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
 	  || func_fatal_help "'$file' is not a valid libtool archive"
 
 	library_names=
 	old_library=
 	relink_command=
 	func_source "$file"
 
 	# Add the libdir to current_libdirs if it is the destination.
 	if test "X$destdir" = "X$libdir"; then
 	  case "$current_libdirs " in
 	  *" $libdir "*) ;;
 	  *) func_append current_libdirs " $libdir" ;;
 	  esac
 	else
 	  # Note the libdir as a future libdir.
 	  case "$future_libdirs " in
 	  *" $libdir "*) ;;
 	  *) func_append future_libdirs " $libdir" ;;
 	  esac
 	fi
 
 	func_dirname "$file" "/" ""
 	dir=$func_dirname_result
 	func_append dir "$objdir"
 
 	if test -n "$relink_command"; then
 	  # Determine the prefix the user has applied to our future dir.
 	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
 
 	  # Don't allow the user to place us outside of our expected
 	  # location b/c this prevents finding dependent libraries that
 	  # are installed to the same prefix.
 	  # At present, this check doesn't affect windows .dll's that
 	  # are installed into $libdir/../bin (currently, that works fine)
 	  # but it's something to keep an eye on.
 	  test "$inst_prefix_dir" = "$destdir" && \
 	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
 
 	  if test -n "$inst_prefix_dir"; then
 	    # Stick the inst_prefix_dir data into the link command.
 	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
 	  else
 	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
 	  fi
 
 	  func_warning "relinking '$file'"
 	  func_show_eval "$relink_command" \
 	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
 	fi
 
 	# See the names of the shared library.
 	set dummy $library_names; shift
 	if test -n "$1"; then
 	  realname=$1
 	  shift
 
 	  srcname=$realname
 	  test -n "$relink_command" && srcname=${realname}T
 
 	  # Install the shared library and build the symlinks.
 	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
 	      'exit $?'
 	  tstripme=$stripme
 	  case $host_os in
 	  cygwin* | mingw* | pw32* | cegcc*)
 	    case $realname in
 	    *.dll.a)
 	      tstripme=
 	      ;;
 	    esac
 	    ;;
 	  os2*)
 	    case $realname in
 	    *_dll.a)
 	      tstripme=
 	      ;;
 	    esac
 	    ;;
 	  esac
 	  if test -n "$tstripme" && test -n "$striplib"; then
 	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
 	  fi
 
 	  if test "$#" -gt 0; then
 	    # Delete the old symlinks, and create new ones.
 	    # Try 'ln -sf' first, because the 'ln' binary might depend on
 	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
 	    # so we also need to try rm && ln -s.
 	    for linkname
 	    do
 	      test "$linkname" != "$realname" \
 		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
 	    done
 	  fi
 
 	  # Do each command in the postinstall commands.
 	  lib=$destdir/$realname
 	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
 	# Install the pseudo-library for information purposes.
 	func_basename "$file"
 	name=$func_basename_result
 	instname=$dir/${name}i
 	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
 	# Maybe install the static library, too.
 	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
 	;;
 
       *.lo)
 	# Install (i.e. copy) a libtool object.
 
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
 	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
 	  destfile=$func_basename_result
 	  destfile=$destdir/$destfile
 	fi
 
 	# Deduce the name of the destination old-style object file.
 	case $destfile in
 	*.lo)
 	  func_lo2o "$destfile"
 	  staticdest=$func_lo2o_result
 	  ;;
 	*.$objext)
 	  staticdest=$destfile
 	  destfile=
 	  ;;
 	*)
 	  func_fatal_help "cannot copy a libtool object to '$destfile'"
 	  ;;
 	esac
 
 	# Install the libtool object if requested.
 	test -n "$destfile" && \
 	  func_show_eval "$install_prog $file $destfile" 'exit $?'
 
 	# Install the old object if enabled.
 	if test yes = "$build_old_libs"; then
 	  # Deduce the name of the old-style object file.
 	  func_lo2o "$file"
 	  staticobj=$func_lo2o_result
 	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
 	fi
 	exit $EXIT_SUCCESS
 	;;
 
       *)
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
 	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
 	  destfile=$func_basename_result
 	  destfile=$destdir/$destfile
 	fi
 
 	# If the file is missing, and there is a .exe on the end, strip it
 	# because it is most likely a libtool script we actually want to
 	# install
 	stripped_ext=
 	case $file in
 	  *.exe)
 	    if test ! -f "$file"; then
 	      func_stripname '' '.exe' "$file"
 	      file=$func_stripname_result
 	      stripped_ext=.exe
 	    fi
 	    ;;
 	esac
 
 	# Do a test to see if this is really a libtool program.
 	case $host in
 	*cygwin* | *mingw*)
 	    if func_ltwrapper_executable_p "$file"; then
 	      func_ltwrapper_scriptname "$file"
 	      wrapper=$func_ltwrapper_scriptname_result
 	    else
 	      func_stripname '' '.exe' "$file"
 	      wrapper=$func_stripname_result
 	    fi
 	    ;;
 	*)
 	    wrapper=$file
 	    ;;
 	esac
 	if func_ltwrapper_script_p "$wrapper"; then
 	  notinst_deplibs=
 	  relink_command=
 
 	  func_source "$wrapper"
 
 	  # Check the variables that should have been set.
 	  test -z "$generated_by_libtool_version" && \
 	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
 
 	  finalize=:
 	  for lib in $notinst_deplibs; do
 	    # Check to see that each library is installed.
 	    libdir=
 	    if test -f "$lib"; then
 	      func_source "$lib"
 	    fi
 	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
 	    if test -n "$libdir" && test ! -f "$libfile"; then
 	      func_warning "'$lib' has not been installed in '$libdir'"
 	      finalize=false
 	    fi
 	  done
 
 	  relink_command=
 	  func_source "$wrapper"
 
 	  outputname=
 	  if test no = "$fast_install" && test -n "$relink_command"; then
 	    $opt_dry_run || {
 	      if $finalize; then
 	        tmpdir=`func_mktempdir`
 		func_basename "$file$stripped_ext"
 		file=$func_basename_result
 	        outputname=$tmpdir/$file
 	        # Replace the output file specification.
 	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
 	        $opt_quiet || {
 	          func_quote_for_expand "$relink_command"
 		  eval "func_echo $func_quote_for_expand_result"
 	        }
 	        if eval "$relink_command"; then :
 	          else
 		  func_error "error: relink '$file' with the above command before installing it"
 		  $opt_dry_run || ${RM}r "$tmpdir"
 		  continue
 	        fi
 	        file=$outputname
 	      else
 	        func_warning "cannot relink '$file'"
 	      fi
 	    }
 	  else
 	    # Install the binary that we compiled earlier.
 	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
 	  fi
 	fi
 
 	# remove .exe since cygwin /usr/bin/install will append another
 	# one anyway
 	case $install_prog,$host in
 	*/usr/bin/install*,*cygwin*)
 	  case $file:$destfile in
 	  *.exe:*.exe)
 	    # this is ok
 	    ;;
 	  *.exe:*)
 	    destfile=$destfile.exe
 	    ;;
 	  *:*.exe)
 	    func_stripname '' '.exe' "$destfile"
 	    destfile=$func_stripname_result
 	    ;;
 	  esac
 	  ;;
 	esac
 	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
 	$opt_dry_run || if test -n "$outputname"; then
 	  ${RM}r "$tmpdir"
 	fi
 	;;
       esac
     done
 
     for file in $staticlibs; do
       func_basename "$file"
       name=$func_basename_result
 
       # Set up the ranlib parameters.
       oldlib=$destdir/$name
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
       func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
 
       if test -n "$stripme" && test -n "$old_striplib"; then
 	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
       fi
 
       # Do each command in the postinstall commands.
       func_execute_cmds "$old_postinstall_cmds" 'exit $?'
     done
 
     test -n "$future_libdirs" && \
       func_warning "remember to run '$progname --finish$future_libdirs'"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
       exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
     else
       exit $EXIT_SUCCESS
     fi
 }
 
 test install = "$opt_mode" && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
 # Extract symbols from dlprefiles and create ${outputname}S.o with
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
     $debug_cmd
 
     my_outputname=$1
     my_originator=$2
     my_pic_p=${3-false}
     my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
     my_dlsyms=
 
     if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
 	my_dlsyms=${my_outputname}S.c
       else
 	func_error "not configured to extract global symbols from dlpreopened files"
       fi
     fi
 
     if test -n "$my_dlsyms"; then
       case $my_dlsyms in
       "") ;;
       *.c)
 	# Discover the nlist of each of the dlfiles.
 	nlist=$output_objdir/$my_outputname.nm
 
 	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
 	# Parse the name list into a source file.
 	func_verbose "creating $output_objdir/$my_dlsyms"
 
 	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
 /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
 /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
 #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
 #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
 /* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
 #elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
 #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
 
 /* External symbol declarations for the compiler. */\
 "
 
 	if test yes = "$dlself"; then
 	  func_verbose "generating symbol list for '$output'"
 
 	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
 	  # Add our own program objects to the symbol list.
 	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	  for progfile in $progfiles; do
 	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
 	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
 	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
 	  done
 
 	  if test -n "$exclude_expsyms"; then
 	    $opt_dry_run || {
 	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	    }
 	  fi
 
 	  if test -n "$export_symbols_regex"; then
 	    $opt_dry_run || {
 	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	    }
 	  fi
 
 	  # Prepare the list of exported symbols
 	  if test -z "$export_symbols"; then
 	    export_symbols=$output_objdir/$outputname.exp
 	    $opt_dry_run || {
 	      $RM $export_symbols
 	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
 	      case $host in
 	      *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
                 eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
 	        ;;
 	      esac
 	    }
 	  else
 	    $opt_dry_run || {
 	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
 	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	      case $host in
 	        *cygwin* | *mingw* | *cegcc* )
 	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
 	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
 	          ;;
 	      esac
 	    }
 	  fi
 	fi
 
 	for dlprefile in $dlprefiles; do
 	  func_verbose "extracting global C symbols from '$dlprefile'"
 	  func_basename "$dlprefile"
 	  name=$func_basename_result
           case $host in
 	    *cygwin* | *mingw* | *cegcc* )
 	      # if an import library, we need to obtain dlname
 	      if func_win32_import_lib_p "$dlprefile"; then
 	        func_tr_sh "$dlprefile"
 	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
 	        dlprefile_dlbasename=
 	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
 	          # Use subshell, to avoid clobbering current variable values
 	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
 	          if test -n "$dlprefile_dlname"; then
 	            func_basename "$dlprefile_dlname"
 	            dlprefile_dlbasename=$func_basename_result
 	          else
 	            # no lafile. user explicitly requested -dlpreopen <import library>.
 	            $sharedlib_from_linklib_cmd "$dlprefile"
 	            dlprefile_dlbasename=$sharedlib_from_linklib_result
 	          fi
 	        fi
 	        $opt_dry_run || {
 	          if test -n "$dlprefile_dlbasename"; then
 	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
 	          else
 	            func_warning "Could not compute DLL name from $name"
 	            eval '$ECHO ": $name " >> "$nlist"'
 	          fi
 	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
 	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
 	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
 	        }
 	      else # not an import lib
 	        $opt_dry_run || {
 	          eval '$ECHO ": $name " >> "$nlist"'
 	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
 	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
 	        }
 	      fi
 	    ;;
 	    *)
 	      $opt_dry_run || {
 	        eval '$ECHO ": $name " >> "$nlist"'
 	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
 	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
 	      }
 	    ;;
           esac
 	done
 
 	$opt_dry_run || {
 	  # Make sure we have at least an empty file.
 	  test -f "$nlist" || : > "$nlist"
 
 	  if test -n "$exclude_expsyms"; then
 	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
 	    $MV "$nlist"T "$nlist"
 	  fi
 
 	  # Try sorting and uniquifying the output.
 	  if $GREP -v "^: " < "$nlist" |
 	      if sort -k 3 </dev/null >/dev/null 2>&1; then
 		sort -k 3
 	      else
 		sort +2
 	      fi |
 	      uniq > "$nlist"S; then
 	    :
 	  else
 	    $GREP -v "^: " < "$nlist" > "$nlist"S
 	  fi
 
 	  if test -f "$nlist"S; then
 	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
 	  else
 	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
 
 	  func_show_eval '$RM "${nlist}I"'
 	  if test -n "$global_symbol_to_import"; then
 	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
 	  fi
 
 	  echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
 typedef struct {
   const char *name;
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[];\
 "
 
 	  if test -s "$nlist"I; then
 	    echo >> "$output_objdir/$my_dlsyms" "\
 static void lt_syminit(void)
 {
   LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
   for (; symbol->name; ++symbol)
     {"
 	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
 	    echo >> "$output_objdir/$my_dlsyms" "\
     }
 }"
 	  fi
 	  echo >> "$output_objdir/$my_dlsyms" "\
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
 { {\"$my_originator\", (void *) 0},"
 
 	  if test -s "$nlist"I; then
 	    echo >> "$output_objdir/$my_dlsyms" "\
   {\"@INIT@\", (void *) &lt_syminit},"
 	  fi
 
 	  case $need_lib_prefix in
 	  no)
 	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
 	    ;;
 	  *)
 	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
 	    ;;
 	  esac
 	  echo >> "$output_objdir/$my_dlsyms" "\
   {0, (void *) 0}
 };
 
 /* This works around a problem in FreeBSD linker */
 #ifdef FREEBSD_WORKAROUND
 static const void *lt_preloaded_setup() {
   return lt_${my_prefix}_LTX_preloaded_symbols;
 }
 #endif
 
 #ifdef __cplusplus
 }
 #endif\
 "
 	} # !$opt_dry_run
 
 	pic_flag_for_symtable=
 	case "$compile_command " in
 	*" -static "*) ;;
 	*)
 	  case $host in
 	  # compiling the symbol table file with pic_flag works around
 	  # a FreeBSD bug that causes programs to crash when -lm is
 	  # linked before any other PIC object.  But we must not use
 	  # pic_flag when linking with -static.  The problem exists in
 	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
 	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
 	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
 	  *-*-hpux*)
 	    pic_flag_for_symtable=" $pic_flag"  ;;
 	  *)
 	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
 	    ;;
 	  esac
 	  ;;
 	esac
 	symtab_cflags=
 	for arg in $LTCFLAGS; do
 	  case $arg in
 	  -pie | -fpie | -fPIE) ;;
 	  *) func_append symtab_cflags " $arg" ;;
 	  esac
 	done
 
 	# Now compile the dynamic symbol file.
 	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
 	# Clean up the generated files.
 	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
 
 	# Transform the symbol file into the correct name.
 	symfileobj=$output_objdir/${my_outputname}S.$objext
 	case $host in
 	*cygwin* | *mingw* | *cegcc* )
 	  if test -f "$output_objdir/$my_outputname.def"; then
 	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
 	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
 	  else
 	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
 	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
 	  fi
 	  ;;
 	*)
 	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
 	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
 	  ;;
 	esac
 	;;
       *)
 	func_fatal_error "unknown suffix for '$my_dlsyms'"
 	;;
       esac
     else
       # We keep going just in case the user didn't refer to
       # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
       # really was required.
 
       # Nullify the symbol file.
       compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
       finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
     fi
 }
 
 # func_cygming_gnu_implib_p ARG
 # This predicate returns with zero status (TRUE) if
 # ARG is a GNU/binutils-style import library. Returns
 # with nonzero status (FALSE) otherwise.
 func_cygming_gnu_implib_p ()
 {
   $debug_cmd
 
   func_to_tool_file "$1" func_convert_file_msys_to_w32
   func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
   test -n "$func_cygming_gnu_implib_tmp"
 }
 
 # func_cygming_ms_implib_p ARG
 # This predicate returns with zero status (TRUE) if
 # ARG is an MS-style import library. Returns
 # with nonzero status (FALSE) otherwise.
 func_cygming_ms_implib_p ()
 {
   $debug_cmd
 
   func_to_tool_file "$1" func_convert_file_msys_to_w32
   func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
   test -n "$func_cygming_ms_implib_tmp"
 }
 
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
 # Need a lot of goo to handle *both* DLLs and import libs
 # Has to be a shell function in order to 'eat' the argument
 # that is supplied when $file_magic_command is called.
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
   $debug_cmd
 
   win32_libid_type=unknown
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
     win32_libid_type="x86 archive import"
     ;;
   *ar\ archive*) # could be an import, or static
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
       case $nm_interface in
       "MS dumpbin")
 	if func_cygming_ms_implib_p "$1" ||
 	   func_cygming_gnu_implib_p "$1"
 	then
 	  win32_nmres=import
 	else
 	  win32_nmres=
 	fi
 	;;
       *)
 	func_to_tool_file "$1" func_convert_file_msys_to_w32
 	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
 	  $SED -n -e '
 	    1,100{
 		/ I /{
 		    s|.*|import|
 		    p
 		    q
 		}
 	    }'`
 	;;
       esac
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
       esac
     fi
     ;;
   *DLL*)
     win32_libid_type="x86 DLL"
     ;;
   *executable*) # but shell scripts are "executable" too...
     case $win32_fileres in
     *MS\ Windows\ PE\ Intel*)
       win32_libid_type="x86 DLL"
       ;;
     esac
     ;;
   esac
   $ECHO "$win32_libid_type"
 }
 
 # func_cygming_dll_for_implib ARG
 #
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
 # import library ARG.
 # Invoked by eval'ing the libtool variable
 #    $sharedlib_from_linklib_cmd
 # Result is available in the variable
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
   $debug_cmd
 
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
 # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
 #
 # The is the core of a fallback implementation of a
 # platform-specific function to extract the name of the
 # DLL associated with the specified import library LIBNAME.
 #
 # SECTION_NAME is either .idata$6 or .idata$7, depending
 # on the platform and compiler that created the implib.
 #
 # Echos the name of the DLL associated with the
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
   $debug_cmd
 
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
       # Place marker at beginning of archive member dllname section
       s/.*/====MARK====/
       p
       d
     }
     # These lines can sometimes be longer than 43 characters, but
     # are always uninteresting
     /:[	 ]*file format pe[i]\{,1\}-/d
     /^In archive [^:]*:/d
     # Ensure marker is printed
     /^====MARK====/p
     # Remove all lines with less than 43 characters
     /^.\{43\}/!d
     # From remaining lines, remove first 43 characters
     s/^.\{43\}//' |
     $SED -n '
       # Join marker and all lines until next marker into a single line
       /^====MARK====/ b para
       H
       $ b para
       b
       :para
       x
       s/\n//g
       # Remove the marker
       s/^====MARK====//
       # Remove trailing dots and whitespace
       s/[\. \t]*$//
       # Print
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
     # archive that possess that section. Heuristic: eliminate
     # all those that have a first or second character that is
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
     # begins with a literal '.' or a single character followed by
     # a '.'.
     #
     # Of those that remain, print the first one.
     $SED -e '/^\./d;/^.\./d;q'
 }
 
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
 # import library ARG.
 #
 # This fallback implementation is for use when $DLLTOOL
 # does not support the --identify-strict option.
 # Invoked by eval'ing the libtool variable
 #    $sharedlib_from_linklib_cmd
 # Result is available in the variable
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
   $debug_cmd
 
   if func_cygming_gnu_implib_p "$1"; then
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
   elif func_cygming_ms_implib_p "$1"; then
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
     sharedlib_from_linklib_result=
   fi
 }
 
 
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
     $debug_cmd
 
     f_ex_an_ar_dir=$1; shift
     f_ex_an_ar_oldlib=$1
     if test yes = "$lock_old_archive_extraction"; then
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
 		   'stat=$?; rm -f "$lockfile"; exit $stat'
     if test yes = "$lock_old_archive_extraction"; then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
      :
     else
       func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
     fi
 }
 
 
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
     $debug_cmd
 
     my_gentop=$1; shift
     my_oldlibs=${1+"$@"}
     my_oldobjs=
     my_xlib=
     my_xabs=
     my_xdir=
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
 	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
 	*) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
       my_xlib=$func_basename_result
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
 	*" $my_xlib_u "*)
 	  func_arith $extracted_serial + 1
 	  extracted_serial=$func_arith_result
 	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
 	*) break ;;
 	esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
       my_xdir=$my_gentop/$my_xlib_u
 
       func_mkdir_p "$my_xdir"
 
       case $host in
       *-darwin*)
 	func_verbose "Extracting $my_xabs"
 	# Do not bother doing anything if just a dry run
 	$opt_dry_run || {
 	  darwin_orig_dir=`pwd`
 	  cd $my_xdir || exit $?
 	  darwin_archive=$my_xabs
 	  darwin_curdir=`pwd`
 	  func_basename "$darwin_archive"
 	  darwin_base_archive=$func_basename_result
 	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
 	  if test -n "$darwin_arches"; then
 	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
 	    darwin_arch=
 	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
 	    for darwin_arch in  $darwin_arches; do
 	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
 	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
 	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
 	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
 	      cd "$darwin_curdir"
 	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
 	    done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
 	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
 	    darwin_file=
 	    darwin_files=
 	    for darwin_file in $darwin_filelist; do
 	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
 	      $LIPO -create -output "$darwin_file" $darwin_files
 	    done # $darwin_filelist
 	    $RM -rf unfat-$$
 	    cd "$darwin_orig_dir"
 	  else
 	    cd $darwin_orig_dir
 	    func_extract_an_archive "$my_xdir" "$my_xabs"
 	  fi # $darwin_arches
 	} # !$opt_dry_run
 	;;
       *)
         func_extract_an_archive "$my_xdir" "$my_xabs"
 	;;
       esac
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
     func_extract_archives_result=$my_oldobjs
 }
 
 
 # func_emit_wrapper [arg=no]
 #
 # Emit a libtool wrapper script on stdout.
 # Don't directly open a file because we may want to
 # incorporate the script contents within a cygwin/mingw
 # wrapper executable.  Must ONLY be called from within
 # func_mode_link because it depends on a number of variables
 # set therein.
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
 # will assume that the directory where it is stored is
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
 {
 	func_emit_wrapper_arg1=${1-no}
 
 	$ECHO "\
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
 # Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
 #
 # This wrapper script should never be moved out of the build directory.
 # If it is, it will not operate correctly.
 
 # Sed substitution that helps us do robust quoting.  It backslashifies
 # metacharacters that are still active within double-quoted strings.
 sed_quote_subst='$sed_quote_subst'
 
 # Be Bourne compatible
 if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
   # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '\${1+\"\$@\"}'='\"\$@\"'
   setopt NO_GLOB_SUBST
 else
   case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
 fi
 BIN_SH=xpg4; export BIN_SH # for Tru64
 DUALCASE=1; export DUALCASE # for MKS sh
 
 # The HP-UX ksh and POSIX shell print the target directory to stdout
 # if CDPATH is set.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 relink_command=\"$relink_command\"
 
 # This environment variable determines our operation mode.
 if test \"\$libtool_install_magic\" = \"$magic\"; then
   # install mode needs the following variables:
   generated_by_libtool_version='$macro_version'
   notinst_deplibs='$notinst_deplibs'
 else
   # When we are sourced in execute mode, \$file and \$ECHO are already set.
   if test \"\$libtool_execute_magic\" != \"$magic\"; then
     file=\"\$0\""
 
     qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
     $ECHO "\
 
 # A function that is used when there is no print builtin or printf.
 func_fallback_echo ()
 {
   eval 'cat <<_LTECHO_EOF
 \$1
 _LTECHO_EOF'
 }
     ECHO=\"$qECHO\"
   fi
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
 # /script/ and the wrapper /executable/ that is used only on
 # windows platforms, and (c) all begin with the string "--lt-"
 # (application programs are unlikely to have options that match
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
 # --lt-dump-script. There is, deliberately, no --lt-help.
 #
 # The first argument to this parsing function should be the
 # script's $0 value, followed by "$@".
 lt_option_debug=
 func_parse_lt_options ()
 {
   lt_script_arg0=\$0
   shift
   for lt_opt
   do
     case \"\$lt_opt\" in
     --lt-debug) lt_option_debug=1 ;;
     --lt-dump-script)
         lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
         test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
         lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
         cat \"\$lt_dump_D/\$lt_dump_F\"
         exit 0
       ;;
     --lt-*)
         \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
         exit 1
       ;;
     esac
   done
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
     echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
   fi
 }
 
 # Used when --lt-debug. Prints its arguments to stdout
 # (redirection is the responsibility of the caller)
 func_lt_dump_args ()
 {
   lt_dump_args_N=1;
   for lt_arg
   do
     \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
 
 # Core function for launching the target application
 func_exec_program_core ()
 {
 "
   case $host in
   # Backslashes separate directories on plain windows
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
         \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
 "
     ;;
 
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
         \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
 "
     ;;
   esac
   $ECHO "\
       \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
       exit 1
 }
 
 # A function to encapsulate launching the target application
 # Strips options in the --lt-* namespace from \$@ and
 # launches target application with the remaining arguments.
 func_exec_program ()
 {
   case \" \$* \" in
   *\\ --lt-*)
     for lt_wr_arg
     do
       case \$lt_wr_arg in
       --lt-*) ;;
       *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
       esac
       shift
     done ;;
   esac
   func_exec_program_core \${1+\"\$@\"}
 }
 
   # Parse options
   func_parse_lt_options \"\$0\" \${1+\"\$@\"}
 
   # Find the directory that this script lives in.
   thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
   test \"x\$thisdir\" = \"x\$file\" && thisdir=.
 
   # Follow symbolic links until we get to the real thisdir.
   file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
   while test -n \"\$file\"; do
     destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
 
     # If there was a directory component, then change thisdir.
     if test \"x\$destdir\" != \"x\$file\"; then
       case \"\$destdir\" in
       [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
       *) thisdir=\"\$thisdir/\$destdir\" ;;
       esac
     fi
 
     file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
     file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
   done
 
   # Usually 'no', except on cygwin/mingw when embedded into
   # the cwrapper.
   WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
   if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
     # special case for '.'
     if test \"\$thisdir\" = \".\"; then
       thisdir=\`pwd\`
     fi
     # remove .libs from thisdir
     case \"\$thisdir\" in
     *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
     $objdir )   thisdir=. ;;
     esac
   fi
 
   # Try to get the absolute directory name.
   absdir=\`cd \"\$thisdir\" && pwd\`
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
 	if test yes = "$fast_install"; then
 	  $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
      { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
 
     if test ! -d \"\$progdir\"; then
       $MKDIR \"\$progdir\"
     else
       $RM \"\$progdir/\$file\"
     fi"
 
 	  $ECHO "\
 
     # relink executable if necessary
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
 	\$ECHO \"\$relink_command_output\" >&2
 	$RM \"\$progdir/\$file\"
 	exit 1
       fi
     fi
 
     $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
     { $RM \"\$progdir/\$program\";
       $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
     $RM \"\$progdir/\$file\"
   fi"
 	else
 	  $ECHO "\
   program='$outputname'
   progdir=\"\$thisdir/$objdir\"
 "
 	fi
 
 	$ECHO "\
 
   if test -f \"\$progdir/\$program\"; then"
 
 	# fixup the dll searchpath if we need to.
 	#
 	# Fix the DLL searchpath if we need to.  Do this before prepending
 	# to shlibpath, because on Windows, both are PATH and uninstalled
 	# libraries must come first.
 	if test -n "$dllsearchpath"; then
 	  $ECHO "\
     # Add the dll search path components to the executable PATH
     PATH=$dllsearchpath:\$PATH
 "
 	fi
 
 	# Export our shlibpath_var if we have one.
 	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
 	  $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
 
     # Some systems cannot cope with colon-terminated $shlibpath_var
     # The second colon is a workaround for a bug in BeOS R4 sed
     $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
 
     export $shlibpath_var
 "
 	fi
 
 	$ECHO "\
     if test \"\$libtool_execute_magic\" != \"$magic\"; then
       # Run the actual program with our arguments.
       func_exec_program \${1+\"\$@\"}
     fi
   else
     # The program doesn't exist.
     \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
   fi
 fi\
 "
 }
 
 
 # func_emit_cwrapperexe_src
 # emit the source code for a wrapper executable on stdout
 # Must ONLY be called from within func_mode_link because
 # it depends on a number of variable set therein.
 func_emit_cwrapperexe_src ()
 {
 	cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
    Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
 
    This wrapper executable should never be moved out of the build directory.
    If it is, it will not operate correctly.
 */
 EOF
 	    cat <<"EOF"
 #ifdef _MSC_VER
 # define _CRT_SECURE_NO_DEPRECATE 1
 #endif
 #include <stdio.h>
 #include <stdlib.h>
 #ifdef _MSC_VER
 # include <direct.h>
 # include <process.h>
 # include <io.h>
 #else
 # include <unistd.h>
 # include <stdint.h>
 # ifdef __CYGWIN__
 #  include <io.h>
 # endif
 #endif
 #include <malloc.h>
 #include <stdarg.h>
 #include <assert.h>
 #include <string.h>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 
 #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
 
 /* declarations of non-ANSI functions */
 #if defined __MINGW32__
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
 #elif defined __CYGWIN__
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
 /* #elif defined other_platform || defined ... */
 #endif
 
 /* portability defines, excluding path handling macros */
 #if defined _MSC_VER
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
 #elif defined __MINGW32__
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 #elif defined __CYGWIN__
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
 /* #elif defined other platforms ... */
 #endif
 
 #if defined PATH_MAX
 # define LT_PATHMAX PATH_MAX
 #elif defined MAXPATHLEN
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
 #endif
 
 #ifndef S_IXOTH
 # define S_IXOTH 0
 #endif
 #ifndef S_IXGRP
 # define S_IXGRP 0
 #endif
 
 /* path handling portability macros */
 #ifndef DIR_SEPARATOR
 # define DIR_SEPARATOR '/'
 # define PATH_SEPARATOR ':'
 #endif
 
 #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
   defined __OS2__
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
 #  define DIR_SEPARATOR_2 '\\'
 # endif
 # ifndef PATH_SEPARATOR_2
 #  define PATH_SEPARATOR_2 ';'
 # endif
 #endif
 
 #ifndef DIR_SEPARATOR_2
 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
 #else /* DIR_SEPARATOR_2 */
 # define IS_DIR_SEPARATOR(ch) \
 	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
 #endif /* DIR_SEPARATOR_2 */
 
 #ifndef PATH_SEPARATOR_2
 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
 #else /* PATH_SEPARATOR_2 */
 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
 #endif /* PATH_SEPARATOR_2 */
 
 #ifndef FOPEN_WB
 # define FOPEN_WB "w"
 #endif
 #ifndef _O_BINARY
 # define _O_BINARY 0
 #endif
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
   if (stale) { free (stale); stale = 0; } \
 } while (0)
 
 #if defined LT_DEBUGWRAPPER
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
 #endif
 
 const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
 
 void *xmalloc (size_t num);
 char *xstrdup (const char *string);
 const char *base_name (const char *name);
 char *find_executable (const char *wrapper);
 char *chase_symlinks (const char *pathspec);
 int make_executable (const char *path);
 int check_executable (const char *path);
 char *strendzap (char *str, const char *pat);
 void lt_debugprintf (const char *file, int line, const char *fmt, ...);
 void lt_fatal (const char *file, int line, const char *message, ...);
 static const char *nonnull (const char *s);
 static const char *nonempty (const char *s);
 void lt_setenv (const char *name, const char *value);
 char *lt_extend_str (const char *orig_value, const char *add, int to_end);
 void lt_update_exe_path (const char *name, const char *value);
 void lt_update_lib_path (const char *name, const char *value);
 char **prepare_spawn (char **argv);
 void lt_dump_script (FILE *f);
 EOF
 
 	    cat <<EOF
 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
 # define externally_visible volatile
 #else
 # define externally_visible __attribute__((externally_visible)) volatile
 #endif
 externally_visible const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
 	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
               func_to_host_path "$temp_rpath"
 	      cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
 EOF
 	    else
 	      cat <<"EOF"
 const char * LIB_PATH_VALUE   = "";
 EOF
 	    fi
 
 	    if test -n "$dllsearchpath"; then
               func_to_host_path "$dllsearchpath:"
 	      cat <<EOF
 const char * EXE_PATH_VARNAME = "PATH";
 const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
 EOF
 	    else
 	      cat <<"EOF"
 const char * EXE_PATH_VARNAME = "";
 const char * EXE_PATH_VALUE   = "";
 EOF
 	    fi
 
 	    if test yes = "$fast_install"; then
 	      cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
 	    else
 	      cat <<EOF
 const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
 EOF
 	    fi
 
 
 	    cat <<"EOF"
 
 #define LTWRAPPER_OPTION_PREFIX         "--lt-"
 
 static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
 static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
 static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
 
 int
 main (int argc, char *argv[])
 {
   char **newargz;
   int  newargc;
   char *tmp_pathspec;
   char *actual_cwrapper_path;
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
   int rval = 127;
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
   newargz = XMALLOC (char *, (size_t) argc + 1);
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
    * argz[0], which is handled differently
    */
   newargc=0;
   for (i = 1; i < argc; i++)
     {
       if (STREQ (argv[i], dumpscript_opt))
 	{
 EOF
 	    case $host in
 	      *mingw* | *cygwin* )
 		# make stdout use "unix" line endings
 		echo "          setmode(1,_O_BINARY);"
 		;;
 	      esac
 
 	    cat <<"EOF"
 	  lt_dump_script (stdout);
 	  return 0;
 	}
       if (STREQ (argv[i], debug_opt))
 	{
           lt_debug = 1;
           continue;
 	}
       if (STREQ (argv[i], ltwrapper_option_prefix))
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
              have already dealt with, above (inluding dump-script), then
              report an error. Otherwise, targets might begin to believe
              they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
              namespace. The first time any user complains about this, we'll
              need to make LTWRAPPER_OPTION_PREFIX a configure-time option
              or a configure.ac-settable value.
            */
           lt_fatal (__FILE__, __LINE__,
 		    "unrecognized %s option: '%s'",
                     ltwrapper_option_prefix, argv[i]);
         }
       /* otherwise ... */
       newargz[++newargc] = xstrdup (argv[i]);
     }
   newargz[++newargc] = NULL;
 
 EOF
 	    cat <<EOF
   /* The GNU banner must be the first non-error debug message */
   lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
 EOF
 	    cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
   lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
 
   tmp_pathspec = find_executable (argv[0]);
   if (tmp_pathspec == NULL)
     lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
   lt_debugprintf (__FILE__, __LINE__,
                   "(main) found exe (before symlink chase) at: %s\n",
 		  tmp_pathspec);
 
   actual_cwrapper_path = chase_symlinks (tmp_pathspec);
   lt_debugprintf (__FILE__, __LINE__,
                   "(main) found exe (after symlink chase) at: %s\n",
 		  actual_cwrapper_path);
   XFREE (tmp_pathspec);
 
   actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
   strendzap (actual_cwrapper_path, actual_cwrapper_name);
 
   /* wrapper name transforms */
   strendzap (actual_cwrapper_name, ".exe");
   tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
   XFREE (actual_cwrapper_name);
   actual_cwrapper_name = tmp_pathspec;
   tmp_pathspec = 0;
 
   /* target_name transforms -- use actual target program name; might have lt- prefix */
   target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
   strendzap (target_name, ".exe");
   tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
   XFREE (target_name);
   target_name = tmp_pathspec;
   tmp_pathspec = 0;
 
   lt_debugprintf (__FILE__, __LINE__,
 		  "(main) libtool target name: %s\n",
 		  target_name);
 EOF
 
 	    cat <<EOF
   newargz[0] =
     XMALLOC (char, (strlen (actual_cwrapper_path) +
 		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
   strcpy (newargz[0], actual_cwrapper_path);
   strcat (newargz[0], "$objdir");
   strcat (newargz[0], "/");
 EOF
 
 	    cat <<"EOF"
   /* stop here, and copy so we don't have to do this twice */
   tmp_pathspec = xstrdup (newargz[0]);
 
   /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
   strcat (newargz[0], actual_cwrapper_name);
 
   /* DO want the lt- prefix here if it exists, so use target_name */
   lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
   XFREE (tmp_pathspec);
   tmp_pathspec = NULL;
 EOF
 
 	    case $host_os in
 	      mingw*)
 	    cat <<"EOF"
   {
     char* p;
     while ((p = strchr (newargz[0], '\\')) != NULL)
       {
 	*p = '/';
       }
     while ((p = strchr (lt_argv_zero, '\\')) != NULL)
       {
 	*p = '/';
       }
   }
 EOF
 	    ;;
 	    esac
 
 	    cat <<"EOF"
   XFREE (target_name);
   XFREE (actual_cwrapper_path);
   XFREE (actual_cwrapper_name);
 
   lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
   lt_setenv ("DUALCASE", "1");  /* for MSK sh */
   /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
      be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
      because on Windows, both *_VARNAMEs are PATH but uninstalled
      libraries must come first. */
   lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
   lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
 
   lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
 		  nonnull (lt_argv_zero));
   for (i = 0; i < newargc; i++)
     {
       lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
 		      i, nonnull (newargz[i]));
     }
 
 EOF
 
 	    case $host_os in
 	      mingw*)
 		cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
   rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
       lt_debugprintf (__FILE__, __LINE__,
 		      "(main) failed to launch target \"%s\": %s\n",
 		      lt_argv_zero, nonnull (strerror (errno)));
       return 127;
     }
   return rval;
 EOF
 		;;
 	      *)
 		cat <<"EOF"
   execv (lt_argv_zero, newargz);
   return rval; /* =127, but avoids unused variable warning */
 EOF
 		;;
 	    esac
 
 	    cat <<"EOF"
 }
 
 void *
 xmalloc (size_t num)
 {
   void *p = (void *) malloc (num);
   if (!p)
     lt_fatal (__FILE__, __LINE__, "memory exhausted");
 
   return p;
 }
 
 char *
 xstrdup (const char *string)
 {
   return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
 			  string) : NULL;
 }
 
 const char *
 base_name (const char *name)
 {
   const char *base;
 
 #if defined HAVE_DOS_BASED_FILE_SYSTEM
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
 #endif
 
   for (base = name; *name; name++)
     if (IS_DIR_SEPARATOR (*name))
       base = name + 1;
   return base;
 }
 
 int
 check_executable (const char *path)
 {
   struct stat st;
 
   lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
                   nonempty (path));
   if ((!path) || (!*path))
     return 0;
 
   if ((stat (path, &st) >= 0)
       && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
     return 1;
   else
     return 0;
 }
 
 int
 make_executable (const char *path)
 {
   int rval = 0;
   struct stat st;
 
   lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
                   nonempty (path));
   if ((!path) || (!*path))
     return 0;
 
   if (stat (path, &st) >= 0)
     {
       rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
     }
   return rval;
 }
 
 /* Searches for the full path of the wrapper.  Returns
    newly allocated full path name if found, NULL otherwise
    Does not chase symlinks, even on platforms that support them.
 */
 char *
 find_executable (const char *wrapper)
 {
   int has_slash = 0;
   const char *p;
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
   size_t tmp_len;
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
                   nonempty (wrapper));
 
   if ((wrapper == NULL) || (*wrapper == '\0'))
     return NULL;
 
   /* Absolute path? */
 #if defined HAVE_DOS_BASED_FILE_SYSTEM
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
       if (check_executable (concat_name))
 	return concat_name;
       XFREE (concat_name);
     }
   else
     {
 #endif
       if (IS_DIR_SEPARATOR (wrapper[0]))
 	{
 	  concat_name = xstrdup (wrapper);
 	  if (check_executable (concat_name))
 	    return concat_name;
 	  XFREE (concat_name);
 	}
 #if defined HAVE_DOS_BASED_FILE_SYSTEM
     }
 #endif
 
   for (p = wrapper; *p; p++)
     if (*p == '/')
       {
 	has_slash = 1;
 	break;
       }
   if (!has_slash)
     {
       /* no slashes; search PATH */
       const char *path = getenv ("PATH");
       if (path != NULL)
 	{
 	  for (p = path; *p; p = p_next)
 	    {
 	      const char *q;
 	      size_t p_len;
 	      for (q = p; *q; q++)
 		if (IS_PATH_SEPARATOR (*q))
 		  break;
 	      p_len = (size_t) (q - p);
 	      p_next = (*q == '\0' ? q : q + 1);
 	      if (p_len == 0)
 		{
 		  /* empty path: current directory */
 		  if (getcwd (tmp, LT_PATHMAX) == NULL)
 		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
                               nonnull (strerror (errno)));
 		  tmp_len = strlen (tmp);
 		  concat_name =
 		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
 		  memcpy (concat_name, tmp, tmp_len);
 		  concat_name[tmp_len] = '/';
 		  strcpy (concat_name + tmp_len + 1, wrapper);
 		}
 	      else
 		{
 		  concat_name =
 		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
 		  memcpy (concat_name, p, p_len);
 		  concat_name[p_len] = '/';
 		  strcpy (concat_name + p_len + 1, wrapper);
 		}
 	      if (check_executable (concat_name))
 		return concat_name;
 	      XFREE (concat_name);
 	    }
 	}
       /* not found in PATH; assume curdir */
     }
   /* Relative path | not found in path: prepend cwd */
   if (getcwd (tmp, LT_PATHMAX) == NULL)
     lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
               nonnull (strerror (errno)));
   tmp_len = strlen (tmp);
   concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
   memcpy (concat_name, tmp, tmp_len);
   concat_name[tmp_len] = '/';
   strcpy (concat_name + tmp_len + 1, wrapper);
 
   if (check_executable (concat_name))
     return concat_name;
   XFREE (concat_name);
   return NULL;
 }
 
 char *
 chase_symlinks (const char *pathspec)
 {
 #ifndef S_ISLNK
   return xstrdup (pathspec);
 #else
   char buf[LT_PATHMAX];
   struct stat s;
   char *tmp_pathspec = xstrdup (pathspec);
   char *p;
   int has_symlinks = 0;
   while (strlen (tmp_pathspec) && !has_symlinks)
     {
       lt_debugprintf (__FILE__, __LINE__,
 		      "checking path component for symlinks: %s\n",
 		      tmp_pathspec);
       if (lstat (tmp_pathspec, &s) == 0)
 	{
 	  if (S_ISLNK (s.st_mode) != 0)
 	    {
 	      has_symlinks = 1;
 	      break;
 	    }
 
 	  /* search backwards for last DIR_SEPARATOR */
 	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
 	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
 	    p--;
 	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
 	    {
 	      /* no more DIR_SEPARATORS left */
 	      break;
 	    }
 	  *p = '\0';
 	}
       else
 	{
 	  lt_fatal (__FILE__, __LINE__,
 		    "error accessing file \"%s\": %s",
 		    tmp_pathspec, nonnull (strerror (errno)));
 	}
     }
   XFREE (tmp_pathspec);
 
   if (!has_symlinks)
     {
       return xstrdup (pathspec);
     }
 
   tmp_pathspec = realpath (pathspec, buf);
   if (tmp_pathspec == 0)
     {
       lt_fatal (__FILE__, __LINE__,
 		"could not follow symlinks for %s", pathspec);
     }
   return xstrdup (tmp_pathspec);
 #endif
 }
 
 char *
 strendzap (char *str, const char *pat)
 {
   size_t len, patlen;
 
   assert (str != NULL);
   assert (pat != NULL);
 
   len = strlen (str);
   patlen = strlen (pat);
 
   if (patlen <= len)
     {
       str += len - patlen;
       if (STREQ (str, pat))
 	*str = '\0';
     }
   return str;
 }
 
 void
 lt_debugprintf (const char *file, int line, const char *fmt, ...)
 {
   va_list args;
   if (lt_debug)
     {
       (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
       va_start (args, fmt);
       (void) vfprintf (stderr, fmt, args);
       va_end (args);
     }
 }
 
 static void
 lt_error_core (int exit_status, const char *file,
 	       int line, const char *mode,
 	       const char *message, va_list ap)
 {
   fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
   vfprintf (stderr, message, ap);
   fprintf (stderr, ".\n");
 
   if (exit_status >= 0)
     exit (exit_status);
 }
 
 void
 lt_fatal (const char *file, int line, const char *message, ...)
 {
   va_list ap;
   va_start (ap, message);
   lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
   va_end (ap);
 }
 
 static const char *
 nonnull (const char *s)
 {
   return s ? s : "(null)";
 }
 
 static const char *
 nonempty (const char *s)
 {
   return (s && !*s) ? "(empty)" : nonnull (s);
 }
 
 void
 lt_setenv (const char *name, const char *value)
 {
   lt_debugprintf (__FILE__, __LINE__,
 		  "(lt_setenv) setting '%s' to '%s'\n",
                   nonnull (name), nonnull (value));
   {
 #ifdef HAVE_SETENV
     /* always make a copy, for consistency with !HAVE_SETENV */
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
     size_t len = strlen (name) + 1 + strlen (value) + 1;
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
       {
         XFREE (str);
       }
 #endif
   }
 }
 
 char *
 lt_extend_str (const char *orig_value, const char *add, int to_end)
 {
   char *new_value;
   if (orig_value && *orig_value)
     {
       size_t orig_value_len = strlen (orig_value);
       size_t add_len = strlen (add);
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
           strcpy (new_value, orig_value);
           strcpy (new_value + orig_value_len, add);
         }
       else
         {
           strcpy (new_value, add);
           strcpy (new_value + add_len, orig_value);
         }
     }
   else
     {
       new_value = xstrdup (add);
     }
   return new_value;
 }
 
 void
 lt_update_exe_path (const char *name, const char *value)
 {
   lt_debugprintf (__FILE__, __LINE__,
 		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
                   nonnull (name), nonnull (value));
 
   if (name && *name && value && *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
       size_t len = strlen (new_value);
       while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
         {
           new_value[--len] = '\0';
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
     }
 }
 
 void
 lt_update_lib_path (const char *name, const char *value)
 {
   lt_debugprintf (__FILE__, __LINE__,
 		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
                   nonnull (name), nonnull (value));
 
   if (name && *name && value && *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       lt_setenv (name, new_value);
       XFREE (new_value);
     }
 }
 
 EOF
 	    case $host_os in
 	      mingw*)
 		cat <<"EOF"
 
 /* Prepares an argument vector before calling spawn().
    Note that spawn() does not by itself call the command interpreter
      (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
       ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
          GetVersionEx(&v);
          v.dwPlatformId == VER_PLATFORM_WIN32_NT;
       }) ? "cmd.exe" : "command.com").
    Instead it simply concatenates the arguments, separated by ' ', and calls
    CreateProcess().  We must quote the arguments since Win32 CreateProcess()
    interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
    special way:
    - Space and tab are interpreted as delimiters. They are not treated as
      delimiters if they are surrounded by double quotes: "...".
    - Unescaped double quotes are removed from the input. Their only effect is
      that within double quotes, space and tab are treated like normal
      characters.
    - Backslashes not followed by double quotes are not special.
    - But 2*n+1 backslashes followed by a double quote become
      n backslashes followed by a double quote (n >= 0):
        \" -> "
        \\\" -> \"
        \\\\\" -> \\"
  */
 #define SHELL_SPECIAL_CHARS "\"\\ \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"
 #define SHELL_SPACE_CHARS " \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"
 char **
 prepare_spawn (char **argv)
 {
   size_t argc;
   char **new_argv;
   size_t i;
 
   /* Count number of arguments.  */
   for (argc = 0; argv[argc] != NULL; argc++)
     ;
 
   /* Allocate new argument vector.  */
   new_argv = XMALLOC (char *, argc + 1);
 
   /* Put quoted arguments into the new argument vector.  */
   for (i = 0; i < argc; i++)
     {
       const char *string = argv[i];
 
       if (string[0] == '\0')
 	new_argv[i] = xstrdup ("\"\"");
       else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
 	{
 	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
 	  size_t length;
 	  unsigned int backslashes;
 	  const char *s;
 	  char *quoted_string;
 	  char *p;
 
 	  length = 0;
 	  backslashes = 0;
 	  if (quote_around)
 	    length++;
 	  for (s = string; *s != '\0'; s++)
 	    {
 	      char c = *s;
 	      if (c == '"')
 		length += backslashes + 1;
 	      length++;
 	      if (c == '\\')
 		backslashes++;
 	      else
 		backslashes = 0;
 	    }
 	  if (quote_around)
 	    length += backslashes + 1;
 
 	  quoted_string = XMALLOC (char, length + 1);
 
 	  p = quoted_string;
 	  backslashes = 0;
 	  if (quote_around)
 	    *p++ = '"';
 	  for (s = string; *s != '\0'; s++)
 	    {
 	      char c = *s;
 	      if (c == '"')
 		{
 		  unsigned int j;
 		  for (j = backslashes + 1; j > 0; j--)
 		    *p++ = '\\';
 		}
 	      *p++ = c;
 	      if (c == '\\')
 		backslashes++;
 	      else
 		backslashes = 0;
 	    }
 	  if (quote_around)
 	    {
 	      unsigned int j;
 	      for (j = backslashes; j > 0; j--)
 		*p++ = '\\';
 	      *p++ = '"';
 	    }
 	  *p = '\0';
 
 	  new_argv[i] = quoted_string;
 	}
       else
 	new_argv[i] = (char *) string;
     }
   new_argv[argc] = NULL;
 
   return new_argv;
 }
 EOF
 		;;
 	    esac
 
             cat <<"EOF"
 void lt_dump_script (FILE* f)
 {
 EOF
 	    func_emit_wrapper yes |
 	      $SED -n -e '
 s/^\(.\{79\}\)\(..*\)/\1\
 \2/
 h
 s/\([\\"]\)/\\\1/g
 s/$/\\n/
 s/\([^\n]*\).*/  fputs ("\1", f);/p
 g
 D'
             cat <<"EOF"
 }
 EOF
 }
 # end: func_emit_cwrapperexe_src
 
 # func_win32_import_lib_p ARG
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
     $debug_cmd
 
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
 # func_suncc_cstd_abi
 # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
 # Several compiler flags select an ABI that is incompatible with the
 # Cstd library. Avoid specifying it if any are in CXXFLAGS.
 func_suncc_cstd_abi ()
 {
     $debug_cmd
 
     case " $compile_command " in
     *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
       suncc_use_cstd_abi=no
       ;;
     *)
       suncc_use_cstd_abi=yes
       ;;
     esac
 }
 
 # func_mode_link arg...
 func_mode_link ()
 {
     $debug_cmd
 
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
       # what system we are compiling for in order to pass an extra
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
       # to make a dll that has undefined symbols, in which case not
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
       allow_undefined=yes
       ;;
     *)
       allow_undefined=yes
       ;;
     esac
     libtool_args=$nonopt
     base_compile="$nonopt $@"
     compile_command=$nonopt
     finalize_command=$nonopt
 
     compile_rpath=
     finalize_rpath=
     compile_shlibpath=
     finalize_shlibpath=
     convenience=
     old_convenience=
     deplibs=
     old_deplibs=
     compiler_flags=
     linker_flags=
     dllsearchpath=
     lib_search_path=`pwd`
     inst_prefix_dir=
     new_inherited_linker_flags=
 
     avoid_version=no
     bindir=
     dlfiles=
     dlprefiles=
     dlself=no
     export_dynamic=no
     export_symbols=
     export_symbols_regex=
     generated=
     libobjs=
     ltlibs=
     module=no
     no_install=no
     objs=
     os2dllname=
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
     preload=false
     prev=
     prevarg=
     release=
     rpath=
     xrpath=
     perm_rpath=
     temp_rpath=
     thread_safe=no
     vinfo=
     vinfo_number=no
     weak_libs=
     single_module=$wl-single_module
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
     for arg
     do
       case $arg in
       -shared)
 	test yes != "$build_libtool_libs" \
 	  && func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	break
 	;;
       -all-static | -static | -static-libtool-libs)
 	case $arg in
 	-all-static)
 	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
 	    func_warning "complete static linking is impossible in this configuration"
 	  fi
 	  if test -n "$link_static_flag"; then
 	    dlopen_self=$dlopen_self_static
 	  fi
 	  prefer_static_libs=yes
 	  ;;
 	-static)
 	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
 	    dlopen_self=$dlopen_self_static
 	  fi
 	  prefer_static_libs=built
 	  ;;
 	-static-libtool-libs)
 	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
 	    dlopen_self=$dlopen_self_static
 	  fi
 	  prefer_static_libs=yes
 	  ;;
 	esac
 	build_libtool_libs=no
 	build_old_libs=yes
 	break
 	;;
       esac
     done
 
     # See if our shared archives depend on static archives.
     test -n "$old_archive_from_new_cmds" && build_old_libs=yes
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
       arg=$1
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
       func_append libtool_args " $func_quote_for_eval_result"
 
       # If the previous option needs an argument, assign it.
       if test -n "$prev"; then
 	case $prev in
 	output)
 	  func_append compile_command " @OUTPUT@"
 	  func_append finalize_command " @OUTPUT@"
 	  ;;
 	esac
 
 	case $prev in
 	bindir)
 	  bindir=$arg
 	  prev=
 	  continue
 	  ;;
 	dlfiles|dlprefiles)
 	  $preload || {
 	    # Add the symbol object into the linking commands.
 	    func_append compile_command " @SYMFILE@"
 	    func_append finalize_command " @SYMFILE@"
 	    preload=:
 	  }
 	  case $arg in
 	  *.la | *.lo) ;;  # We handle these cases below.
 	  force)
 	    if test no = "$dlself"; then
 	      dlself=needless
 	      export_dynamic=yes
 	    fi
 	    prev=
 	    continue
 	    ;;
 	  self)
 	    if test dlprefiles = "$prev"; then
 	      dlself=yes
 	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
 	      dlself=yes
 	    else
 	      dlself=needless
 	      export_dynamic=yes
 	    fi
 	    prev=
 	    continue
 	    ;;
 	  *)
 	    if test dlfiles = "$prev"; then
 	      func_append dlfiles " $arg"
 	    else
 	      func_append dlprefiles " $arg"
 	    fi
 	    prev=
 	    continue
 	    ;;
 	  esac
 	  ;;
 	expsyms)
 	  export_symbols=$arg
 	  test -f "$arg" \
 	    || func_fatal_error "symbol file '$arg' does not exist"
 	  prev=
 	  continue
 	  ;;
 	expsyms_regex)
 	  export_symbols_regex=$arg
 	  prev=
 	  continue
 	  ;;
 	framework)
 	  case $host in
 	    *-*-darwin*)
 	      case "$deplibs " in
 		*" $qarg.ltframework "*) ;;
 		*) func_append deplibs " $qarg.ltframework" # this is fixed later
 		   ;;
 	      esac
 	      ;;
 	  esac
 	  prev=
 	  continue
 	  ;;
 	inst_prefix)
 	  inst_prefix_dir=$arg
 	  prev=
 	  continue
 	  ;;
 	mllvm)
 	  # Clang does not use LLVM to link, so we can simply discard any
 	  # '-mllvm $arg' options when doing the link step.
 	  prev=
 	  continue
 	  ;;
 	objectlist)
 	  if test -f "$arg"; then
 	    save_arg=$arg
 	    moreargs=
 	    for fil in `cat "$save_arg"`
 	    do
 #	      func_append moreargs " $fil"
 	      arg=$fil
 	      # A libtool-controlled object.
 
 	      # Check to see that this really is a libtool object.
 	      if func_lalib_unsafe_p "$arg"; then
 		pic_object=
 		non_pic_object=
 
 		# Read the .lo file
 		func_source "$arg"
 
 		if test -z "$pic_object" ||
 		   test -z "$non_pic_object" ||
 		   test none = "$pic_object" &&
 		   test none = "$non_pic_object"; then
 		  func_fatal_error "cannot find name of object for '$arg'"
 		fi
 
 		# Extract subdirectory from the argument.
 		func_dirname "$arg" "/" ""
 		xdir=$func_dirname_result
 
 		if test none != "$pic_object"; then
 		  # Prepend the subdirectory the object is found in.
 		  pic_object=$xdir$pic_object
 
 		  if test dlfiles = "$prev"; then
 		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		      func_append dlfiles " $pic_object"
 		      prev=
 		      continue
 		    else
 		      # If libtool objects are unsupported, then we need to preload.
 		      prev=dlprefiles
 		    fi
 		  fi
 
 		  # CHECK ME:  I think I busted this.  -Ossama
 		  if test dlprefiles = "$prev"; then
 		    # Preload the old-style object.
 		    func_append dlprefiles " $pic_object"
 		    prev=
 		  fi
 
 		  # A PIC object.
 		  func_append libobjs " $pic_object"
 		  arg=$pic_object
 		fi
 
 		# Non-PIC object.
 		if test none != "$non_pic_object"; then
 		  # Prepend the subdirectory the object is found in.
 		  non_pic_object=$xdir$non_pic_object
 
 		  # A standard non-PIC object
 		  func_append non_pic_objects " $non_pic_object"
 		  if test -z "$pic_object" || test none = "$pic_object"; then
 		    arg=$non_pic_object
 		  fi
 		else
 		  # If the PIC object exists, use it instead.
 		  # $xdir was prepended to $pic_object above.
 		  non_pic_object=$pic_object
 		  func_append non_pic_objects " $non_pic_object"
 		fi
 	      else
 		# Only an error if not doing a dry-run.
 		if $opt_dry_run; then
 		  # Extract subdirectory from the argument.
 		  func_dirname "$arg" "/" ""
 		  xdir=$func_dirname_result
 
 		  func_lo2o "$arg"
 		  pic_object=$xdir$objdir/$func_lo2o_result
 		  non_pic_object=$xdir$func_lo2o_result
 		  func_append libobjs " $pic_object"
 		  func_append non_pic_objects " $non_pic_object"
 	        else
 		  func_fatal_error "'$arg' is not a valid libtool object"
 		fi
 	      fi
 	    done
 	  else
 	    func_fatal_error "link input file '$arg' does not exist"
 	  fi
 	  arg=$save_arg
 	  prev=
 	  continue
 	  ;;
 	os2dllname)
 	  os2dllname=$arg
 	  prev=
 	  continue
 	  ;;
 	precious_regex)
 	  precious_files_regex=$arg
 	  prev=
 	  continue
 	  ;;
 	release)
 	  release=-$arg
 	  prev=
 	  continue
 	  ;;
 	rpath | xrpath)
 	  # We need an absolute path.
 	  case $arg in
 	  [\\/]* | [A-Za-z]:[\\/]*) ;;
 	  *)
 	    func_fatal_error "only absolute run-paths are allowed"
 	    ;;
 	  esac
 	  if test rpath = "$prev"; then
 	    case "$rpath " in
 	    *" $arg "*) ;;
 	    *) func_append rpath " $arg" ;;
 	    esac
 	  else
 	    case "$xrpath " in
 	    *" $arg "*) ;;
 	    *) func_append xrpath " $arg" ;;
 	    esac
 	  fi
 	  prev=
 	  continue
 	  ;;
 	shrext)
 	  shrext_cmds=$arg
 	  prev=
 	  continue
 	  ;;
 	weak)
 	  func_append weak_libs " $arg"
 	  prev=
 	  continue
 	  ;;
 	xcclinker)
 	  func_append linker_flags " $qarg"
 	  func_append compiler_flags " $qarg"
 	  prev=
 	  func_append compile_command " $qarg"
 	  func_append finalize_command " $qarg"
 	  continue
 	  ;;
 	xcompiler)
 	  func_append compiler_flags " $qarg"
 	  prev=
 	  func_append compile_command " $qarg"
 	  func_append finalize_command " $qarg"
 	  continue
 	  ;;
 	xlinker)
 	  func_append linker_flags " $qarg"
 	  func_append compiler_flags " $wl$qarg"
 	  prev=
 	  func_append compile_command " $wl$qarg"
 	  func_append finalize_command " $wl$qarg"
 	  continue
 	  ;;
 	*)
 	  eval "$prev=\"\$arg\""
 	  prev=
 	  continue
 	  ;;
 	esac
       fi # test -n "$prev"
 
       prevarg=$arg
 
       case $arg in
       -all-static)
 	if test -n "$link_static_flag"; then
 	  # See comment for -static flag below, for more details.
 	  func_append compile_command " $link_static_flag"
 	  func_append finalize_command " $link_static_flag"
 	fi
 	continue
 	;;
 
       -allow-undefined)
 	# FIXME: remove this flag sometime in the future.
 	func_fatal_error "'-allow-undefined' must not be used because it is the default"
 	;;
 
       -avoid-version)
 	avoid_version=yes
 	continue
 	;;
 
       -bindir)
 	prev=bindir
 	continue
 	;;
 
       -dlopen)
 	prev=dlfiles
 	continue
 	;;
 
       -dlpreopen)
 	prev=dlprefiles
 	continue
 	;;
 
       -export-dynamic)
 	export_dynamic=yes
 	continue
 	;;
 
       -export-symbols | -export-symbols-regex)
 	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
 	  func_fatal_error "more than one -exported-symbols argument is not allowed"
 	fi
 	if test X-export-symbols = "X$arg"; then
 	  prev=expsyms
 	else
 	  prev=expsyms_regex
 	fi
 	continue
 	;;
 
       -framework)
 	prev=framework
 	continue
 	;;
 
       -inst-prefix-dir)
 	prev=inst_prefix
 	continue
 	;;
 
       # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
       # so, if we see these flags be careful not to treat them like -L
       -L[A-Z][A-Z]*:*)
 	case $with_gcc/$host in
 	no/*-*-irix* | /*-*-irix*)
 	  func_append compile_command " $arg"
 	  func_append finalize_command " $arg"
 	  ;;
 	esac
 	continue
 	;;
 
       -L*)
 	func_stripname "-L" '' "$arg"
 	if test -z "$func_stripname_result"; then
 	  if test "$#" -gt 0; then
 	    func_fatal_error "require no space between '-L' and '$1'"
 	  else
 	    func_fatal_error "need path for '-L' option"
 	  fi
 	fi
 	func_resolve_sysroot "$func_stripname_result"
 	dir=$func_resolve_sysroot_result
 	# We need an absolute path.
 	case $dir in
 	[\\/]* | [A-Za-z]:[\\/]*) ;;
 	*)
 	  absdir=`cd "$dir" && pwd`
 	  test -z "$absdir" && \
 	    func_fatal_error "cannot determine absolute directory name of '$dir'"
 	  dir=$absdir
 	  ;;
 	esac
 	case "$deplibs " in
 	*" -L$dir "* | *" $arg "*)
 	  # Will only happen for absolute or sysroot arguments
 	  ;;
 	*)
 	  # Preserve sysroot, but never include relative directories
 	  case $dir in
 	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
 	    *) func_append deplibs " -L$dir" ;;
 	  esac
 	  func_append lib_search_path " $dir"
 	  ;;
 	esac
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
 	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$dir:"*) ;;
 	  ::) dllsearchpath=$dir;;
 	  *) func_append dllsearchpath ":$dir";;
 	  esac
 	  case :$dllsearchpath: in
 	  *":$testbindir:"*) ;;
 	  ::) dllsearchpath=$testbindir;;
 	  *) func_append dllsearchpath ":$testbindir";;
 	  esac
 	  ;;
 	esac
 	continue
 	;;
 
       -l*)
 	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
 	    # These systems don't actually have a C or math library (as such)
 	    continue
 	    ;;
 	  *-*-os2*)
 	    # These systems don't actually have a C library (as such)
 	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	    # Do not include libc due to us having libc/libc_r.
 	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
 	    # Rhapsody C and math libraries are in the System framework
 	    func_append deplibs " System.ltframework"
 	    continue
 	    ;;
 	  *-*-sco3.2v5* | *-*-sco5v6*)
 	    # Causes problems with __ctype
 	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
 	    # Compiler inserts libc in the correct place for threads to work
 	    test X-lc = "X$arg" && continue
 	    ;;
 	  esac
 	elif test X-lc_r = "X$arg"; then
 	 case $host in
 	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	   # Do not include libc_r directly, use -pthread flag.
 	   continue
 	   ;;
 	 esac
 	fi
 	func_append deplibs " $arg"
 	continue
 	;;
 
       -mllvm)
 	prev=mllvm
 	continue
 	;;
 
       -module)
 	module=yes
 	continue
 	;;
 
       # Tru64 UNIX uses -model [arg] to determine the layout of C++
       # classes, name mangling, and exception handling.
       # Darwin uses the -arch flag to determine output architecture.
       -model|-arch|-isysroot|--sysroot)
 	func_append compiler_flags " $arg"
 	func_append compile_command " $arg"
 	func_append finalize_command " $arg"
 	prev=xcompiler
 	continue
 	;;
 
       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
       |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
 	func_append compiler_flags " $arg"
 	func_append compile_command " $arg"
 	func_append finalize_command " $arg"
 	case "$new_inherited_linker_flags " in
 	    *" $arg "*) ;;
 	    * ) func_append new_inherited_linker_flags " $arg" ;;
 	esac
 	continue
 	;;
 
       -multi_module)
 	single_module=$wl-multi_module
 	continue
 	;;
 
       -no-fast-install)
 	fast_install=no
 	continue
 	;;
 
       -no-install)
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
 	  # The PATH hackery in wrapper scripts is required on Windows
 	  # and Darwin in order for the loader to find any dlls it needs.
 	  func_warning "'-no-install' is ignored for $host"
 	  func_warning "assuming '-no-fast-install' instead"
 	  fast_install=no
 	  ;;
 	*) no_install=yes ;;
 	esac
 	continue
 	;;
 
       -no-undefined)
 	allow_undefined=no
 	continue
 	;;
 
       -objectlist)
 	prev=objectlist
 	continue
 	;;
 
       -os2dllname)
 	prev=os2dllname
 	continue
 	;;
 
       -o) prev=output ;;
 
       -precious-files-regex)
 	prev=precious_regex
 	continue
 	;;
 
       -release)
 	prev=release
 	continue
 	;;
 
       -rpath)
 	prev=rpath
 	continue
 	;;
 
       -R)
 	prev=xrpath
 	continue
 	;;
 
       -R*)
 	func_stripname '-R' '' "$arg"
 	dir=$func_stripname_result
 	# We need an absolute path.
 	case $dir in
 	[\\/]* | [A-Za-z]:[\\/]*) ;;
 	=*)
 	  func_stripname '=' '' "$dir"
 	  dir=$lt_sysroot$func_stripname_result
 	  ;;
 	*)
 	  func_fatal_error "only absolute run-paths are allowed"
 	  ;;
 	esac
 	case "$xrpath " in
 	*" $dir "*) ;;
 	*) func_append xrpath " $dir" ;;
 	esac
 	continue
 	;;
 
       -shared)
 	# The effects of -shared are defined in a previous loop.
 	continue
 	;;
 
       -shrext)
 	prev=shrext
 	continue
 	;;
 
       -static | -static-libtool-libs)
 	# The effects of -static are defined in a previous loop.
 	# We used to do the same as -all-static on platforms that
 	# didn't have a PIC flag, but the assumption that the effects
 	# would be equivalent was wrong.  It would break on at least
 	# Digital Unix and AIX.
 	continue
 	;;
 
       -thread-safe)
 	thread_safe=yes
 	continue
 	;;
 
       -version-info)
 	prev=vinfo
 	continue
 	;;
 
       -version-number)
 	prev=vinfo
 	vinfo_number=yes
 	continue
 	;;
 
       -weak)
         prev=weak
 	continue
 	;;
 
       -Wc,*)
 	func_stripname '-Wc,' '' "$arg"
 	args=$func_stripname_result
 	arg=
 	save_ifs=$IFS; IFS=,
 	for flag in $args; do
 	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $func_quote_for_eval_result"
 	  func_append compiler_flags " $func_quote_for_eval_result"
 	done
 	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
 
       -Wl,*)
 	func_stripname '-Wl,' '' "$arg"
 	args=$func_stripname_result
 	arg=
 	save_ifs=$IFS; IFS=,
 	for flag in $args; do
 	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $wl$func_quote_for_eval_result"
 	  func_append compiler_flags " $wl$func_quote_for_eval_result"
 	  func_append linker_flags " $func_quote_for_eval_result"
 	done
 	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
 
       -Xcompiler)
 	prev=xcompiler
 	continue
 	;;
 
       -Xlinker)
 	prev=xlinker
 	continue
 	;;
 
       -XCClinker)
 	prev=xcclinker
 	continue
 	;;
 
       # -msg_* for osf cc
       -msg_*)
 	func_quote_for_eval "$arg"
 	arg=$func_quote_for_eval_result
 	;;
 
       # Flags to be passed through unchanged, with rationale:
       # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
       # -r[0-9][0-9]*        specify processor for the SGI compiler
       # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
       # +DA*, +DD*           enable 64-bit mode for the HP compiler
       # -q*                  compiler args for the IBM compiler
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
       # -fstack-protector*   stack protector flags for GCC
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
       # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
       # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang memory and address sanitizer
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*)
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -fsanitize=*)
         func_quote_for_eval "$arg"
 	arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
       -Z*)
         if test os2 = "`expr $host : '.*\(os2\)'`"; then
           # OS/2 uses -Zxxx to specify OS/2-specific options
 	  compiler_flags="$compiler_flags $arg"
 	  func_append compile_command " $arg"
 	  func_append finalize_command " $arg"
 	  case $arg in
 	  -Zlinker | -Zstack)
 	    prev=xcompiler
 	    ;;
 	  esac
 	  continue
         else
 	  # Otherwise treat like 'Some other compiler flag' below
 	  func_quote_for_eval "$arg"
 	  arg=$func_quote_for_eval_result
         fi
 	;;
 
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
 	arg=$func_quote_for_eval_result
 	;;
 
       *.$objext)
 	# A standard object.
 	func_append objs " $arg"
 	;;
 
       *.lo)
 	# A libtool-controlled object.
 
 	# Check to see that this really is a libtool object.
 	if func_lalib_unsafe_p "$arg"; then
 	  pic_object=
 	  non_pic_object=
 
 	  # Read the .lo file
 	  func_source "$arg"
 
 	  if test -z "$pic_object" ||
 	     test -z "$non_pic_object" ||
 	     test none = "$pic_object" &&
 	     test none = "$non_pic_object"; then
 	    func_fatal_error "cannot find name of object for '$arg'"
 	  fi
 
 	  # Extract subdirectory from the argument.
 	  func_dirname "$arg" "/" ""
 	  xdir=$func_dirname_result
 
 	  test none = "$pic_object" || {
 	    # Prepend the subdirectory the object is found in.
 	    pic_object=$xdir$pic_object
 
 	    if test dlfiles = "$prev"; then
 	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		func_append dlfiles " $pic_object"
 		prev=
 		continue
 	      else
 		# If libtool objects are unsupported, then we need to preload.
 		prev=dlprefiles
 	      fi
 	    fi
 
 	    # CHECK ME:  I think I busted this.  -Ossama
 	    if test dlprefiles = "$prev"; then
 	      # Preload the old-style object.
 	      func_append dlprefiles " $pic_object"
 	      prev=
 	    fi
 
 	    # A PIC object.
 	    func_append libobjs " $pic_object"
 	    arg=$pic_object
 	  }
 
 	  # Non-PIC object.
 	  if test none != "$non_pic_object"; then
 	    # Prepend the subdirectory the object is found in.
 	    non_pic_object=$xdir$non_pic_object
 
 	    # A standard non-PIC object
 	    func_append non_pic_objects " $non_pic_object"
 	    if test -z "$pic_object" || test none = "$pic_object"; then
 	      arg=$non_pic_object
 	    fi
 	  else
 	    # If the PIC object exists, use it instead.
 	    # $xdir was prepended to $pic_object above.
 	    non_pic_object=$pic_object
 	    func_append non_pic_objects " $non_pic_object"
 	  fi
 	else
 	  # Only an error if not doing a dry-run.
 	  if $opt_dry_run; then
 	    # Extract subdirectory from the argument.
 	    func_dirname "$arg" "/" ""
 	    xdir=$func_dirname_result
 
 	    func_lo2o "$arg"
 	    pic_object=$xdir$objdir/$func_lo2o_result
 	    non_pic_object=$xdir$func_lo2o_result
 	    func_append libobjs " $pic_object"
 	    func_append non_pic_objects " $non_pic_object"
 	  else
 	    func_fatal_error "'$arg' is not a valid libtool object"
 	  fi
 	fi
 	;;
 
       *.$libext)
 	# An archive.
 	func_append deplibs " $arg"
 	func_append old_deplibs " $arg"
 	continue
 	;;
 
       *.la)
 	# A libtool-controlled library.
 
 	func_resolve_sysroot "$arg"
 	if test dlfiles = "$prev"; then
 	  # This library was specified with -dlopen.
 	  func_append dlfiles " $func_resolve_sysroot_result"
 	  prev=
 	elif test dlprefiles = "$prev"; then
 	  # The library was specified with -dlpreopen.
 	  func_append dlprefiles " $func_resolve_sysroot_result"
 	  prev=
 	else
 	  func_append deplibs " $func_resolve_sysroot_result"
 	fi
 	continue
 	;;
 
       # Some other compiler argument.
       *)
 	# Unknown arguments in both finalize_command and compile_command need
 	# to be aesthetically quoted because they are evaled later.
 	func_quote_for_eval "$arg"
 	arg=$func_quote_for_eval_result
 	;;
       esac # arg
 
       # Now actually substitute the argument into the commands.
       if test -n "$arg"; then
 	func_append compile_command " $arg"
 	func_append finalize_command " $arg"
       fi
     done # argument parsing loop
 
     test -n "$prev" && \
       func_fatal_help "the '$prevarg' option requires an argument"
 
     if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
     fi
 
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
     outputname=$func_basename_result
     libobjs_save=$libobjs
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
       eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
     # Definition is injected by LT_CONFIG during libtool generation.
     func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
 
     func_dirname "$output" "/" ""
     output_objdir=$func_dirname_result$objdir
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
     func_mkdir_p "$output_objdir"
 
     # Determine the type of output
     case $output in
     "")
       func_fatal_help "you must specify an output file"
       ;;
     *.$libext) linkmode=oldlib ;;
     *.lo | *.$objext) linkmode=obj ;;
     *.la) linkmode=lib ;;
     *) linkmode=prog ;; # Anything else should be a program.
     esac
 
     specialdeplibs=
 
     libs=
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
       if $opt_preserve_dup_deps; then
 	case "$libs " in
 	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	esac
       fi
       func_append libs " $deplib"
     done
 
     if test lib = "$linkmode"; then
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
       # $postdeps and mark them as special (i.e., whose duplicates are
       # not to be eliminated).
       pre_post_deps=
       if $opt_duplicate_compiler_generated_deps; then
 	for pre_post_dep in $predeps $postdeps; do
 	  case "$pre_post_deps " in
 	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
 	  esac
 	  func_append pre_post_deps " $pre_post_dep"
 	done
       fi
       pre_post_deps=
     fi
 
     deplibs=
     newdependency_libs=
     newlib_search_path=
     need_relink=no # whether we're linking any uninstalled libtool libraries
     notinst_deplibs= # not-installed libtool libraries
     notinst_path= # paths that contain not-installed libtool libraries
 
     case $linkmode in
     lib)
 	passes="conv dlpreopen link"
 	for file in $dlfiles $dlprefiles; do
 	  case $file in
 	  *.la) ;;
 	  *)
 	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
 	    ;;
 	  esac
 	done
 	;;
     prog)
 	compile_deplibs=
 	finalize_deplibs=
 	alldeplibs=false
 	newdlfiles=
 	newdlprefiles=
 	passes="conv scan dlopen dlpreopen link"
 	;;
     *)  passes="conv"
 	;;
     esac
 
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
       if test lib,link = "$linkmode,$pass"; then
 	## FIXME: Find the place where the list is rebuilt in the wrong
 	##        order, and fix it there properly
         tmp_deplibs=
 	for deplib in $deplibs; do
 	  tmp_deplibs="$deplib $tmp_deplibs"
 	done
 	deplibs=$tmp_deplibs
       fi
 
       if test lib,link = "$linkmode,$pass" ||
 	 test prog,scan = "$linkmode,$pass"; then
 	libs=$deplibs
 	deplibs=
       fi
       if test prog = "$linkmode"; then
 	case $pass in
 	dlopen) libs=$dlfiles ;;
 	dlpreopen) libs=$dlprefiles ;;
 	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
 	esac
       fi
       if test lib,dlpreopen = "$linkmode,$pass"; then
 	# Collect and forward deplibs of preopened libtool libs
 	for lib in $dlprefiles; do
 	  # Ignore non-libtool-libs
 	  dependency_libs=
 	  func_resolve_sysroot "$lib"
 	  case $lib in
 	  *.la)	func_source "$func_resolve_sysroot_result" ;;
 	  esac
 
 	  # Collect preopened libtool deplibs, except any this library
 	  # has declared as weak libs
 	  for deplib in $dependency_libs; do
 	    func_basename "$deplib"
             deplib_base=$func_basename_result
 	    case " $weak_libs " in
 	    *" $deplib_base "*) ;;
 	    *) func_append deplibs " $deplib" ;;
 	    esac
 	  done
 	done
 	libs=$dlprefiles
       fi
       if test dlopen = "$pass"; then
 	# Collect dlpreopened libraries
 	save_deplibs=$deplibs
 	deplibs=
       fi
 
       for deplib in $libs; do
 	lib=
 	found=false
 	case $deplib in
 	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
 	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    func_append compiler_flags " $deplib"
 	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
 		esac
 	    fi
 	  fi
 	  continue
 	  ;;
 	-l*)
 	  if test lib != "$linkmode" && test prog != "$linkmode"; then
 	    func_warning "'-l' is ignored for archives/objects"
 	    continue
 	  fi
 	  func_stripname '-l' '' "$deplib"
 	  name=$func_stripname_result
 	  if test lib = "$linkmode"; then
 	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
 	  else
 	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
 	  fi
 	  for searchdir in $searchdirs; do
 	    for search_ext in .la $std_shrext .so .a; do
 	      # Search the libtool library
 	      lib=$searchdir/lib$name$search_ext
 	      if test -f "$lib"; then
 		if test .la = "$search_ext"; then
 		  found=:
 		else
 		  found=false
 		fi
 		break 2
 	      fi
 	    done
 	  done
 	  if $found; then
 	    # deplib is a libtool library
 	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
 	    # We need to do some special things here, and not later.
 	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 	      case " $predeps $postdeps " in
 	      *" $deplib "*)
 		if func_lalib_p "$lib"; then
 		  library_names=
 		  old_library=
 		  func_source "$lib"
 		  for l in $old_library $library_names; do
 		    ll=$l
 		  done
 		  if test "X$ll" = "X$old_library"; then # only static version available
 		    found=false
 		    func_dirname "$lib" "" "."
 		    ladir=$func_dirname_result
 		    lib=$ladir/$old_library
 		    if test prog,link = "$linkmode,$pass"; then
 		      compile_deplibs="$deplib $compile_deplibs"
 		      finalize_deplibs="$deplib $finalize_deplibs"
 		    else
 		      deplibs="$deplib $deplibs"
 		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
 		    fi
 		    continue
 		  fi
 		fi
 		;;
 	      *) ;;
 	      esac
 	    fi
 	  else
 	    # deplib doesn't seem to be a libtool library
 	    if test prog,link = "$linkmode,$pass"; then
 	      compile_deplibs="$deplib $compile_deplibs"
 	      finalize_deplibs="$deplib $finalize_deplibs"
 	    else
 	      deplibs="$deplib $deplibs"
 	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
 	    fi
 	    continue
 	  fi
 	  ;; # -l
 	*.ltframework)
 	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    deplibs="$deplib $deplibs"
 	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
 		esac
 	    fi
 	  fi
 	  continue
 	  ;;
 	-L*)
 	  case $linkmode in
 	  lib)
 	    deplibs="$deplib $deplibs"
 	    test conv = "$pass" && continue
 	    newdependency_libs="$deplib $newdependency_libs"
 	    func_stripname '-L' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  prog)
 	    if test conv = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	      continue
 	    fi
 	    if test scan = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
 	      finalize_deplibs="$deplib $finalize_deplibs"
 	    fi
 	    func_stripname '-L' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  *)
 	    func_warning "'-L' is ignored for archives/objects"
 	    ;;
 	  esac # linkmode
 	  continue
 	  ;; # -L
 	-R*)
 	  if test link = "$pass"; then
 	    func_stripname '-R' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    dir=$func_resolve_sysroot_result
 	    # Make sure the xrpath contains only unique directories.
 	    case "$xrpath " in
 	    *" $dir "*) ;;
 	    *) func_append xrpath " $dir" ;;
 	    esac
 	  fi
 	  deplibs="$deplib $deplibs"
 	  continue
 	  ;;
 	*.la)
 	  func_resolve_sysroot "$deplib"
 	  lib=$func_resolve_sysroot_result
 	  ;;
 	*.$libext)
 	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
 	    continue
 	  fi
 	  case $linkmode in
 	  lib)
 	    # Linking convenience modules into shared libraries is allowed,
 	    # but linking other static libraries is non-portable.
 	    case " $dlpreconveniencelibs " in
 	    *" $deplib "*) ;;
 	    *)
 	      valid_a_lib=false
 	      case $deplibs_check_method in
 		match_pattern*)
 		  set dummy $deplibs_check_method; shift
 		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
 		    | $EGREP "$match_pattern_regex" > /dev/null; then
 		    valid_a_lib=:
 		  fi
 		;;
 		pass_all)
 		  valid_a_lib=:
 		;;
 	      esac
 	      if $valid_a_lib; then
 		echo
 		$ECHO "*** Warning: Linking the shared library $output against the"
 		$ECHO "*** static library $deplib is not portable!"
 		deplibs="$deplib $deplibs"
 	      else
 		echo
 		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
 		echo "*** I have the capability to make that library automatically link in when"
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because the file extensions .$libext of this argument makes me believe"
 		echo "*** that it is just a static archive that I should not use here."
 	      fi
 	      ;;
 	    esac
 	    continue
 	    ;;
 	  prog)
 	    if test link != "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
 	      finalize_deplibs="$deplib $finalize_deplibs"
 	    fi
 	    continue
 	    ;;
 	  esac # linkmode
 	  ;; # *.$libext
 	*.lo | *.$objext)
 	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
 	  elif test prog = "$linkmode"; then
 	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
 	      # If there is no dlopen support or we're linking statically,
 	      # we need to preload.
 	      func_append newdlprefiles " $deplib"
 	      compile_deplibs="$deplib $compile_deplibs"
 	      finalize_deplibs="$deplib $finalize_deplibs"
 	    else
 	      func_append newdlfiles " $deplib"
 	    fi
 	  fi
 	  continue
 	  ;;
 	%DEPLIBS%)
 	  alldeplibs=:
 	  continue
 	  ;;
 	esac # case $deplib
 
 	$found || test -f "$lib" \
 	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$lib" \
 	  || func_fatal_error "'$lib' is not a valid libtool archive"
 
 	func_dirname "$lib" "" "."
 	ladir=$func_dirname_result
 
 	dlname=
 	dlopen=
 	dlpreopen=
 	libdir=
 	library_names=
 	old_library=
 	inherited_linker_flags=
 	# If the library was installed with an old release of libtool,
 	# it will not redefine variables installed, or shouldnotlink
 	installed=yes
 	shouldnotlink=no
 	avoidtemprpath=
 
 
 	# Read the .la file
 	func_source "$lib"
 
 	# Convert "-framework foo" to "foo.ltframework"
 	if test -n "$inherited_linker_flags"; then
 	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
 	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
 	    case " $new_inherited_linker_flags " in
 	      *" $tmp_inherited_linker_flag "*) ;;
 	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
 	    esac
 	  done
 	fi
 	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	if test lib,link = "$linkmode,$pass" ||
 	   test prog,scan = "$linkmode,$pass" ||
 	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
 	  test -n "$dlopen" && func_append dlfiles " $dlopen"
 	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
 	fi
 
 	if test conv = "$pass"; then
 	  # Only check for convenience libraries
 	  deplibs="$lib $deplibs"
 	  if test -z "$libdir"; then
 	    if test -z "$old_library"; then
 	      func_fatal_error "cannot find name of link library for '$lib'"
 	    fi
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
 	    func_append old_convenience " $ladir/$objdir/$old_library"
 	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
 	    func_fatal_error "'$lib' is not a convenience library"
 	  fi
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
 	    deplibs="$deplib $deplibs"
 	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	      esac
 	    fi
 	    func_append tmp_libs " $deplib"
 	  done
 	  continue
 	fi # $pass = conv
 
 
 	# Get the name of the library we link against.
 	linklib=
 	if test -n "$old_library" &&
 	   { test yes = "$prefer_static_libs" ||
 	     test built,no = "$prefer_static_libs,$installed"; }; then
 	  linklib=$old_library
 	else
 	  for l in $old_library $library_names; do
 	    linklib=$l
 	  done
 	fi
 	if test -z "$linklib"; then
 	  func_fatal_error "cannot find name of link library for '$lib'"
 	fi
 
 	# This library was specified with -dlopen.
 	if test dlopen = "$pass"; then
 	  test -z "$libdir" \
 	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
 	  if test -z "$dlname" ||
 	     test yes != "$dlopen_support" ||
 	     test no = "$build_libtool_libs"
 	  then
 	    # If there is no dlname, no dlopen support or we're linking
 	    # statically, we need to preload.  We also need to preload any
 	    # dependent libraries so libltdl's deplib preloader doesn't
 	    # bomb out in the load deplibs phase.
 	    func_append dlprefiles " $lib $dependency_libs"
 	  else
 	    func_append newdlfiles " $lib"
 	  fi
 	  continue
 	fi # $pass = dlopen
 
 	# We need an absolute path.
 	case $ladir in
 	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
 	*)
 	  abs_ladir=`cd "$ladir" && pwd`
 	  if test -z "$abs_ladir"; then
 	    func_warning "cannot determine absolute directory name of '$ladir'"
 	    func_warning "passing it literally to the linker, although it might fail"
 	    abs_ladir=$ladir
 	  fi
 	  ;;
 	esac
 	func_basename "$lib"
 	laname=$func_basename_result
 
 	# Find the relevant object directory and library name.
 	if test yes = "$installed"; then
 	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
 	    func_warning "library '$lib' was moved."
 	    dir=$ladir
 	    absdir=$abs_ladir
 	    libdir=$abs_ladir
 	  else
 	    dir=$lt_sysroot$libdir
 	    absdir=$lt_sysroot$libdir
 	  fi
 	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
 	else
 	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
 	    dir=$ladir
 	    absdir=$abs_ladir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  else
 	    dir=$ladir/$objdir
 	    absdir=$abs_ladir/$objdir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  fi
 	fi # $installed = yes
 	func_stripname 'lib' '.la' "$laname"
 	name=$func_stripname_result
 
 	# This library was specified with -dlpreopen.
 	if test dlpreopen = "$pass"; then
 	  if test -z "$libdir" && test prog = "$linkmode"; then
 	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
 	  fi
 	  case $host in
 	    # special handling for platforms with PE-DLLs.
 	    *cygwin* | *mingw* | *cegcc* )
 	      # Linker will automatically link against shared library if both
 	      # static and shared are present.  Therefore, ensure we extract
 	      # symbols from the import library if a shared library is present
 	      # (otherwise, the dlopen module name will be incorrect).  We do
 	      # this by putting the import library name into $newdlprefiles.
 	      # We recover the dlopen module name by 'saving' the la file
 	      # name in a special purpose variable, and (later) extracting the
 	      # dlname from the la file.
 	      if test -n "$dlname"; then
 	        func_tr_sh "$dir/$linklib"
 	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
 	        func_append newdlprefiles " $dir/$linklib"
 	      else
 	        func_append newdlprefiles " $dir/$old_library"
 	        # Keep a list of preopened convenience libraries to check
 	        # that they are being used correctly in the link pass.
 	        test -z "$libdir" && \
 	          func_append dlpreconveniencelibs " $dir/$old_library"
 	      fi
 	    ;;
 	    * )
 	      # Prefer using a static library (so that no silly _DYNAMIC symbols
 	      # are required to link).
 	      if test -n "$old_library"; then
 	        func_append newdlprefiles " $dir/$old_library"
 	        # Keep a list of preopened convenience libraries to check
 	        # that they are being used correctly in the link pass.
 	        test -z "$libdir" && \
 	          func_append dlpreconveniencelibs " $dir/$old_library"
 	      # Otherwise, use the dlname, so that lt_dlopen finds it.
 	      elif test -n "$dlname"; then
 	        func_append newdlprefiles " $dir/$dlname"
 	      else
 	        func_append newdlprefiles " $dir/$linklib"
 	      fi
 	    ;;
 	  esac
 	fi # $pass = dlpreopen
 
 	if test -z "$libdir"; then
 	  # Link the convenience library
 	  if test lib = "$linkmode"; then
 	    deplibs="$dir/$old_library $deplibs"
 	  elif test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$dir/$old_library $compile_deplibs"
 	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
 	  else
 	    deplibs="$lib $deplibs" # used for prog,scan pass
 	  fi
 	  continue
 	fi
 
 
 	if test prog = "$linkmode" && test link != "$pass"; then
 	  func_append newlib_search_path " $ladir"
 	  deplibs="$lib $deplibs"
 
 	  linkalldeplibs=false
 	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
 	     test no = "$build_libtool_libs"; then
 	    linkalldeplibs=:
 	  fi
 
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
 	    case $deplib in
 	    -L*) func_stripname '-L' '' "$deplib"
 	         func_resolve_sysroot "$func_stripname_result"
 	         func_append newlib_search_path " $func_resolve_sysroot_result"
 		 ;;
 	    esac
 	    # Need to link against all dependency_libs?
 	    if $linkalldeplibs; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      # Need to hardcode shared library paths
 	      # or/and link against static libraries
 	      newdependency_libs="$deplib $newdependency_libs"
 	    fi
 	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	      esac
 	    fi
 	    func_append tmp_libs " $deplib"
 	  done # for deplib
 	  continue
 	fi # $linkmode = prog...
 
 	if test prog,link = "$linkmode,$pass"; then
 	  if test -n "$library_names" &&
 	     { { test no = "$prefer_static_libs" ||
 	         test built,yes = "$prefer_static_libs,$installed"; } ||
 	       test -z "$old_library"; }; then
 	    # We need to hardcode the library path
 	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
 	      # Make sure the rpath contains only unique directories.
 	      case $temp_rpath: in
 	      *"$absdir:"*) ;;
 	      *) func_append temp_rpath "$absdir:" ;;
 	      esac
 	    fi
 
 	    # Hardcode the library path.
 	    # Skip directories that are in the system default run-time
 	    # search path.
 	    case " $sys_lib_dlsearch_path " in
 	    *" $absdir "*) ;;
 	    *)
 	      case "$compile_rpath " in
 	      *" $absdir "*) ;;
 	      *) func_append compile_rpath " $absdir" ;;
 	      esac
 	      ;;
 	    esac
 	    case " $sys_lib_dlsearch_path " in
 	    *" $libdir "*) ;;
 	    *)
 	      case "$finalize_rpath " in
 	      *" $libdir "*) ;;
 	      *) func_append finalize_rpath " $libdir" ;;
 	      esac
 	      ;;
 	    esac
 	  fi # $linkmode,$pass = prog,link...
 
 	  if $alldeplibs &&
 	     { test pass_all = "$deplibs_check_method" ||
 	       { test yes = "$build_libtool_libs" &&
 		 test -n "$library_names"; }; }; then
 	    # We only need to search for static libraries
 	    continue
 	  fi
 	fi
 
 	link_static=no # Whether the deplib will be linked statically
 	use_static_libs=$prefer_static_libs
 	if test built = "$use_static_libs" && test yes = "$installed"; then
 	  use_static_libs=no
 	fi
 	if test -n "$library_names" &&
 	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
 	  case $host in
 	  *cygwin* | *mingw* | *cegcc* | *os2*)
 	      # No point in relinking DLLs because paths are not encoded
 	      func_append notinst_deplibs " $lib"
 	      need_relink=no
 	    ;;
 	  *)
 	    if test no = "$installed"; then
 	      func_append notinst_deplibs " $lib"
 	      need_relink=yes
 	    fi
 	    ;;
 	  esac
 	  # This is a shared library
 
 	  # Warn about portability, can't link against -module's on some
 	  # systems (darwin).  Don't bleat about dlopened modules though!
 	  dlopenmodule=
 	  for dlpremoduletest in $dlprefiles; do
 	    if test "X$dlpremoduletest" = "X$lib"; then
 	      dlopenmodule=$dlpremoduletest
 	      break
 	    fi
 	  done
 	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
 	    echo
 	    if test prog = "$linkmode"; then
 	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
 	    else
 	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
 	    fi
 	    $ECHO "*** $linklib is not portable!"
 	  fi
 	  if test lib = "$linkmode" &&
 	     test yes = "$hardcode_into_libs"; then
 	    # Hardcode the library path.
 	    # Skip directories that are in the system default run-time
 	    # search path.
 	    case " $sys_lib_dlsearch_path " in
 	    *" $absdir "*) ;;
 	    *)
 	      case "$compile_rpath " in
 	      *" $absdir "*) ;;
 	      *) func_append compile_rpath " $absdir" ;;
 	      esac
 	      ;;
 	    esac
 	    case " $sys_lib_dlsearch_path " in
 	    *" $libdir "*) ;;
 	    *)
 	      case "$finalize_rpath " in
 	      *" $libdir "*) ;;
 	      *) func_append finalize_rpath " $libdir" ;;
 	      esac
 	      ;;
 	    esac
 	  fi
 
 	  if test -n "$old_archive_from_expsyms_cmds"; then
 	    # figure out the soname
 	    set dummy $library_names
 	    shift
 	    realname=$1
 	    shift
 	    libname=`eval "\\$ECHO \"$libname_spec\""`
 	    # use dlname if we got it. it's perfectly good, no?
 	    if test -n "$dlname"; then
 	      soname=$dlname
 	    elif test -n "$soname_spec"; then
 	      # bleh windows
 	      case $host in
 	      *cygwin* | mingw* | *cegcc* | *os2*)
 	        func_arith $current - $age
 		major=$func_arith_result
 		versuffix=-$major
 		;;
 	      esac
 	      eval soname=\"$soname_spec\"
 	    else
 	      soname=$realname
 	    fi
 
 	    # Make a new name for the extract_expsyms_cmds to use
 	    soroot=$soname
 	    func_basename "$soroot"
 	    soname=$func_basename_result
 	    func_stripname 'lib' '.dll' "$soname"
 	    newlib=libimp-$func_stripname_result.a
 
 	    # If the library has no export list, then create one now
 	    if test -f "$output_objdir/$soname-def"; then :
 	    else
 	      func_verbose "extracting exported symbol list from '$soname'"
 	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
 	    fi
 
 	    # Create $newlib
 	    if test -f "$output_objdir/$newlib"; then :; else
 	      func_verbose "generating import library for '$soname'"
 	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
 	    fi
 	    # make sure the library variables are pointing to the new library
 	    dir=$output_objdir
 	    linklib=$newlib
 	  fi # test -n "$old_archive_from_expsyms_cmds"
 
 	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    lib_linked=yes
 	    case $hardcode_action in
 	    immediate | unsupported)
 	      if test no = "$hardcode_direct"; then
 		add=$dir/$linklib
 		case $host in
 		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
 		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
 		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
 		    *-*-unixware7*) add_dir=-L$dir ;;
 		  *-*-darwin* )
 		    # if the lib is a (non-dlopened) module then we cannot
 		    # link against it, someone is ignoring the earlier warnings
 		    if /usr/bin/file -L $add 2> /dev/null |
 			 $GREP ": [^:]* bundle" >/dev/null; then
 		      if test "X$dlopenmodule" != "X$lib"; then
 			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
 			if test -z "$old_library"; then
 			  echo
 			  echo "*** And there doesn't seem to be a static archive available"
 			  echo "*** The link will probably fail, sorry"
 			else
 			  add=$dir/$old_library
 			fi
 		      elif test -n "$old_library"; then
 			add=$dir/$old_library
 		      fi
 		    fi
 		esac
 	      elif test no = "$hardcode_minus_L"; then
 		case $host in
 		*-*-sunos*) add_shlibpath=$dir ;;
 		esac
 		add_dir=-L$dir
 		add=-l$name
 	      elif test no = "$hardcode_shlibpath_var"; then
 		add_shlibpath=$dir
 		add=-l$name
 	      else
 		lib_linked=no
 	      fi
 	      ;;
 	    relink)
 	      if test yes = "$hardcode_direct" &&
 	         test no = "$hardcode_direct_absolute"; then
 		add=$dir/$linklib
 	      elif test yes = "$hardcode_minus_L"; then
 		add_dir=-L$absdir
 		# Try looking first in the location we're being installed to.
 		if test -n "$inst_prefix_dir"; then
 		  case $libdir in
 		    [\\/]*)
 		      func_append add_dir " -L$inst_prefix_dir$libdir"
 		      ;;
 		  esac
 		fi
 		add=-l$name
 	      elif test yes = "$hardcode_shlibpath_var"; then
 		add_shlibpath=$dir
 		add=-l$name
 	      else
 		lib_linked=no
 	      fi
 	      ;;
 	    *) lib_linked=no ;;
 	    esac
 
 	    if test yes != "$lib_linked"; then
 	      func_fatal_configuration "unsupported hardcode properties"
 	    fi
 
 	    if test -n "$add_shlibpath"; then
 	      case :$compile_shlibpath: in
 	      *":$add_shlibpath:"*) ;;
 	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
 	      esac
 	    fi
 	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
 	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
 	    else
 	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
 	      test -n "$add" && deplibs="$add $deplibs"
 	      if test yes != "$hardcode_direct" &&
 		 test yes != "$hardcode_minus_L" &&
 		 test yes = "$hardcode_shlibpath_var"; then
 		case :$finalize_shlibpath: in
 		*":$libdir:"*) ;;
 		*) func_append finalize_shlibpath "$libdir:" ;;
 		esac
 	      fi
 	    fi
 	  fi
 
 	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    # Finalize command for both is simple: just hardcode it.
 	    if test yes = "$hardcode_direct" &&
 	       test no = "$hardcode_direct_absolute"; then
 	      add=$libdir/$linklib
 	    elif test yes = "$hardcode_minus_L"; then
 	      add_dir=-L$libdir
 	      add=-l$name
 	    elif test yes = "$hardcode_shlibpath_var"; then
 	      case :$finalize_shlibpath: in
 	      *":$libdir:"*) ;;
 	      *) func_append finalize_shlibpath "$libdir:" ;;
 	      esac
 	      add=-l$name
 	    elif test yes = "$hardcode_automatic"; then
 	      if test -n "$inst_prefix_dir" &&
 		 test -f "$inst_prefix_dir$libdir/$linklib"; then
 		add=$inst_prefix_dir$libdir/$linklib
 	      else
 		add=$libdir/$linklib
 	      fi
 	    else
 	      # We cannot seem to hardcode it, guess we'll fake it.
 	      add_dir=-L$libdir
 	      # Try looking first in the location we're being installed to.
 	      if test -n "$inst_prefix_dir"; then
 		case $libdir in
 		  [\\/]*)
 		    func_append add_dir " -L$inst_prefix_dir$libdir"
 		    ;;
 		esac
 	      fi
 	      add=-l$name
 	    fi
 
 	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
 	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
 	    else
 	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
 	      test -n "$add" && deplibs="$add $deplibs"
 	    fi
 	  fi
 	elif test prog = "$linkmode"; then
 	  # Here we assume that one of hardcode_direct or hardcode_minus_L
 	  # is not unsupported.  This is valid on all known static and
 	  # shared platforms.
 	  if test unsupported != "$hardcode_direct"; then
 	    test -n "$old_library" && linklib=$old_library
 	    compile_deplibs="$dir/$linklib $compile_deplibs"
 	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
 	  else
 	    compile_deplibs="-l$name -L$dir $compile_deplibs"
 	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
 	  fi
 	elif test yes = "$build_libtool_libs"; then
 	  # Not a shared library
 	  if test pass_all != "$deplibs_check_method"; then
 	    # We're trying link a shared library against a static one
 	    # but the system doesn't support it.
 
 	    # Just print a warning and add the library to dependency_libs so
 	    # that the program can be linked against the static library.
 	    echo
 	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
 	    echo "*** I have the capability to make that library automatically link in when"
 	    echo "*** you link to this library.  But I can only do this if you have a"
 	    echo "*** shared version of the library, which you do not appear to have."
 	    if test yes = "$module"; then
 	      echo "*** But as you try to build a module library, libtool will still create "
 	      echo "*** a static module, that should work as long as the dlopening application"
 	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
 	      if test -z "$global_symbol_pipe"; then
 		echo
 		echo "*** However, this would only work if libtool was able to extract symbol"
 		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 		echo "*** not find such a program.  So, this module is probably useless."
 		echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	      fi
 	      if test no = "$build_old_libs"; then
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
 		build_libtool_libs=no
 	      fi
 	    fi
 	  else
 	    deplibs="$dir/$old_library $deplibs"
 	    link_static=yes
 	  fi
 	fi # link shared/static library?
 
 	if test lib = "$linkmode"; then
 	  if test -n "$dependency_libs" &&
 	     { test yes != "$hardcode_into_libs" ||
 	       test yes = "$build_old_libs" ||
 	       test yes = "$link_static"; }; then
 	    # Extract -R from dependency_libs
 	    temp_deplibs=
 	    for libdir in $dependency_libs; do
 	      case $libdir in
 	      -R*) func_stripname '-R' '' "$libdir"
 	           temp_xrpath=$func_stripname_result
 		   case " $xrpath " in
 		   *" $temp_xrpath "*) ;;
 		   *) func_append xrpath " $temp_xrpath";;
 		   esac;;
 	      *) func_append temp_deplibs " $libdir";;
 	      esac
 	    done
 	    dependency_libs=$temp_deplibs
 	  fi
 
 	  func_append newlib_search_path " $absdir"
 	  # Link against this library
 	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
 	  # ... and its dependency_libs
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
 	    newdependency_libs="$deplib $newdependency_libs"
 	    case $deplib in
               -L*) func_stripname '-L' '' "$deplib"
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
 	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
 	      esac
 	    fi
 	    func_append tmp_libs " $func_resolve_sysroot_result"
 	  done
 
 	  if test no != "$link_all_deplibs"; then
 	    # Add the search paths of all dependency libraries
 	    for deplib in $dependency_libs; do
 	      path=
 	      case $deplib in
 	      -L*) path=$deplib ;;
 	      *.la)
 	        func_resolve_sysroot "$deplib"
 	        deplib=$func_resolve_sysroot_result
 	        func_dirname "$deplib" "" "."
 		dir=$func_dirname_result
 		# We need an absolute path.
 		case $dir in
 		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
 		*)
 		  absdir=`cd "$dir" && pwd`
 		  if test -z "$absdir"; then
 		    func_warning "cannot determine absolute directory name of '$dir'"
 		    absdir=$dir
 		  fi
 		  ;;
 		esac
 		if $GREP "^installed=no" $deplib > /dev/null; then
 		case $host in
 		*-*-darwin*)
 		  depdepl=
 		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
 		  if test -n "$deplibrary_names"; then
 		    for tmp in $deplibrary_names; do
 		      depdepl=$tmp
 		    done
 		    if test -f "$absdir/$objdir/$depdepl"; then
 		      depdepl=$absdir/$objdir/$depdepl
 		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                       if test -z "$darwin_install_name"; then
                           darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
 		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
 		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
 		      path=
 		    fi
 		  fi
 		  ;;
 		*)
 		  path=-L$absdir/$objdir
 		  ;;
 		esac
 		else
 		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
 		  test -z "$libdir" && \
 		    func_fatal_error "'$deplib' is not a valid libtool archive"
 		  test "$absdir" != "$libdir" && \
 		    func_warning "'$deplib' seems to be moved"
 
 		  path=-L$absdir
 		fi
 		;;
 	      esac
 	      case " $deplibs " in
 	      *" $path "*) ;;
 	      *) deplibs="$path $deplibs" ;;
 	      esac
 	    done
 	  fi # link_all_deplibs != no
 	fi # linkmode = lib
       done # for deplib in $libs
       if test link = "$pass"; then
 	if test prog = "$linkmode"; then
 	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
 	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
 	else
 	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	fi
       fi
       dependency_libs=$newdependency_libs
       if test dlpreopen = "$pass"; then
 	# Link the dlpreopened libraries before other libraries
 	for deplib in $save_deplibs; do
 	  deplibs="$deplib $deplibs"
 	done
       fi
       if test dlopen != "$pass"; then
 	test conv = "$pass" || {
 	  # Make sure lib_search_path contains only unique directories.
 	  lib_search_path=
 	  for dir in $newlib_search_path; do
 	    case "$lib_search_path " in
 	    *" $dir "*) ;;
 	    *) func_append lib_search_path " $dir" ;;
 	    esac
 	  done
 	  newlib_search_path=
 	}
 
 	if test prog,link = "$linkmode,$pass"; then
 	  vars="compile_deplibs finalize_deplibs"
 	else
 	  vars=deplibs
 	fi
 	for var in $vars dependency_libs; do
 	  # Add libraries to $var in reverse order
 	  eval tmp_libs=\"\$$var\"
 	  new_libs=
 	  for deplib in $tmp_libs; do
 	    # FIXME: Pedantically, this is the right thing to do, so
 	    #        that some nasty dependency loop isn't accidentally
 	    #        broken:
 	    #new_libs="$deplib $new_libs"
 	    # Pragmatically, this seems to cause very few problems in
 	    # practice:
 	    case $deplib in
 	    -L*) new_libs="$deplib $new_libs" ;;
 	    -R*) ;;
 	    *)
 	      # And here is the reason: when a library appears more
 	      # than once as an explicit dependence of a library, or
 	      # is implicitly linked in more than once by the
 	      # compiler, it is considered special, and multiple
 	      # occurrences thereof are not removed.  Compare this
 	      # with having the same library being listed as a
 	      # dependency of multiple other libraries: in this case,
 	      # we know (pedantically, we assume) the library does not
 	      # need to be listed more than once, so we keep only the
 	      # last copy.  This is not always right, but it is rare
 	      # enough that we require users that really mean to play
 	      # such unportable linking tricks to link the library
 	      # using -Wl,-lname, so that libtool does not consider it
 	      # for duplicate removal.
 	      case " $specialdeplibs " in
 	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
 	      *)
 		case " $new_libs " in
 		*" $deplib "*) ;;
 		*) new_libs="$deplib $new_libs" ;;
 		esac
 		;;
 	      esac
 	      ;;
 	    esac
 	  done
 	  tmp_libs=
 	  for deplib in $new_libs; do
 	    case $deplib in
 	    -L*)
 	      case " $tmp_libs " in
 	      *" $deplib "*) ;;
 	      *) func_append tmp_libs " $deplib" ;;
 	      esac
 	      ;;
 	    *) func_append tmp_libs " $deplib" ;;
 	    esac
 	  done
 	  eval $var=\"$tmp_libs\"
 	done # for var
       fi
 
       # Add Sun CC postdeps if required:
       test CXX = "$tagname" && {
         case $host_os in
         linux*)
           case `$CC -V 2>&1 | sed 5q` in
           *Sun\ C*) # Sun C++ 5.9
             func_suncc_cstd_abi
 
             if test no != "$suncc_use_cstd_abi"; then
               func_append postdeps ' -library=Cstd -library=Crun'
             fi
             ;;
           esac
           ;;
 
         solaris*)
           func_cc_basename "$CC"
           case $func_cc_basename_result in
           CC* | sunCC*)
             func_suncc_cstd_abi
 
             if test no != "$suncc_use_cstd_abi"; then
               func_append postdeps ' -library=Cstd -library=Crun'
             fi
             ;;
           esac
           ;;
         esac
       }
 
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
       for i in $dependency_libs; do
 	case " $predeps $postdeps $compiler_lib_search_path " in
 	*" $i "*)
 	  i=
 	  ;;
 	esac
 	if test -n "$i"; then
 	  func_append tmp_libs " $i"
 	fi
       done
       dependency_libs=$tmp_libs
     done # for pass
     if test prog = "$linkmode"; then
       dlfiles=$newdlfiles
     fi
     if test prog = "$linkmode" || test lib = "$linkmode"; then
       dlprefiles=$newdlprefiles
     fi
 
     case $linkmode in
     oldlib)
       if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
 	func_warning "'-dlopen' is ignored for archives"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
 	func_warning "'-l' and '-L' are ignored for archives" ;;
       esac
 
       test -n "$rpath" && \
 	func_warning "'-rpath' is ignored for archives"
 
       test -n "$xrpath" && \
 	func_warning "'-R' is ignored for archives"
 
       test -n "$vinfo" && \
 	func_warning "'-version-info/-version-number' is ignored for archives"
 
       test -n "$release" && \
 	func_warning "'-release' is ignored for archives"
 
       test -n "$export_symbols$export_symbols_regex" && \
 	func_warning "'-export-symbols' is ignored for archives"
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
       oldlibs=$output
       func_append objs "$old_deplibs"
       ;;
 
     lib)
       # Make sure we only generate libraries of the form 'libNAME.la'.
       case $outputname in
       lib*)
 	func_stripname 'lib' '.la' "$outputname"
 	name=$func_stripname_result
 	eval shared_ext=\"$shrext_cmds\"
 	eval libname=\"$libname_spec\"
 	;;
       *)
 	test no = "$module" \
 	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
 
 	if test no != "$need_lib_prefix"; then
 	  # Add the "lib" prefix for modules if required
 	  func_stripname '' '.la' "$outputname"
 	  name=$func_stripname_result
 	  eval shared_ext=\"$shrext_cmds\"
 	  eval libname=\"$libname_spec\"
 	else
 	  func_stripname '' '.la' "$outputname"
 	  libname=$func_stripname_result
 	fi
 	;;
       esac
 
       if test -n "$objs"; then
 	if test pass_all != "$deplibs_check_method"; then
 	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
 	else
 	  echo
 	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
 	  $ECHO "*** objects $objs is not portable!"
 	  func_append libobjs " $objs"
 	fi
       fi
 
       test no = "$dlself" \
 	|| func_warning "'-dlopen self' is ignored for libtool libraries"
 
       set dummy $rpath
       shift
       test 1 -lt "$#" \
 	&& func_warning "ignoring multiple '-rpath's for a libtool library"
 
       install_libdir=$1
 
       oldlibs=
       if test -z "$rpath"; then
 	if test yes = "$build_libtool_libs"; then
 	  # Building a libtool convenience library.
 	  # Some compilers have problems with a '.al' extension so
 	  # convenience libraries should have the same extension an
 	  # archive normally would.
 	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
 	  build_libtool_libs=convenience
 	  build_old_libs=yes
 	fi
 
 	test -n "$vinfo" && \
 	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
 
 	test -n "$release" && \
 	  func_warning "'-release' is ignored for convenience libraries"
       else
 
 	# Parse the version information argument.
 	save_ifs=$IFS; IFS=:
 	set dummy $vinfo 0 0 0
 	shift
 	IFS=$save_ifs
 
 	test -n "$7" && \
 	  func_fatal_help "too many parameters to '-version-info'"
 
 	# convert absolute version numbers to libtool ages
 	# this retains compatibility with .la files and attempts
 	# to make the code below a bit more comprehensible
 
 	case $vinfo_number in
 	yes)
 	  number_major=$1
 	  number_minor=$2
 	  number_revision=$3
 	  #
 	  # There are really only two kinds -- those that
 	  # use the current revision as the major version
 	  # and those that subtract age and use age as
 	  # a minor version.  But, then there is irix
 	  # that has an extra 1 added just for fun
 	  #
 	  case $version_type in
 	  # correct linux to gnu/linux during the next big refactor
 	  darwin|freebsd-elf|linux|osf|windows|none)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
 	    age=$number_minor
 	    revision=$number_revision
 	    ;;
 	  freebsd-aout|qnx|sunos)
 	    current=$number_major
 	    revision=$number_minor
 	    age=0
 	    ;;
 	  irix|nonstopux)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
 	    age=$number_minor
 	    revision=$number_minor
 	    lt_irix_increment=no
 	    ;;
 	  esac
 	  ;;
 	no)
 	  current=$1
 	  revision=$2
 	  age=$3
 	  ;;
 	esac
 
 	# Check that each of the things are valid numbers.
 	case $current in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
 	  func_error "CURRENT '$current' must be a nonnegative integer"
 	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $revision in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
 	  func_error "REVISION '$revision' must be a nonnegative integer"
 	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $age in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
 	  func_error "AGE '$age' must be a nonnegative integer"
 	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	if test "$age" -gt "$current"; then
 	  func_error "AGE '$age' is greater than the current interface number '$current'"
 	  func_fatal_error "'$vinfo' is not valid version information"
 	fi
 
 	# Calculate the version variables.
 	major=
 	versuffix=
 	verstring=
 	case $version_type in
 	none) ;;
 
 	darwin)
 	  # Like Linux, but with the current version available in
 	  # verstring for coding it into the library header
 	  func_arith $current - $age
 	  major=.$func_arith_result
 	  versuffix=$major.$age.$revision
 	  # Darwin ld doesn't like 0 for these options...
 	  func_arith $current + 1
 	  minor_current=$func_arith_result
 	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
 	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
           # On Darwin other compilers
           case $CC in
               nagfor*)
                   verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
                   ;;
               *)
                   verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
                   ;;
           esac
 	  ;;
 
 	freebsd-aout)
 	  major=.$current
 	  versuffix=.$current.$revision
 	  ;;
 
 	freebsd-elf)
 	  func_arith $current - $age
 	  major=.$func_arith_result
 	  versuffix=$major.$age.$revision
 	  ;;
 
 	irix | nonstopux)
 	  if test no = "$lt_irix_increment"; then
 	    func_arith $current - $age
 	  else
 	    func_arith $current - $age + 1
 	  fi
 	  major=$func_arith_result
 
 	  case $version_type in
 	    nonstopux) verstring_prefix=nonstopux ;;
 	    *)         verstring_prefix=sgi ;;
 	  esac
 	  verstring=$verstring_prefix$major.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$revision
 	  while test 0 -ne "$loop"; do
 	    func_arith $revision - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
 	    verstring=$verstring_prefix$major.$iface:$verstring
 	  done
 
 	  # Before this point, $major must not contain '.'.
 	  major=.$major
 	  versuffix=$major.$revision
 	  ;;
 
 	linux) # correct to gnu/linux during the next big refactor
 	  func_arith $current - $age
 	  major=.$func_arith_result
 	  versuffix=$major.$age.$revision
 	  ;;
 
 	osf)
 	  func_arith $current - $age
 	  major=.$func_arith_result
 	  versuffix=.$current.$age.$revision
 	  verstring=$current.$age.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$age
 	  while test 0 -ne "$loop"; do
 	    func_arith $current - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
 	    verstring=$verstring:$iface.0
 	  done
 
 	  # Make executables depend on our current version.
 	  func_append verstring ":$current.0"
 	  ;;
 
 	qnx)
 	  major=.$current
 	  versuffix=.$current
 	  ;;
 
 	sco)
 	  major=.$current
 	  versuffix=.$current
 	  ;;
 
 	sunos)
 	  major=.$current
 	  versuffix=.$current.$revision
 	  ;;
 
 	windows)
 	  # Use '-' rather than '.', since we only want one
 	  # extension on DOS 8.3 file systems.
 	  func_arith $current - $age
 	  major=$func_arith_result
 	  versuffix=-$major
 	  ;;
 
 	*)
 	  func_fatal_configuration "unknown library version type '$version_type'"
 	  ;;
 	esac
 
 	# Clear the version info if we defaulted, and they specified a release.
 	if test -z "$vinfo" && test -n "$release"; then
 	  major=
 	  case $version_type in
 	  darwin)
 	    # we can't check for "0.0" in archive_cmds due to quoting
 	    # problems, so we reset it completely
 	    verstring=
 	    ;;
 	  *)
 	    verstring=0.0
 	    ;;
 	  esac
 	  if test no = "$need_version"; then
 	    versuffix=
 	  else
 	    versuffix=.0.0
 	  fi
 	fi
 
 	# Remove version info from name if versioning should be avoided
 	if test yes,no = "$avoid_version,$need_version"; then
 	  major=
 	  versuffix=
 	  verstring=
 	fi
 
 	# Check to see if the archive will have undefined symbols.
 	if test yes = "$allow_undefined"; then
 	  if test unsupported = "$allow_undefined_flag"; then
 	    if test yes = "$build_old_libs"; then
 	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
 	      build_libtool_libs=no
 	    else
 	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
 	    fi
 	  fi
 	else
 	  # Don't allow undefined symbols.
 	  allow_undefined_flag=$no_undefined_flag
 	fi
 
       fi
 
       func_generate_dlsyms "$libname" "$libname" :
       func_append libobjs " $symfileobj"
       test " " = "$libobjs" && libobjs=
 
       if test relink != "$opt_mode"; then
 	# Remove our outputs, but don't remove object files since they
 	# may have been created when compiling PIC objects.
 	removelist=
 	tempremovelist=`$ECHO "$output_objdir/*"`
 	for p in $tempremovelist; do
 	  case $p in
 	    *.$objext | *.gcno)
 	       ;;
 	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
 	       if test -n "$precious_files_regex"; then
 		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
 		 then
 		   continue
 		 fi
 	       fi
 	       func_append removelist " $p"
 	       ;;
 	    *) ;;
 	  esac
 	done
 	test -n "$removelist" && \
 	  func_show_eval "${RM}r \$removelist"
       fi
 
       # Now set the variables for building old libraries.
       if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
 	func_append oldlibs " $output_objdir/$libname.$libext"
 
 	# Transform .lo files to .o files.
 	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
       #for path in $notinst_path; do
       #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
       #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
       #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
       #done
 
       if test -n "$xrpath"; then
 	# If the user specified any rpath flags, then add them.
 	temp_xrpath=
 	for libdir in $xrpath; do
 	  func_replace_sysroot "$libdir"
 	  func_append temp_xrpath " -R$func_replace_sysroot_result"
 	  case "$finalize_rpath " in
 	  *" $libdir "*) ;;
 	  *) func_append finalize_rpath " $libdir" ;;
 	  esac
 	done
 	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
 	  dependency_libs="$temp_xrpath $dependency_libs"
 	fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
       old_dlfiles=$dlfiles
       dlfiles=
       for lib in $old_dlfiles; do
 	case " $dlprefiles $dlfiles " in
 	*" $lib "*) ;;
 	*) func_append dlfiles " $lib" ;;
 	esac
       done
 
       # Make sure dlprefiles contains only unique files
       old_dlprefiles=$dlprefiles
       dlprefiles=
       for lib in $old_dlprefiles; do
 	case "$dlprefiles " in
 	*" $lib "*) ;;
 	*) func_append dlprefiles " $lib" ;;
 	esac
       done
 
       if test yes = "$build_libtool_libs"; then
 	if test -n "$rpath"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
 	    # these systems don't actually have a c library (as such)!
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
 	    # Rhapsody C library is in the System framework
 	    func_append deplibs " System.ltframework"
 	    ;;
 	  *-*-netbsd*)
 	    # Don't link with libc until the a.out ld.so is fixed.
 	    ;;
 	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
 	    # Do not include libc due to us having libc/libc_r.
 	    ;;
 	  *-*-sco3.2v5* | *-*-sco5v6*)
 	    # Causes problems with __ctype
 	    ;;
 	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
 	    # Compiler inserts libc in the correct place for threads to work
 	    ;;
 	  *)
 	    # Add libc to deplibs on all other systems if necessary.
 	    if test yes = "$build_libtool_need_lc"; then
 	      func_append deplibs " -lc"
 	    fi
 	    ;;
 	  esac
 	fi
 
 	# Transform deplibs into only deplibs that can be linked in shared.
 	name_save=$name
 	libname_save=$libname
 	release_save=$release
 	versuffix_save=$versuffix
 	major_save=$major
 	# I'm not sure if I'm treating the release correctly.  I think
 	# release should show up in the -l (ie -lgmp5) so we don't want to
 	# add it in twice.  Is that correct?
 	release=
 	versuffix=
 	major=
 	newdeplibs=
 	droppeddeps=no
 	case $deplibs_check_method in
 	pass_all)
 	  # Don't check for shared/static.  Everything works.
 	  # This might be a little naive.  We might want to check
 	  # whether the library exists or not.  But this is on
 	  # osf3 & osf4 and I'm not really sure... Just
 	  # implementing what was already the behavior.
 	  newdeplibs=$deplibs
 	  ;;
 	test_compile)
 	  # This code stresses the "libraries are programs" paradigm to its
 	  # limits. Maybe even breaks it.  We compile a program, linking it
 	  # against the deplibs as a proxy for the library.  Then we can check
 	  # whether they linked in statically or dynamically with ldd.
 	  $opt_dry_run || $RM conftest.c
 	  cat > conftest.c <<EOF
 	  int main() { return 0; }
 EOF
 	  $opt_dry_run || $RM conftest
 	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
 	    ldd_output=`ldd conftest`
 	    for i in $deplibs; do
 	      case $i in
 	      -l*)
 		func_stripname -l '' "$i"
 		name=$func_stripname_result
 		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		  case " $predeps $postdeps " in
 		  *" $i "*)
 		    func_append newdeplibs " $i"
 		    i=
 		    ;;
 		  esac
 		fi
 		if test -n "$i"; then
 		  libname=`eval "\\$ECHO \"$libname_spec\""`
 		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		  set dummy $deplib_matches; shift
 		  deplib_match=$1
 		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		    func_append newdeplibs " $i"
 		  else
 		    droppeddeps=yes
 		    echo
 		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
 		    echo "*** I have the capability to make that library automatically link in when"
 		    echo "*** you link to this library.  But I can only do this if you have a"
 		    echo "*** shared version of the library, which I believe you do not have"
 		    echo "*** because a test_compile did reveal that the linker did not use it for"
 		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
 		  fi
 		fi
 		;;
 	      *)
 		func_append newdeplibs " $i"
 		;;
 	      esac
 	    done
 	  else
 	    # Error occurred in the first compile.  Let's try to salvage
 	    # the situation: Compile a separate program for each library.
 	    for i in $deplibs; do
 	      case $i in
 	      -l*)
 		func_stripname -l '' "$i"
 		name=$func_stripname_result
 		$opt_dry_run || $RM conftest
 		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
 		  ldd_output=`ldd conftest`
 		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		    case " $predeps $postdeps " in
 		    *" $i "*)
 		      func_append newdeplibs " $i"
 		      i=
 		      ;;
 		    esac
 		  fi
 		  if test -n "$i"; then
 		    libname=`eval "\\$ECHO \"$libname_spec\""`
 		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		    set dummy $deplib_matches; shift
 		    deplib_match=$1
 		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		      func_append newdeplibs " $i"
 		    else
 		      droppeddeps=yes
 		      echo
 		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
 		      echo "*** I have the capability to make that library automatically link in when"
 		      echo "*** you link to this library.  But I can only do this if you have a"
 		      echo "*** shared version of the library, which you do not appear to have"
 		      echo "*** because a test_compile did reveal that the linker did not use this one"
 		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
 		    fi
 		  fi
 		else
 		  droppeddeps=yes
 		  echo
 		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
 		  echo "*** make it link in!  You will probably need to install it or some"
 		  echo "*** library that it depends on before this library will be fully"
 		  echo "*** functional.  Installing it before continuing would be even better."
 		fi
 		;;
 	      *)
 		func_append newdeplibs " $i"
 		;;
 	      esac
 	    done
 	  fi
 	  ;;
 	file_magic*)
 	  set dummy $deplibs_check_method; shift
 	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 	  for a_deplib in $deplibs; do
 	    case $a_deplib in
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
 	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
 		  a_deplib=
 		  ;;
 		esac
 	      fi
 	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		if test -n "$file_magic_glob"; then
 		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
 		else
 		  libnameglob=$libname
 		fi
 		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		  if test yes = "$want_nocaseglob"; then
 		    shopt -s nocaseglob
 		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
 		    $nocaseglob
 		  else
 		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
 		  fi
 		  for potent_lib in $potential_libs; do
 		      # Follow soft links.
 		      if ls -lLd "$potent_lib" 2>/dev/null |
 			 $GREP " -> " >/dev/null; then
 			continue
 		      fi
 		      # The statement above tries to avoid entering an
 		      # endless loop below, in case of cyclic links.
 		      # We might still enter an endless loop, since a link
 		      # loop can be closed while we follow links,
 		      # but so what?
 		      potlib=$potent_lib
 		      while test -h "$potlib" 2>/dev/null; do
 			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
 			case $potliblink in
 			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
 			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
 			esac
 		      done
 		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
 			 $SED -e 10q |
 			 $EGREP "$file_magic_regex" > /dev/null; then
 			func_append newdeplibs " $a_deplib"
 			a_deplib=
 			break 2
 		      fi
 		  done
 		done
 	      fi
 	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
 		echo "*** I have the capability to make that library automatically link in when"
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
 		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
 		  $ECHO "*** using a file magic. Last file checked: $potlib"
 		fi
 	      fi
 	      ;;
 	    *)
 	      # Add a -L argument.
 	      func_append newdeplibs " $a_deplib"
 	      ;;
 	    esac
 	  done # Gone through all deplibs.
 	  ;;
 	match_pattern*)
 	  set dummy $deplibs_check_method; shift
 	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 	  for a_deplib in $deplibs; do
 	    case $a_deplib in
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
 	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
 		  a_deplib=
 		  ;;
 		esac
 	      fi
 	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
 		  for potent_lib in $potential_libs; do
 		    potlib=$potent_lib # see symlink-check above in file_magic test
 		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
 		       $EGREP "$match_pattern_regex" > /dev/null; then
 		      func_append newdeplibs " $a_deplib"
 		      a_deplib=
 		      break 2
 		    fi
 		  done
 		done
 	      fi
 	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
 		echo "*** I have the capability to make that library automatically link in when"
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
 		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
 		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
 		fi
 	      fi
 	      ;;
 	    *)
 	      # Add a -L argument.
 	      func_append newdeplibs " $a_deplib"
 	      ;;
 	    esac
 	  done # Gone through all deplibs.
 	  ;;
 	none | unknown | *)
 	  newdeplibs=
 	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
 	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 	    for i in $predeps $postdeps; do
 	      # can't use Xsed below, because $i might contain '/'
 	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
 	    done
 	  fi
 	  case $tmp_deplibs in
 	  *[!\	\ ]*)
 	    echo
 	    if test none = "$deplibs_check_method"; then
 	      echo "*** Warning: inter-library dependencies are not supported in this platform."
 	    else
 	      echo "*** Warning: inter-library dependencies are not known to be supported."
 	    fi
 	    echo "*** All declared inter-library dependencies are being dropped."
 	    droppeddeps=yes
 	    ;;
 	  esac
 	  ;;
 	esac
 	versuffix=$versuffix_save
 	major=$major_save
 	release=$release_save
 	libname=$libname_save
 	name=$name_save
 
 	case $host in
 	*-*-rhapsody* | *-*-darwin1.[012])
 	  # On Rhapsody replace the C library with the System framework
 	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
 	  ;;
 	esac
 
 	if test yes = "$droppeddeps"; then
 	  if test yes = "$module"; then
 	    echo
 	    echo "*** Warning: libtool could not satisfy all declared inter-library"
 	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
 	    echo "*** a static module, that should work as long as the dlopening"
 	    echo "*** application is linked with the -dlopen flag."
 	    if test -z "$global_symbol_pipe"; then
 	      echo
 	      echo "*** However, this would only work if libtool was able to extract symbol"
 	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 	      echo "*** not find such a program.  So, this module is probably useless."
 	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	    fi
 	    if test no = "$build_old_libs"; then
 	      oldlibs=$output_objdir/$libname.$libext
 	      build_libtool_libs=module
 	      build_old_libs=yes
 	    else
 	      build_libtool_libs=no
 	    fi
 	  else
 	    echo "*** The inter-library dependencies that have been dropped here will be"
 	    echo "*** automatically added whenever a program is linked with this library"
 	    echo "*** or is declared to -dlopen it."
 
 	    if test no = "$allow_undefined"; then
 	      echo
 	      echo "*** Since this library must not contain undefined symbols,"
 	      echo "*** because either the platform does not support them or"
 	      echo "*** it was explicitly requested with -no-undefined,"
 	      echo "*** libtool will only create a static version of it."
 	      if test no = "$build_old_libs"; then
 		oldlibs=$output_objdir/$libname.$libext
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
 		build_libtool_libs=no
 	      fi
 	    fi
 	  fi
 	fi
 	# Done checking deplibs!
 	deplibs=$newdeplibs
       fi
       # Time to change all our "foo.ltframework" stuff back to "-framework foo"
       case $host in
 	*-*-darwin*)
 	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	  ;;
       esac
 
       # move library search paths that coincide with paths to not yet
       # installed libraries to the beginning of the library search list
       new_libs=
       for path in $notinst_path; do
 	case " $new_libs " in
 	*" -L$path/$objdir "*) ;;
 	*)
 	  case " $deplibs " in
 	  *" -L$path/$objdir "*)
 	    func_append new_libs " -L$path/$objdir" ;;
 	  esac
 	  ;;
 	esac
       done
       for deplib in $deplibs; do
 	case $deplib in
 	-L*)
 	  case " $new_libs " in
 	  *" $deplib "*) ;;
 	  *) func_append new_libs " $deplib" ;;
 	  esac
 	  ;;
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
       deplibs=$new_libs
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
       old_library=
       dlname=
 
       # Test again, we may have decided not to build it any more
       if test yes = "$build_libtool_libs"; then
 	# Remove $wl instances when linking with ld.
 	# FIXME: should test the right _cmds variable.
 	case $archive_cmds in
 	  *\$LD\ *) wl= ;;
         esac
 	if test yes = "$hardcode_into_libs"; then
 	  # Hardcode the library paths
 	  hardcode_libdirs=
 	  dep_rpath=
 	  rpath=$finalize_rpath
 	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
 	  for libdir in $rpath; do
 	    if test -n "$hardcode_libdir_flag_spec"; then
 	      if test -n "$hardcode_libdir_separator"; then
 		func_replace_sysroot "$libdir"
 		libdir=$func_replace_sysroot_result
 		if test -z "$hardcode_libdirs"; then
 		  hardcode_libdirs=$libdir
 		else
 		  # Just accumulate the unique libdirs.
 		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
 		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
 		    ;;
 		  *)
 		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
 		    ;;
 		  esac
 		fi
 	      else
 		eval flag=\"$hardcode_libdir_flag_spec\"
 		func_append dep_rpath " $flag"
 	      fi
 	    elif test -n "$runpath_var"; then
 	      case "$perm_rpath " in
 	      *" $libdir "*) ;;
 	      *) func_append perm_rpath " $libdir" ;;
 	      esac
 	    fi
 	  done
 	  # Substitute the hardcoded libdirs into the rpath.
 	  if test -n "$hardcode_libdir_separator" &&
 	     test -n "$hardcode_libdirs"; then
 	    libdir=$hardcode_libdirs
 	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
 	  fi
 	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
 	    # We should set the runpath_var.
 	    rpath=
 	    for dir in $perm_rpath; do
 	      func_append rpath "$dir:"
 	    done
 	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
 	  fi
 	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
 	fi
 
 	shlibpath=$finalize_shlibpath
 	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
 	if test -n "$shlibpath"; then
 	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
 	fi
 
 	# Get the real and link names of the library.
 	eval shared_ext=\"$shrext_cmds\"
 	eval library_names=\"$library_names_spec\"
 	set dummy $library_names
 	shift
 	realname=$1
 	shift
 
 	if test -n "$soname_spec"; then
 	  eval soname=\"$soname_spec\"
 	else
 	  soname=$realname
 	fi
 	if test -z "$dlname"; then
 	  dlname=$soname
 	fi
 
 	lib=$output_objdir/$realname
 	linknames=
 	for link
 	do
 	  func_append linknames " $link"
 	done
 
 	# Use standard objects if they are pic
 	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	test "X$libobjs" = "X " && libobjs=
 
 	delfiles=
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
 	  export_symbols=$output_objdir/$libname.uexp
 	  func_append delfiles " $export_symbols"
 	fi
 
 	orig_export_symbols=
 	case $host_os in
 	cygwin* | mingw* | cegcc*)
 	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
 	    # exporting using user supplied symfile
 	    func_dll_def_p "$export_symbols" || {
 	      # and it's NOT already a .def file. Must figure out
 	      # which of the given symbols are data symbols and tag
 	      # them as such. So, trigger use of export_symbols_cmds.
 	      # export_symbols gets reassigned inside the "prepare
 	      # the list of exported symbols" if statement, so the
 	      # include_expsyms logic still works.
 	      orig_export_symbols=$export_symbols
 	      export_symbols=
 	      always_export_symbols=yes
 	    }
 	  fi
 	  ;;
 	esac
 
 	# Prepare the list of exported symbols
 	if test -z "$export_symbols"; then
 	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
 	    func_verbose "generating symbol list for '$libname.la'"
 	    export_symbols=$output_objdir/$libname.exp
 	    $opt_dry_run || $RM $export_symbols
 	    cmds=$export_symbols_cmds
 	    save_ifs=$IFS; IFS='~'
 	    for cmd1 in $cmds; do
 	      IFS=$save_ifs
 	      # Take the normal branch if the nm_file_list_spec branch
 	      # doesn't work or if tool conversion is not needed.
 	      case $nm_file_list_spec~$to_tool_file_cmd in
 		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
 		  try_normal_branch=yes
 		  eval cmd=\"$cmd1\"
 		  func_len " $cmd"
 		  len=$func_len_result
 		  ;;
 		*)
 		  try_normal_branch=no
 		  ;;
 	      esac
 	      if test yes = "$try_normal_branch" \
 		 && { test "$len" -lt "$max_cmd_len" \
 		      || test "$max_cmd_len" -le -1; }
 	      then
 		func_show_eval "$cmd" 'exit $?'
 		skipped_export=false
 	      elif test -n "$nm_file_list_spec"; then
 		func_basename "$output"
 		output_la=$func_basename_result
 		save_libobjs=$libobjs
 		save_output=$output
 		output=$output_objdir/$output_la.nm
 		func_to_tool_file "$output"
 		libobjs=$nm_file_list_spec$func_to_tool_file_result
 		func_append delfiles " $output"
 		func_verbose "creating $NM input file list: $output"
 		for obj in $save_libobjs; do
 		  func_to_tool_file "$obj"
 		  $ECHO "$func_to_tool_file_result"
 		done > "$output"
 		eval cmd=\"$cmd1\"
 		func_show_eval "$cmd" 'exit $?'
 		output=$save_output
 		libobjs=$save_libobjs
 		skipped_export=false
 	      else
 		# The command line is too long to execute in one step.
 		func_verbose "using reloadable object file for export list..."
 		skipped_export=:
 		# Break out early, otherwise skipped_export may be
 		# set to false by a later but shorter cmd.
 		break
 	      fi
 	    done
 	    IFS=$save_ifs
 	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
 	  fi
 	fi
 
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	  tmp_export_symbols=$export_symbols
 	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	fi
 
 	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
 	  # The given exports_symbols file has to be filtered, so filter it.
 	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
 	  # 's' commands, which not all seds can handle. GNU sed should be fine
 	  # though. Also, the filter scales superlinearly with the number of
 	  # global variables. join(1) would be nice here, but unfortunately
 	  # isn't a blessed tool.
 	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
 	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
 	  export_symbols=$output_objdir/$libname.def
 	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	fi
 
 	tmp_deplibs=
 	for test_deplib in $deplibs; do
 	  case " $convenience " in
 	  *" $test_deplib "*) ;;
 	  *)
 	    func_append tmp_deplibs " $test_deplib"
 	    ;;
 	  esac
 	done
 	deplibs=$tmp_deplibs
 
 	if test -n "$convenience"; then
 	  if test -n "$whole_archive_flag_spec" &&
 	    test yes = "$compiler_needs_object" &&
 	    test -z "$libobjs"; then
 	    # extract the archives, so we have objects to list.
 	    # TODO: could optimize this to just extract one archive.
 	    whole_archive_flag_spec=
 	  fi
 	  if test -n "$whole_archive_flag_spec"; then
 	    save_libobjs=$libobjs
 	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
 	    test "X$libobjs" = "X " && libobjs=
 	  else
 	    gentop=$output_objdir/${outputname}x
 	    func_append generated " $gentop"
 
 	    func_extract_archives $gentop $convenience
 	    func_append libobjs " $func_extract_archives_result"
 	    test "X$libobjs" = "X " && libobjs=
 	  fi
 	fi
 
 	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
 	  eval flag=\"$thread_safe_flag_spec\"
 	  func_append linker_flags " $flag"
 	fi
 
 	# Make a backup of the uninstalled library when relinking
 	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
 	# Do each of the archive commands.
 	if test yes = "$module" && test -n "$module_cmds"; then
 	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	    eval test_cmds=\"$module_expsym_cmds\"
 	    cmds=$module_expsym_cmds
 	  else
 	    eval test_cmds=\"$module_cmds\"
 	    cmds=$module_cmds
 	  fi
 	else
 	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
 	    eval test_cmds=\"$archive_expsym_cmds\"
 	    cmds=$archive_expsym_cmds
 	  else
 	    eval test_cmds=\"$archive_cmds\"
 	    cmds=$archive_cmds
 	  fi
 	fi
 
 	if test : != "$skipped_export" &&
 	   func_len " $test_cmds" &&
 	   len=$func_len_result &&
 	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
 	  :
 	else
 	  # The command line is too long to link in one step, link piecewise
 	  # or, if using GNU ld and skipped_export is not :, use a linker
 	  # script.
 
 	  # Save the value of $output and $libobjs because we want to
 	  # use them later.  If we have whole_archive_flag_spec, we
 	  # want to use save_libobjs as it was before
 	  # whole_archive_flag_spec was expanded, because we can't
 	  # assume the linker understands whole_archive_flag_spec.
 	  # This may have to be revisited, in case too many
 	  # convenience libraries get linked in and end up exceeding
 	  # the spec.
 	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
 	    save_libobjs=$libobjs
 	  fi
 	  save_output=$output
 	  func_basename "$output"
 	  output_la=$func_basename_result
 
 	  # Clear the reloadable object creation command queue and
 	  # initialize k to one.
 	  test_cmds=
 	  concat_cmds=
 	  objlist=
 	  last_robj=
 	  k=1
 
 	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
 	    output=$output_objdir/$output_la.lnkscript
 	    func_verbose "creating GNU ld script: $output"
 	    echo 'INPUT (' > $output
 	    for obj in $save_libobjs
 	    do
 	      func_to_tool_file "$obj"
 	      $ECHO "$func_to_tool_file_result" >> $output
 	    done
 	    echo ')' >> $output
 	    func_append delfiles " $output"
 	    func_to_tool_file "$output"
 	    output=$func_to_tool_file_result
 	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
 	    output=$output_objdir/$output_la.lnk
 	    func_verbose "creating linker input file list: $output"
 	    : > $output
 	    set x $save_libobjs
 	    shift
 	    firstobj=
 	    if test yes = "$compiler_needs_object"; then
 	      firstobj="$1 "
 	      shift
 	    fi
 	    for obj
 	    do
 	      func_to_tool_file "$obj"
 	      $ECHO "$func_to_tool_file_result" >> $output
 	    done
 	    func_append delfiles " $output"
 	    func_to_tool_file "$output"
 	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
 	  else
 	    if test -n "$save_libobjs"; then
 	      func_verbose "creating reloadable object files..."
 	      output=$output_objdir/$output_la-$k.$objext
 	      eval test_cmds=\"$reload_cmds\"
 	      func_len " $test_cmds"
 	      len0=$func_len_result
 	      len=$len0
 
 	      # Loop over the list of objects to be linked.
 	      for obj in $save_libobjs
 	      do
 		func_len " $obj"
 		func_arith $len + $func_len_result
 		len=$func_arith_result
 		if test -z "$objlist" ||
 		   test "$len" -lt "$max_cmd_len"; then
 		  func_append objlist " $obj"
 		else
 		  # The command $test_cmds is almost too long, add a
 		  # command to the queue.
 		  if test 1 -eq "$k"; then
 		    # The first file doesn't have a previous command to add.
 		    reload_objs=$objlist
 		    eval concat_cmds=\"$reload_cmds\"
 		  else
 		    # All subsequent reloadable object files will link in
 		    # the last one created.
 		    reload_objs="$objlist $last_robj"
 		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
 		  fi
 		  last_robj=$output_objdir/$output_la-$k.$objext
 		  func_arith $k + 1
 		  k=$func_arith_result
 		  output=$output_objdir/$output_la-$k.$objext
 		  objlist=" $obj"
 		  func_len " $last_robj"
 		  func_arith $len0 + $func_len_result
 		  len=$func_arith_result
 		fi
 	      done
 	      # Handle the remaining objects by creating one last
 	      # reloadable object file.  All subsequent reloadable object
 	      # files will link in the last one created.
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      reload_objs="$objlist $last_robj"
 	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
 	      if test -n "$last_robj"; then
 	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
 	      func_append delfiles " $output"
 
 	    else
 	      output=
 	    fi
 
 	    ${skipped_export-false} && {
 	      func_verbose "generating symbol list for '$libname.la'"
 	      export_symbols=$output_objdir/$libname.exp
 	      $opt_dry_run || $RM $export_symbols
 	      libobjs=$output
 	      # Append the command to create the export file.
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
 	      if test -n "$last_robj"; then
 		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
 	    }
 
 	    test -n "$save_libobjs" &&
 	      func_verbose "creating a temporary reloadable object file: $output"
 
 	    # Loop through the commands generated above and execute them.
 	    save_ifs=$IFS; IFS='~'
 	    for cmd in $concat_cmds; do
 	      IFS=$save_ifs
 	      $opt_quiet || {
 		  func_quote_for_expand "$cmd"
 		  eval "func_echo $func_quote_for_expand_result"
 	      }
 	      $opt_dry_run || eval "$cmd" || {
 		lt_exit=$?
 
 		# Restore the uninstalled library and exit
 		if test relink = "$opt_mode"; then
 		  ( cd "$output_objdir" && \
 		    $RM "${realname}T" && \
 		    $MV "${realname}U" "$realname" )
 		fi
 
 		exit $lt_exit
 	      }
 	    done
 	    IFS=$save_ifs
 
 	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
 	  fi
 
           ${skipped_export-false} && {
 	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	      tmp_export_symbols=$export_symbols
 	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	    fi
 
 	    if test -n "$orig_export_symbols"; then
 	      # The given exports_symbols file has to be filtered, so filter it.
 	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
 	      # 's' commands, which not all seds can handle. GNU sed should be fine
 	      # though. Also, the filter scales superlinearly with the number of
 	      # global variables. join(1) would be nice here, but unfortunately
 	      # isn't a blessed tool.
 	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
 	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
 	      export_symbols=$output_objdir/$libname.def
 	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	    fi
 	  }
 
 	  libobjs=$output
 	  # Restore the value of output.
 	  output=$save_output
 
 	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
 	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
 	    test "X$libobjs" = "X " && libobjs=
 	  fi
 	  # Expand the library linking commands again to reset the
 	  # value of $libobjs for piecewise linking.
 
 	  # Do each of the archive commands.
 	  if test yes = "$module" && test -n "$module_cmds"; then
 	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	      cmds=$module_expsym_cmds
 	    else
 	      cmds=$module_cmds
 	    fi
 	  else
 	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
 	      cmds=$archive_expsym_cmds
 	    else
 	      cmds=$archive_cmds
 	    fi
 	  fi
 	fi
 
 	if test -n "$delfiles"; then
 	  # Append the command to remove temporary files to $cmds.
 	  eval cmds=\"\$cmds~\$RM $delfiles\"
 	fi
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
 	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
 	  func_append libobjs " $func_extract_archives_result"
 	  test "X$libobjs" = "X " && libobjs=
 	fi
 
 	save_ifs=$IFS; IFS='~'
 	for cmd in $cmds; do
 	  IFS=$sp$nl
 	  eval cmd=\"$cmd\"
 	  IFS=$save_ifs
 	  $opt_quiet || {
 	    func_quote_for_expand "$cmd"
 	    eval "func_echo $func_quote_for_expand_result"
 	  }
 	  $opt_dry_run || eval "$cmd" || {
 	    lt_exit=$?
 
 	    # Restore the uninstalled library and exit
 	    if test relink = "$opt_mode"; then
 	      ( cd "$output_objdir" && \
 	        $RM "${realname}T" && \
 		$MV "${realname}U" "$realname" )
 	    fi
 
 	    exit $lt_exit
 	  }
 	done
 	IFS=$save_ifs
 
 	# Restore the uninstalled library and exit
 	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
 	  if test -n "$convenience"; then
 	    if test -z "$whole_archive_flag_spec"; then
 	      func_show_eval '${RM}r "$gentop"'
 	    fi
 	  fi
 
 	  exit $EXIT_SUCCESS
 	fi
 
 	# Create links to the real library.
 	for linkname in $linknames; do
 	  if test "$realname" != "$linkname"; then
 	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
 	  fi
 	done
 
 	# If -module or -export-dynamic was specified, set the dlname.
 	if test yes = "$module" || test yes = "$export_dynamic"; then
 	  # On all known operating systems, these are identical.
 	  dlname=$soname
 	fi
       fi
       ;;
 
     obj)
       if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
 	func_warning "'-dlopen' is ignored for objects"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
 	func_warning "'-l' and '-L' are ignored for objects" ;;
       esac
 
       test -n "$rpath" && \
 	func_warning "'-rpath' is ignored for objects"
 
       test -n "$xrpath" && \
 	func_warning "'-R' is ignored for objects"
 
       test -n "$vinfo" && \
 	func_warning "'-version-info' is ignored for objects"
 
       test -n "$release" && \
 	func_warning "'-release' is ignored for objects"
 
       case $output in
       *.lo)
 	test -n "$objs$old_deplibs" && \
 	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
 
 	libobj=$output
 	func_lo2o "$libobj"
 	obj=$func_lo2o_result
 	;;
       *)
 	libobj=
 	obj=$output
 	;;
       esac
 
       # Delete the old objects.
       $opt_dry_run || $RM $obj $libobj
 
       # Objects from convenience libraries.  This assumes
       # single-version convenience libraries.  Whenever we create
       # different ones for PIC/non-PIC, this we'll have to duplicate
       # the extraction.
       reload_conv_objs=
       gentop=
       # if reload_cmds runs $LD directly, get rid of -Wl from
       # whole_archive_flag_spec and hope we can get by with turning comma
       # into space.
       case $reload_cmds in
         *\$LD[\ \$]*) wl= ;;
       esac
       if test -n "$convenience"; then
 	if test -n "$whole_archive_flag_spec"; then
 	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
 	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
 	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
 	else
 	  gentop=$output_objdir/${obj}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $convenience
 	  reload_conv_objs="$reload_objs $func_extract_archives_result"
 	fi
       fi
 
       # If we're not building shared, we need to use non_pic_objs
       test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
 
       # Create the old-style object.
       reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
 
       output=$obj
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
       if test -z "$libobj"; then
 	if test -n "$gentop"; then
 	  func_show_eval '${RM}r "$gentop"'
 	fi
 
 	exit $EXIT_SUCCESS
       fi
 
       test yes = "$build_libtool_libs" || {
 	if test -n "$gentop"; then
 	  func_show_eval '${RM}r "$gentop"'
 	fi
 
 	# Create an invalid libtool object if no PIC, so that we don't
 	# accidentally link it into a program.
 	# $show "echo timestamp > $libobj"
 	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
 	exit $EXIT_SUCCESS
       }
 
       if test -n "$pic_flag" || test default != "$pic_mode"; then
 	# Only do commands if we really have different PIC objects.
 	reload_objs="$libobjs $reload_conv_objs"
 	output=$libobj
 	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
       if test -n "$gentop"; then
 	func_show_eval '${RM}r "$gentop"'
       fi
 
       exit $EXIT_SUCCESS
       ;;
 
     prog)
       case $host in
 	*cygwin*) func_stripname '' '.exe' "$output"
 	          output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
 	func_warning "'-version-info' is ignored for programs"
 
       test -n "$release" && \
 	func_warning "'-release' is ignored for programs"
 
       $preload \
 	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
 	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
 	# On Rhapsody replace the C library is the System framework
 	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
 	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
 	;;
       esac
 
       case $host in
       *-*-darwin*)
 	# Don't allow lazy linking, it breaks C++ global constructors
 	# But is supposedly fixed on 10.4 or later (yay!).
 	if test CXX = "$tagname"; then
 	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
 	    10.[0123])
 	      func_append compile_command " $wl-bind_at_load"
 	      func_append finalize_command " $wl-bind_at_load"
 	    ;;
 	  esac
 	fi
 	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
 	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	;;
       esac
 
 
       # move library search paths that coincide with paths to not yet
       # installed libraries to the beginning of the library search list
       new_libs=
       for path in $notinst_path; do
 	case " $new_libs " in
 	*" -L$path/$objdir "*) ;;
 	*)
 	  case " $compile_deplibs " in
 	  *" -L$path/$objdir "*)
 	    func_append new_libs " -L$path/$objdir" ;;
 	  esac
 	  ;;
 	esac
       done
       for deplib in $compile_deplibs; do
 	case $deplib in
 	-L*)
 	  case " $new_libs " in
 	  *" $deplib "*) ;;
 	  *) func_append new_libs " $deplib" ;;
 	  esac
 	  ;;
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
       compile_deplibs=$new_libs
 
 
       func_append compile_command " $compile_deplibs"
       func_append finalize_command " $finalize_deplibs"
 
       if test -n "$rpath$xrpath"; then
 	# If the user specified any rpath flags, then add them.
 	for libdir in $rpath $xrpath; do
 	  # This is the magic to use -rpath.
 	  case "$finalize_rpath " in
 	  *" $libdir "*) ;;
 	  *) func_append finalize_rpath " $libdir" ;;
 	  esac
 	done
       fi
 
       # Now hardcode the library paths
       rpath=
       hardcode_libdirs=
       for libdir in $compile_rpath $finalize_rpath; do
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
 	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
 	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
 		;;
 	      *)
 		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
 		;;
 	      esac
 	    fi
 	  else
 	    eval flag=\"$hardcode_libdir_flag_spec\"
 	    func_append rpath " $flag"
 	  fi
 	elif test -n "$runpath_var"; then
 	  case "$perm_rpath " in
 	  *" $libdir "*) ;;
 	  *) func_append perm_rpath " $libdir" ;;
 	  esac
 	fi
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
 	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$libdir:"*) ;;
 	  ::) dllsearchpath=$libdir;;
 	  *) func_append dllsearchpath ":$libdir";;
 	  esac
 	  case :$dllsearchpath: in
 	  *":$testbindir:"*) ;;
 	  ::) dllsearchpath=$testbindir;;
 	  *) func_append dllsearchpath ":$testbindir";;
 	  esac
 	  ;;
 	esac
       done
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
 	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
       compile_rpath=$rpath
 
       rpath=
       hardcode_libdirs=
       for libdir in $finalize_rpath; do
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
 	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
 	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
 		;;
 	      *)
 		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
 		;;
 	      esac
 	    fi
 	  else
 	    eval flag=\"$hardcode_libdir_flag_spec\"
 	    func_append rpath " $flag"
 	  fi
 	elif test -n "$runpath_var"; then
 	  case "$finalize_perm_rpath " in
 	  *" $libdir "*) ;;
 	  *) func_append finalize_perm_rpath " $libdir" ;;
 	  esac
 	fi
       done
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
 	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
       finalize_rpath=$rpath
 
       if test -n "$libobjs" && test yes = "$build_old_libs"; then
 	# Transform all the library objects into standard objects.
 	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
       func_generate_dlsyms "$outputname" "@PROGRAM@" false
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
 	func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
       wrappers_required=:
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
         wrappers_required=false
         ;;
       *cygwin* | *mingw* )
         test yes = "$build_libtool_libs" || wrappers_required=false
         ;;
       *)
         if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
           wrappers_required=false
         fi
         ;;
       esac
       $wrappers_required || {
 	# Replace the output file specification.
 	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
 	link_command=$compile_command$compile_rpath
 
 	# We have no uninstalled library dependencies, so finalize right now.
 	exit_status=0
 	func_show_eval "$link_command" 'exit_status=$?'
 
 	if test -n "$postlink_cmds"; then
 	  func_to_tool_file "$output"
 	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
 	  func_execute_cmds "$postlink_cmds" 'exit $?'
 	fi
 
 	# Delete the generated files.
 	if test -f "$output_objdir/${outputname}S.$objext"; then
 	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
 	fi
 
 	exit $exit_status
       }
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
 	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
       fi
       if test -n "$finalize_shlibpath"; then
 	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
       fi
 
       compile_var=
       finalize_var=
       if test -n "$runpath_var"; then
 	if test -n "$perm_rpath"; then
 	  # We should set the runpath_var.
 	  rpath=
 	  for dir in $perm_rpath; do
 	    func_append rpath "$dir:"
 	  done
 	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
 	fi
 	if test -n "$finalize_perm_rpath"; then
 	  # We should set the runpath_var.
 	  rpath=
 	  for dir in $finalize_perm_rpath; do
 	    func_append rpath "$dir:"
 	  done
 	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
 	fi
       fi
 
       if test yes = "$no_install"; then
 	# We don't need to create a wrapper script.
 	link_command=$compile_var$compile_command$compile_rpath
 	# Replace the output file specification.
 	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
 	# Delete the old output file.
 	$opt_dry_run || $RM $output
 	# Link the executable and exit
 	func_show_eval "$link_command" 'exit $?'
 
 	if test -n "$postlink_cmds"; then
 	  func_to_tool_file "$output"
 	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
 	  func_execute_cmds "$postlink_cmds" 'exit $?'
 	fi
 
 	exit $EXIT_SUCCESS
       fi
 
       case $hardcode_action,$fast_install in
         relink,*)
 	  # Fast installation is not supported
 	  link_command=$compile_var$compile_command$compile_rpath
 	  relink_command=$finalize_var$finalize_command$finalize_rpath
 
 	  func_warning "this platform does not like uninstalled shared libraries"
 	  func_warning "'$output' will be relinked during installation"
 	  ;;
         *,yes)
 	  link_command=$finalize_var$compile_command$finalize_rpath
 	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
           ;;
 	*,no)
 	  link_command=$compile_var$compile_command$compile_rpath
 	  relink_command=$finalize_var$finalize_command$finalize_rpath
           ;;
 	*,needless)
 	  link_command=$finalize_var$compile_command$finalize_rpath
 	  relink_command=
           ;;
       esac
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
 
       # Delete the old output files.
       $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
 
       func_show_eval "$link_command" 'exit $?'
 
       if test -n "$postlink_cmds"; then
 	func_to_tool_file "$output_objdir/$outputname"
 	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
 	func_execute_cmds "$postlink_cmds" 'exit $?'
       fi
 
       # Now create the wrapper script.
       func_verbose "creating $output"
 
       # Quote the relink command for shipping.
       if test -n "$relink_command"; then
 	# Preserve any variables that may affect compiler behavior
 	for var in $variables_saved_for_relink; do
 	  if eval test -z \"\${$var+set}\"; then
 	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
 	  elif eval var_value=\$$var; test -z "$var_value"; then
 	    relink_command="$var=; export $var; $relink_command"
 	  else
 	    func_quote_for_eval "$var_value"
 	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
 	  fi
 	done
 	relink_command="(cd `pwd`; $relink_command)"
 	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       fi
 
       # Only actually do things if not in dry run mode.
       $opt_dry_run || {
 	# win32 will think the script is a binary if it has
 	# a .exe suffix, so we strip it off here.
 	case $output in
 	  *.exe) func_stripname '' '.exe' "$output"
 	         output=$func_stripname_result ;;
 	esac
 	# test for cygwin because mv fails w/o .exe extensions
 	case $host in
 	  *cygwin*)
 	    exeext=.exe
 	    func_stripname '' '.exe' "$outputname"
 	    outputname=$func_stripname_result ;;
 	  *) exeext= ;;
 	esac
 	case $host in
 	  *cygwin* | *mingw* )
 	    func_dirname_and_basename "$output" "" "."
 	    output_name=$func_basename_result
 	    output_path=$func_dirname_result
 	    cwrappersource=$output_path/$objdir/lt-$output_name.c
 	    cwrapper=$output_path/$output_name.exe
 	    $RM $cwrappersource $cwrapper
 	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
 	    func_emit_cwrapperexe_src > $cwrappersource
 
 	    # The wrapper executable is built using the $host compiler,
 	    # because it contains $host paths and files. If cross-
 	    # compiling, it, like the target executable, must be
 	    # executed on the $host or under an emulation environment.
 	    $opt_dry_run || {
 	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
 	      $STRIP $cwrapper
 	    }
 
 	    # Now, create the wrapper script for func_source use:
 	    func_ltwrapper_scriptname $cwrapper
 	    $RM $func_ltwrapper_scriptname_result
 	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
 	    $opt_dry_run || {
 	      # note: this script will not be executed, so do not chmod.
 	      if test "x$build" = "x$host"; then
 		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
 		func_emit_wrapper no > $func_ltwrapper_scriptname_result
 	      fi
 	    }
 	  ;;
 	  * )
 	    $RM $output
 	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
 
 	    func_emit_wrapper no > $output
 	    chmod +x $output
 	  ;;
 	esac
       }
       exit $EXIT_SUCCESS
       ;;
     esac
 
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
       case $build_libtool_libs in
         convenience)
 	  oldobjs="$libobjs_save $symfileobj"
 	  addlibs=$convenience
 	  build_libtool_libs=no
 	  ;;
 	module)
 	  oldobjs=$libobjs_save
 	  addlibs=$old_convenience
 	  build_libtool_libs=no
           ;;
 	*)
 	  oldobjs="$old_deplibs $non_pic_objects"
 	  $preload && test -f "$symfileobj" \
 	    && func_append oldobjs " $symfileobj"
 	  addlibs=$old_convenience
 	  ;;
       esac
 
       if test -n "$addlibs"; then
 	gentop=$output_objdir/${outputname}x
 	func_append generated " $gentop"
 
 	func_extract_archives $gentop $addlibs
 	func_append oldobjs " $func_extract_archives_result"
       fi
 
       # Do each command in the archive commands.
       if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
 	cmds=$old_archive_from_new_cmds
       else
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
 	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
 	  func_append oldobjs " $func_extract_archives_result"
 	fi
 
 	# POSIX demands no paths to be encoded in archives.  We have
 	# to avoid creating archives with duplicate basenames if we
 	# might have to extract them afterwards, e.g., when creating a
 	# static archive out of a convenience library, or when linking
 	# the entirety of a libtool archive into another (currently
 	# not supported by libtool).
 	if (for obj in $oldobjs
 	    do
 	      func_basename "$obj"
 	      $ECHO "$func_basename_result"
 	    done | sort | sort -uc >/dev/null 2>&1); then
 	  :
 	else
 	  echo "copying selected object files to avoid basename conflicts..."
 	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 	  func_mkdir_p "$gentop"
 	  save_oldobjs=$oldobjs
 	  oldobjs=
 	  counter=1
 	  for obj in $save_oldobjs
 	  do
 	    func_basename "$obj"
 	    objbase=$func_basename_result
 	    case " $oldobjs " in
 	    " ") oldobjs=$obj ;;
 	    *[\ /]"$objbase "*)
 	      while :; do
 		# Make sure we don't pick an alternate name that also
 		# overlaps.
 		newobj=lt$counter-$objbase
 		func_arith $counter + 1
 		counter=$func_arith_result
 		case " $oldobjs " in
 		*[\ /]"$newobj "*) ;;
 		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
 		esac
 	      done
 	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
 	      func_append oldobjs " $gentop/$newobj"
 	      ;;
 	    *) func_append oldobjs " $obj" ;;
 	    esac
 	  done
 	fi
 	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
 	tool_oldlib=$func_to_tool_file_result
 	eval cmds=\"$old_archive_cmds\"
 
 	func_len " $cmds"
 	len=$func_len_result
 	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
 	  cmds=$old_archive_cmds
 	elif test -n "$archiver_list_spec"; then
 	  func_verbose "using command file archive linking..."
 	  for obj in $oldobjs
 	  do
 	    func_to_tool_file "$obj"
 	    $ECHO "$func_to_tool_file_result"
 	  done > $output_objdir/$libname.libcmd
 	  func_to_tool_file "$output_objdir/$libname.libcmd"
 	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
 	  cmds=$old_archive_cmds
 	else
 	  # the command line is too long to link in one step, link in parts
 	  func_verbose "using piecewise archive linking..."
 	  save_RANLIB=$RANLIB
 	  RANLIB=:
 	  objlist=
 	  concat_cmds=
 	  save_oldobjs=$oldobjs
 	  oldobjs=
 	  # Is there a better way of finding the last object in the list?
 	  for obj in $save_oldobjs
 	  do
 	    last_oldobj=$obj
 	  done
 	  eval test_cmds=\"$old_archive_cmds\"
 	  func_len " $test_cmds"
 	  len0=$func_len_result
 	  len=$len0
 	  for obj in $save_oldobjs
 	  do
 	    func_len " $obj"
 	    func_arith $len + $func_len_result
 	    len=$func_arith_result
 	    func_append objlist " $obj"
 	    if test "$len" -lt "$max_cmd_len"; then
 	      :
 	    else
 	      # the above command should be used before it gets too long
 	      oldobjs=$objlist
 	      if test "$obj" = "$last_oldobj"; then
 		RANLIB=$save_RANLIB
 	      fi
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
 	      objlist=
 	      len=$len0
 	    fi
 	  done
 	  RANLIB=$save_RANLIB
 	  oldobjs=$objlist
 	  if test -z "$oldobjs"; then
 	    eval cmds=\"\$concat_cmds\"
 	  else
 	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
 	  fi
 	fi
       fi
       func_execute_cmds "$cmds" 'exit $?'
     done
 
     test -n "$generated" && \
       func_show_eval "${RM}r$generated"
 
     # Now create the libtool archive.
     case $output in
     *.la)
       old_library=
       test yes = "$build_old_libs" && old_library=$libname.$libext
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
       for var in $variables_saved_for_relink; do
 	if eval test -z \"\${$var+set}\"; then
 	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
 	elif eval var_value=\$$var; test -z "$var_value"; then
 	  relink_command="$var=; export $var; $relink_command"
 	else
 	  func_quote_for_eval "$var_value"
 	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
 	fi
       done
       # Quote the link command for shipping.
       relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       if test yes = "$hardcode_automatic"; then
 	relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
 	for installed in no yes; do
 	  if test yes = "$installed"; then
 	    if test -z "$install_libdir"; then
 	      break
 	    fi
 	    output=$output_objdir/${outputname}i
 	    # Replace all uninstalled libtool libraries with the installed ones
 	    newdependency_libs=
 	    for deplib in $dependency_libs; do
 	      case $deplib in
 	      *.la)
 		func_basename "$deplib"
 		name=$func_basename_result
 		func_resolve_sysroot "$deplib"
 		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
 		test -z "$libdir" && \
 		  func_fatal_error "'$deplib' is not a valid libtool archive"
 		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      -L*)
 		func_stripname -L '' "$deplib"
 		func_replace_sysroot "$func_stripname_result"
 		func_append newdependency_libs " -L$func_replace_sysroot_result"
 		;;
 	      -R*)
 		func_stripname -R '' "$deplib"
 		func_replace_sysroot "$func_stripname_result"
 		func_append newdependency_libs " -R$func_replace_sysroot_result"
 		;;
 	      *) func_append newdependency_libs " $deplib" ;;
 	      esac
 	    done
 	    dependency_libs=$newdependency_libs
 	    newdlfiles=
 
 	    for lib in $dlfiles; do
 	      case $lib in
 	      *.la)
 	        func_basename "$lib"
 		name=$func_basename_result
 		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
 		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      *) func_append newdlfiles " $lib" ;;
 	      esac
 	    done
 	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
 	      *.la)
 		# Only pass preopened files to the pseudo-archive (for
 		# eventual linking with the app. that links it) if we
 		# didn't already link the preopened objects directly into
 		# the library:
 		func_basename "$lib"
 		name=$func_basename_result
 		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
 		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      esac
 	    done
 	    dlprefiles=$newdlprefiles
 	  else
 	    newdlfiles=
 	    for lib in $dlfiles; do
 	      case $lib in
 		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlfiles " $abs"
 	    done
 	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
 		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlprefiles " $abs"
 	    done
 	    dlprefiles=$newdlprefiles
 	  fi
 	  $RM $output
 	  # place dlname in correct position for cygwin
 	  # In fact, it would be nice if we could use this code for all target
 	  # systems that can't hard-code library paths into their executables
 	  # and that have no shared library path variable independent of PATH,
 	  # but it turns out we can't easily determine that from inspecting
 	  # libtool variables, so we have to hard-code the OSs to which it
 	  # applies here; at the moment, that means platforms that use the PE
 	  # object format with DLL files.  See the long comment at the top of
 	  # tests/bindir.at for full details.
 	  tdlname=$dlname
 	  case $host,$output,$installed,$module,$dlname in
 	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
 	      # If a -bindir argument was supplied, place the dll there.
 	      if test -n "$bindir"; then
 		func_relative_path "$install_libdir" "$bindir"
 		tdlname=$func_relative_path_result/$dlname
 	      else
 		# Otherwise fall back on heuristic.
 		tdlname=../bin/$dlname
 	      fi
 	      ;;
 	  esac
 	  $ECHO > $output "\
 # $outputname - a libtool library file
 # Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
 dlname='$tdlname'
 
 # Names of this library.
 library_names='$library_names'
 
 # The name of the static archive.
 old_library='$old_library'
 
 # Linker flags that cannot go in dependency_libs.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
 dependency_libs='$dependency_libs'
 
 # Names of additional weak libraries provided by this library
 weak_library_names='$weak_libs'
 
 # Version information for $libname.
 current=$current
 age=$age
 revision=$revision
 
 # Is this an already installed library?
 installed=$installed
 
 # Should we warn about portability when linking against -modules?
 shouldnotlink=$module
 
 # Files to dlopen/dlpreopen
 dlopen='$dlfiles'
 dlpreopen='$dlprefiles'
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
 	  if test no,yes = "$installed,$need_relink"; then
 	    $ECHO >> $output "\
 relink_command=\"$relink_command\""
 	  fi
 	done
       }
 
       # Do a symbolic link so that the libtool archive can be found in
       # LD_LIBRARY_PATH before the program is installed.
       func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
       ;;
     esac
     exit $EXIT_SUCCESS
 }
 
 if test link = "$opt_mode" || test relink = "$opt_mode"; then
   func_mode_link ${1+"$@"}
 fi
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
     $debug_cmd
 
     RM=$nonopt
     files=
     rmforce=false
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
     libtool_install_magic=$magic
 
     for arg
     do
       case $arg in
       -f) func_append RM " $arg"; rmforce=: ;;
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
     done
 
     test -z "$RM" && \
       func_fatal_help "you must specify an RM program"
 
     rmdirs=
 
     for file in $files; do
       func_dirname "$file" "" "."
       dir=$func_dirname_result
       if test . = "$dir"; then
 	odir=$objdir
       else
 	odir=$dir/$objdir
       fi
       func_basename "$file"
       name=$func_basename_result
       test uninstall = "$opt_mode" && odir=$dir
 
       # Remember odir for removal later, being careful to avoid duplicates
       if test clean = "$opt_mode"; then
 	case " $rmdirs " in
 	  *" $odir "*) ;;
 	  *) func_append rmdirs " $odir" ;;
 	esac
       fi
 
       # Don't error if the file doesn't exist and rm -f was used.
       if { test -L "$file"; } >/dev/null 2>&1 ||
 	 { test -h "$file"; } >/dev/null 2>&1 ||
 	 test -f "$file"; then
 	:
       elif test -d "$file"; then
 	exit_status=1
 	continue
       elif $rmforce; then
 	continue
       fi
 
       rmfiles=$file
 
       case $name in
       *.la)
 	# Possibly a libtool archive, so verify it.
 	if func_lalib_p "$file"; then
 	  func_source $dir/$name
 
 	  # Delete the libtool libraries and symlinks.
 	  for n in $library_names; do
 	    func_append rmfiles " $odir/$n"
 	  done
 	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
 	  case $opt_mode in
 	  clean)
 	    case " $library_names " in
 	    *" $dlname "*) ;;
 	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
 	    esac
 	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
 	    ;;
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
 	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
 	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
 	  esac
 	fi
 	;;
 
       *.lo)
 	# Possibly a libtool object, so verify it.
 	if func_lalib_p "$file"; then
 
 	  # Read the .lo file
 	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
 	  if test -n "$pic_object" && test none != "$pic_object"; then
 	    func_append rmfiles " $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
 	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
 	    func_append rmfiles " $dir/$non_pic_object"
 	  fi
 	fi
 	;;
 
       *)
 	if test clean = "$opt_mode"; then
 	  noexename=$name
 	  case $file in
 	  *.exe)
 	    func_stripname '' '.exe' "$file"
 	    file=$func_stripname_result
 	    func_stripname '' '.exe' "$name"
 	    noexename=$func_stripname_result
 	    # $file with .exe has already been added to rmfiles,
 	    # add $file without .exe
 	    func_append rmfiles " $file"
 	    ;;
 	  esac
 	  # Do a test to see if this is a libtool program.
 	  if func_ltwrapper_p "$file"; then
 	    if func_ltwrapper_executable_p "$file"; then
 	      func_ltwrapper_scriptname "$file"
 	      relink_command=
 	      func_source $func_ltwrapper_scriptname_result
 	      func_append rmfiles " $func_ltwrapper_scriptname_result"
 	    else
 	      relink_command=
 	      func_source $dir/$noexename
 	    fi
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
 	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
 	    if test yes = "$fast_install" && test -n "$relink_command"; then
 	      func_append rmfiles " $odir/lt-$name"
 	    fi
 	    if test "X$noexename" != "X$name"; then
 	      func_append rmfiles " $odir/lt-$noexename.c"
 	    fi
 	  fi
 	fi
 	;;
       esac
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
     # Try to remove the $objdir's in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
 	func_show_eval "rmdir $dir >/dev/null 2>&1"
       fi
     done
 
     exit $exit_status
 }
 
 if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
   func_mode_uninstall ${1+"$@"}
 fi
 
 test -z "$opt_mode" && {
   help=$generic_help
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
   func_fatal_help "invalid operation mode '$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
   exit $EXIT_FAILURE
 fi
 
 exit $exit_status
 
 
 # The TAGs below are defined such that we never get into a situation
 # where we disable both kinds of libraries.  Given conflicting
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
 # them.  This is particularly important on AIX, because we don't
 # support having both static and shared libraries enabled at the same
 # time on that platform, so we default to a shared-only configuration.
 # If a disable-shared tag is given, we'll fallback to a static-only
 # configuration.  But we'll never go from static-only to shared-only.
 
 # ### BEGIN LIBTOOL TAG CONFIG: disable-shared
 build_libtool_libs=no
 build_old_libs=yes
 # ### END LIBTOOL TAG CONFIG: disable-shared
 
 # ### BEGIN LIBTOOL TAG CONFIG: disable-static
 build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # ### END LIBTOOL TAG CONFIG: disable-static
 
 # Local Variables:
 # mode:shell-script
 # sh-indentation:2
 # End:
diff --git a/Contrib/LeptonME/MEee2Higgs2SM.cc b/Contrib/LeptonME/MEee2Higgs2SM.cc
--- a/Contrib/LeptonME/MEee2Higgs2SM.cc
+++ b/Contrib/LeptonME/MEee2Higgs2SM.cc
@@ -1,277 +1,349 @@
 // -*- C++ -*-
 //
 // MEee2Higgs2SM.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
 // Copyright (C) 2002-2011 The Herwig Collaboration
 //
 // Herwig is licenced under version 2 of the GPL, see COPYING for details.
 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
 //
 //
 // This is the implementation of the non-inlined, non-templated member
 // functions of the MEee2Higgs2SM class.
 //
 
 #include "MEee2Higgs2SM.h"
 #include "ThePEG/Interface/ClassDocumentation.h"
 #include "ThePEG/Interface/Switch.h"
 #include "ThePEG/Persistency/PersistentOStream.h"
 #include "ThePEG/Persistency/PersistentIStream.h"
 #include "ThePEG/Handlers/StandardXComb.h"
 #include "Herwig/MatrixElement/HardVertex.h"
 #include "ThePEG/PDT/EnumParticles.h"
 
 using namespace Herwig;
 
 void MEee2Higgs2SM::doinit() {
   ME2to2Base::doinit();
-  _h0      = getParticleData(ThePEG::ParticleID::h0);
+  h0_      = getParticleData(ThePEG::ParticleID::h0);
   tcHwSMPtr hwsm=ThePEG::dynamic_ptr_cast<tcHwSMPtr>(standardModel());
   // do the initialisation
   if(hwsm) {
-    _theFFHVertex = hwsm->vertexFFH();
+    FFHVertex_ = hwsm->vertexFFH();
+    HGGVertex_ = hwsm->vertexHGG();
   }
   else {
     throw InitException() << "Must have Herwig StandardModel object in "
 			  << "MEee2Higgs2SM::doinit()" << Exception::runerror;
   }
 }
 
 Energy2 MEee2Higgs2SM::scale() const {
   return sHat();
 }
 
 unsigned int MEee2Higgs2SM::orderInAlphaS() const {
   return 0;
 }
 
 unsigned int MEee2Higgs2SM::orderInAlphaEW() const {
   return 2;
 }
 
 void MEee2Higgs2SM::getDiagrams() const {
   // specific the diagrams
   tcPDPtr ep       = getParticleData(ParticleID::eplus );
   tcPDPtr em       = getParticleData(ParticleID::eminus);
   // outgoing quarks
   for(int i=1;i<=5;++i) {
-    if(_allowed==0 || _allowed==1 || _allowed==i+2) {
+    if(allowed_==0 || allowed_==1 || allowed_==i+2) {
       tcPDPtr lm = getParticleData(i);
       tcPDPtr lp = lm->CC();
-      add(new_ptr((Tree2toNDiagram(2), em, ep, 1, _h0, 3, lm, 3, lp, -1)));
+      add(new_ptr((Tree2toNDiagram(2), em, ep, 1, h0_, 3, lm, 3, lp, -1)));
     }
   }
   // outgoing leptons
   for( int i =11;i<=16;i+=2) {
-    if(_allowed==0 || _allowed==2 || _allowed==(i+7)/2) {
+    if(allowed_==0 || allowed_==2 || allowed_==(i+7)/2) {
       tcPDPtr lm = getParticleData(i);
       tcPDPtr lp = lm->CC();
-      add(new_ptr((Tree2toNDiagram(2), em, ep, 1, _h0, 3, lm, 3, lp, -1)));
+      add(new_ptr((Tree2toNDiagram(2), em, ep, 1, h0_, 3, lm, 3, lp, -1)));
     }
   }
+  if(allowed_==0 || allowed_==12) {
+    tcPDPtr g = getParticleData(ParticleID::g);
+    add(new_ptr((Tree2toNDiagram(2), em, ep, 1, h0_, 3, g, 3, g, -1)));
+  }
 }
 
 double MEee2Higgs2SM::me2() const {
   double aver=0.;
   // get the order right
   int ielectron(0),ipositron(1),ilp(2),ilm(3);
   if(mePartonData()[0]->id()!=11) swap(ielectron,ipositron);
   if(mePartonData()[2]->id()>mePartonData()[3]->id()) swap(ilp,ilm);
   // the arrays for the wavefunction to be passed to the matrix element
-  vector<SpinorWaveFunction> fin,aout;
-  vector<SpinorBarWaveFunction> ain,fout;
+  vector<SpinorWaveFunction> fin;
+  vector<SpinorBarWaveFunction> ain;
   for(unsigned int ihel=0;ihel<2;++ihel) {
     fin .push_back(SpinorWaveFunction(meMomenta()[ielectron],
 				      mePartonData()[ielectron],ihel,incoming));
     ain .push_back(SpinorBarWaveFunction(meMomenta()[ipositron],
 					 mePartonData()[ipositron],ihel,incoming));
-    fout.push_back(SpinorBarWaveFunction(meMomenta()[ilm],
-					 mePartonData()[ilm],ihel,outgoing));
-    aout.push_back(SpinorWaveFunction(meMomenta()[ilp],
-				      mePartonData()[ilp],ihel,outgoing));
   }
-  HelicityME(fin,ain,fout,aout,aver);
-  if(mePartonData()[ilm]->id()<=6) aver*=3.;
+  // H -> f fbar
+  if(mePartonData()[2]->id()!=ParticleID::g) {
+    vector<SpinorWaveFunction> aout;
+    vector<SpinorBarWaveFunction> fout;
+    for(unsigned int ihel=0;ihel<2;++ihel) {
+      fout.push_back(SpinorBarWaveFunction(meMomenta()[ilm],
+					   mePartonData()[ilm],ihel,outgoing));
+      aout.push_back(SpinorWaveFunction(meMomenta()[ilp],
+					mePartonData()[ilp],ihel,outgoing));
+    }
+    HelicityME(fin,ain,fout,aout,aver);
+    if(mePartonData()[ilm]->id()<=6) aver*=3.;
+  }
+  else {
+    vector<VectorWaveFunction> g1,g2;
+    for(unsigned int ihel=0;ihel<2;++ihel) {
+      g1.push_back(VectorWaveFunction(meMomenta()[2],mePartonData()[2],
+				      2*ihel,outgoing));
+      g2.push_back(VectorWaveFunction(meMomenta()[3],mePartonData()[3],
+				      2*ihel,outgoing));
+    }
+    ggME(fin,ain,g1,g2,aver);
+    aver *= 8.;
+  }
   return aver;
 }
 
 // the helicity amplitude matrix element
 ProductionMatrixElement MEee2Higgs2SM::HelicityME(vector<SpinorWaveFunction> fin,
 						  vector<SpinorBarWaveFunction> ain,
 						  vector<SpinorBarWaveFunction> fout,
 						  vector<SpinorWaveFunction> aout,
 						  double & aver) const {
   // the particles should be in the order
   // for the incoming 
   // 0 incoming fermion     (u    spinor)
   // 1 incoming antifermion (vbar spinor)
   // for the outgoing       
   // 0 outgoing fermion     (ubar spinor)
   // 1 outgoing antifermion (v    spinor)
   // me to be returned
   ProductionMatrixElement output(PDT::Spin1Half,PDT::Spin1Half,
 				 PDT::Spin1Half,PDT::Spin1Half);
   // wavefunctions for the intermediate particles
   ScalarWaveFunction interh;
   // temporary storage of the different diagrams
   Complex diag;
   aver=0.;
   // sum over helicities to get the matrix element
   unsigned int inhel1,inhel2,outhel1,outhel2;
   for(inhel1=0;inhel1<2;++inhel1) {	  
     for(inhel2=0;inhel2<2;++inhel2) {
-      interh = _theFFHVertex->evaluate(sHat(),1,_h0,fin[inhel1],ain[inhel2]);
+      interh = FFHVertex_->evaluate(sHat(),1,h0_,fin[inhel1],ain[inhel2]);
       for(outhel1=0;outhel1<2;++outhel1) {
 	for(outhel2=0;outhel2<2;++outhel2) {
-	  diag  = _theFFHVertex->evaluate(sHat(),aout[outhel2],
+	  diag  = FFHVertex_->evaluate(sHat(),aout[outhel2],
 					  fout[outhel1],interh);
 	  output(inhel1,inhel2,outhel1,outhel2)=diag;
 	  aver +=real(diag*conj(diag));
 	}
       }
     }
   }
   return output;
 }
 
 Selector<MEBase::DiagramIndex>
 MEee2Higgs2SM::diagrams(const DiagramVector &) const {
   Selector<DiagramIndex> sel;sel.insert(1.0, 0);
   return sel;
 }
 Selector<const ColourLines *>
 MEee2Higgs2SM::colourGeometries(tcDiagPtr diag) const {
   static ColourLines neutral ( " " );
   static ColourLines quarks  ( "-5 4");
+  static ColourLines gluons  ( "-5 4, 5 -4");
   Selector<const ColourLines *> sel;
   int id = abs((diag->partons()[2])->id());
   if (id<=6 )
     sel.insert(1.0, &quarks);
+  if (id==21)
+    sel.insert(1.0, &gluons);
   else 
     sel.insert(1.0, &neutral);
   return sel;
 }
 
 void MEee2Higgs2SM::persistentOutput(PersistentOStream & os) const {
-  os << _theFFHVertex << _h0 << _allowed;
+  os << FFHVertex_ << HGGVertex_ << h0_ << allowed_;
 }
 
 void MEee2Higgs2SM::persistentInput(PersistentIStream & is, int) {
-  is >> _theFFHVertex >> _h0 >>_allowed;
+  is >> FFHVertex_ >> HGGVertex_ >> h0_ >> allowed_;
 }
 
 ClassDescription<MEee2Higgs2SM> MEee2Higgs2SM::initMEee2Higgs2SM;
 // Definition of the static class description member.
 
 void MEee2Higgs2SM::Init() {
 
   static ClassDocumentation<MEee2Higgs2SM> documentation
     ("The MEee2Higgs2SM class implements the matrix element for e+e- to"
      " SM particle via Higgs exchnage and is designed to be a process to test"
      " things involving scalar particles. ");
 
   static Switch<MEee2Higgs2SM,int> interfaceallowed
     ("Allowed",
      "Allowed outgoing particles",
-     &MEee2Higgs2SM::_allowed, 0, false, false);
+     &MEee2Higgs2SM::allowed_, 0, false, false);
   static SwitchOption interfaceallowedAll
     (interfaceallowed,
      "All",
      "All SM particles allowed",
      0);
   static SwitchOption interfaceallowed1
     (interfaceallowed,
      "Quarks",
      "Only the quarks allowed",
      1);
   static SwitchOption interfaceallowed2
     (interfaceallowed,
      "Leptons",
      "Only the leptons allowed",
      2);
   static SwitchOption interfacealloweddown
     (interfaceallowed,
      "Down",
      "Only d dbar allowed",
      3);
   static SwitchOption interfaceallowedup
     (interfaceallowed,
      "Up",
      "Only u ubar allowed",
      4);
   static SwitchOption interfaceallowedstrange
     (interfaceallowed,
      "Strange",
      "Only s sbar allowed",
      5);
   static SwitchOption interfaceallowedcharm
     (interfaceallowed,
      "Charm",
      "Only c cbar allowed",
      6);
   static SwitchOption interfaceallowedbottom
     (interfaceallowed,
      "Bottom",
      "Only b bbar allowed",
      7);
   static SwitchOption interfaceallowedtop
     (interfaceallowed,
      "Top",
      "Only t tbar allowed",
      8);
   static SwitchOption interfaceallowedelectron
     (interfaceallowed,
      "Electron",
      "Only e+e- allowed",
      9);
   static SwitchOption interfaceallowedMuon
     (interfaceallowed,
      "Muon",
      "Only mu+mu- allowed",
      10);
   static SwitchOption interfaceallowedTau
     (interfaceallowed,
      "Tau",
      "Only tau+tau- allowed",
      11);
+  static SwitchOption interfaceallowedGluon
+    (interfaceallowed,
+     "Gluon",
+     "Only gg allowed",
+     12);
 }
 
 void MEee2Higgs2SM::constructVertex(tSubProPtr sub) {
   // extract the particles in the hard process
   ParticleVector hard;
   hard.push_back(sub->incoming().first);hard.push_back(sub->incoming().second);
   hard.push_back(sub->outgoing()[0]);hard.push_back(sub->outgoing()[1]);
   if(hard[0]->id()<hard[1]->id()) swap(hard[0],hard[1]);
   if(hard[2]->id()<hard[3]->id()) swap(hard[2],hard[3]);
-  vector<SpinorWaveFunction>    fin,aout;
-  vector<SpinorBarWaveFunction> ain,fout;
+  vector<SpinorWaveFunction>    fin;
+  vector<SpinorBarWaveFunction> ain;
   SpinorWaveFunction(   fin ,hard[0],incoming,false,true);
   SpinorBarWaveFunction(ain ,hard[1],incoming,false,true);
-  SpinorBarWaveFunction(fout,hard[2],outgoing,true ,true);
-  SpinorWaveFunction(   aout,hard[3],outgoing,true ,true);
-  // calculate the matrix element
   double me;
-  ProductionMatrixElement prodme=HelicityME(fin,ain,fout,aout,me);
+  ProductionMatrixElement prodme;
+  if(hard[2]->id()!=ParticleID::g) {
+    vector<SpinorWaveFunction>    aout;
+    vector<SpinorBarWaveFunction> fout;
+    SpinorBarWaveFunction(fout,hard[2],outgoing,true ,true);
+    SpinorWaveFunction(   aout,hard[3],outgoing,true ,true);
+    // calculate the matrix element
+    prodme=HelicityME(fin,ain,fout,aout,me);
+  }
+  else {
+    vector<VectorWaveFunction> g1,g2;
+    VectorWaveFunction(g1,hard[2],outgoing,true,true);
+    VectorWaveFunction(g2,hard[3],outgoing,true,true);
+    prodme=ggME(fin,ain,g1,g2,me);
+  }
   // construct the vertex
   HardVertexPtr hardvertex=new_ptr(HardVertex());
   // set the matrix element for the vertex
   hardvertex->ME(prodme);
   // set the pointers and to and from the vertex
   for(unsigned int ix=0;ix<4;++ix) {
     (hard[ix]->spinInfo())->productionVertex(hardvertex);
   }
 }
 
-void MEee2Higgs2SM::rebind(const TranslationMap & trans)
-  {
+void MEee2Higgs2SM::rebind(const TranslationMap & trans) {
   // dummy = trans.translate(dummy);
-  _theFFHVertex = trans.translate(_theFFHVertex);
-  _h0        = trans.translate(_h0);
+  FFHVertex_ = trans.translate(FFHVertex_); 
+  HGGVertex_ = trans.translate(HGGVertex_); 
+  h0_        = trans.translate(h0_);
   ME2to2Base::rebind(trans);
 }
 
 IVector MEee2Higgs2SM::getReferences() {
   IVector ret = ME2to2Base::getReferences();
-  ret.push_back(_theFFHVertex);
-  ret.push_back(_h0);
+  ret.push_back(FFHVertex_);
+  ret.push_back(HGGVertex_);
+  ret.push_back(h0_);
   return ret;
 }
+// the helicity amplitude matrix element
+ProductionMatrixElement MEee2Higgs2SM::ggME(vector<SpinorWaveFunction> fin,
+					    vector<SpinorBarWaveFunction> ain,
+					    vector<VectorWaveFunction> g1,
+					    vector<VectorWaveFunction> g2,
+					    double & aver) const {
+  ProductionMatrixElement output(PDT::Spin1Half,PDT::Spin1Half,
+				 PDT::Spin1,PDT::Spin1);
+  // wavefunctions for the intermediate particles
+  ScalarWaveFunction interh;
+  // temporary storage of the different diagrams
+  Complex diag;
+  aver=0.;
+  // sum over helicities to get the matrix element
+  unsigned int inhel1,inhel2,outhel1,outhel2;
+  for(inhel1=0;inhel1<2;++inhel1) {	  
+    for(inhel2=0;inhel2<2;++inhel2) {
+      interh = FFHVertex_->evaluate(sHat(),1,h0_,fin[inhel1],ain[inhel2]);
+      for(outhel1=0;outhel1<2;++outhel1) {
+	for(outhel2=0;outhel2<2;++outhel2) {
+	  diag  = HGGVertex_->evaluate(sHat(),g1[outhel2],g2[outhel1],interh);
+	  output(inhel1,inhel2,outhel1,outhel2)=diag;
+	  aver +=real(diag*conj(diag));
+	}
+      }
+    }
+  }
+  return output;
+}
diff --git a/Contrib/LeptonME/MEee2Higgs2SM.h b/Contrib/LeptonME/MEee2Higgs2SM.h
--- a/Contrib/LeptonME/MEee2Higgs2SM.h
+++ b/Contrib/LeptonME/MEee2Higgs2SM.h
@@ -1,259 +1,277 @@
 // -*- C++ -*-
 //
 // MEee2Higgs2SM.h is a part of Herwig - A multi-purpose Monte Carlo event generator
 // Copyright (C) 2002-2011 The Herwig Collaboration
 //
 // Herwig is licenced under version 2 of the GPL, see COPYING for details.
 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
 //
 #ifndef HERWIG_MEee2Higgs2SM_H
 #define HERWIG_MEee2Higgs2SM_H
 //
 // This is the declaration of the MEee2Higgs2SM class.
 //
 
 #include "ThePEG/MatrixElement/ME2to2Base.h"
 #include "Herwig/Models/StandardModel/StandardModel.h"
 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
 #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
 
 namespace Herwig {
 
 using namespace ThePEG;
 
 /**
  * The MEee2Higgs2SM class implements the production of an \f$s\f$-channel
  * Higgs in \f$e^+e^-\f$ collisions in order to allow easy tests of Higgs
  * decays. It should not be used for physics studies.
  *
  * @see \ref MEee2Higgs2SMInterfaces "The interfaces"
  * defined for MEee2Higgs2SM.
  */
 class MEee2Higgs2SM: public ME2to2Base {
 
 public:
 
   /**
    * The default constructor.
    */
-  inline MEee2Higgs2SM() : _allowed(0) {}
+  inline MEee2Higgs2SM() : allowed_(0) {}
 
   /** @name Virtual functions required by the MEBase class. */
   //@{
   /**
    * Return the order in \f$\alpha_S\f$ in which this matrix
    * element is given.
    */
   virtual unsigned int orderInAlphaS() const;
 
   /**
    * Return the order in \f$\alpha_{EW}\f$ in which this matrix
    * element is given.
    */
   virtual unsigned int orderInAlphaEW() const;
 
   /**
    * The matrix element for the kinematical configuration
    * previously provided by the last call to setKinematics(), suitably
    * scaled by sHat() to give a dimension-less number.
    * @return the matrix element scaled with sHat() to give a
    * dimensionless number.
    */
   virtual double me2() const;
 
   /**
    * Return the scale associated with the last set phase space point.
    */
   virtual Energy2 scale() const;
 
   /**
    * Add all possible diagrams with the add() function.
    */
   virtual void getDiagrams() const;
 
   /**
    * Get diagram selector. With the information previously supplied with the
    * setKinematics method, a derived class may optionally
    * override this method to weight the given diagrams with their
    * (although certainly not physical) relative probabilities.
    * @param dv the diagrams to be weighted.
    * @return a Selector relating the given diagrams to their weights.
    */
   virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
 
   /**
    * Return a Selector with possible colour geometries for the selected
    * diagram weighted by their relative probabilities.
    * @param diag the diagram chosen.
    * @return the possible colour geometries weighted by their
    * relative probabilities.
    */
   virtual Selector<const ColourLines *>
   colourGeometries(tcDiagPtr diag) const;
 
   /**
    * set up the spin correlations
    */
   virtual void constructVertex(tSubProPtr sub);
   //@}
 
 public:
 
   /** @name Functions used by the persistent I/O system. */
   //@{
   /**
    * Function used to write out object persistently.
    * @param os the persistent output stream written to.
    */
   void persistentOutput(PersistentOStream & os) const;
 
   /**
    * Function used to read in object persistently.
    * @param is the persistent input stream read from.
    * @param version the version number of the object when written.
    */
   void persistentInput(PersistentIStream & is, int version);
   //@}
 
   /**
    * The standard Init function used to initialize the interfaces.
    * Called exactly once for each class by the class description system
    * before the main function starts or
    * when this class is dynamically loaded.
    */
   static void Init();
 
 protected:
 
   /** @name Clone Methods. */
   //@{
   /**
    * Make a simple clone of this object.
    * @return a pointer to the new object.
    */
   inline virtual IBPtr clone() const {return new_ptr(*this);}
 
   /** Make a clone of this object, possibly modifying the cloned object
    * to make it sane.
    * @return a pointer to the new object.
    */
   inline virtual IBPtr fullclone() const {return new_ptr(*this);}
   //@}
 
 protected:
 
   /** @name Standard Interfaced functions. */
   //@{
   /**
    * Initialize this object after the setup phase before saving an
    * EventGenerator to disk.
    * @throws InitException if object could not be initialized properly.
    */
   virtual void doinit();
 
   /**
    * Rebind pointer to other Interfaced objects. Called in the setup phase
    * after all objects used in an EventGenerator has been cloned so that
    * the pointers will refer to the cloned objects afterwards.
    * @param trans a TranslationMap relating the original objects to
    * their respective clones.
    * @throws RebindException if no cloned object was found for a given
    * pointer.
    */
   virtual void rebind(const TranslationMap & trans)
    ;
 
   /**
    * Return a vector of all pointers to Interfaced objects used in this
    * object.
    * @return a vector of pointers.
    */
   virtual IVector getReferences();
   //@}
 
 private: 
 
   /**
    *  The matrix element
    * @param fin The incoming spinor wavefunction
    * @param ain The incoming spinorbar wavefunction
    * @param fout The outgoing spinor bar wavefunction
    * @param aout The outgoing spinor wavefunction
    * @param me The spin averaged matrix element
    */
   ProductionMatrixElement HelicityME(vector<SpinorWaveFunction> fin,
 				     vector<SpinorBarWaveFunction> ain,
 				     vector<SpinorBarWaveFunction> fout,
 				     vector<SpinorWaveFunction> aout,double& me) const;
+  /**
+   *  \f$H\to gg\f$ matrix element
+   * @param fin The incoming spinor wavefunction
+   * @param ain The incoming spinorbar wavefunction
+   * @param g1 Outgoing gluon wavefunction
+   * @param g2 Outgoing gluon wavefunction
+   * @param me The spin averaged matrix element
+   */
+  ProductionMatrixElement ggME(vector<SpinorWaveFunction> fin,
+			       vector<SpinorBarWaveFunction> ain,
+			       vector<VectorWaveFunction> g1,
+			       vector<VectorWaveFunction> g2, 
+			       double & me) const;
   
 private:
 
   /**
    * The static object used to initialize the description of this class.
    * Indicates that this is a concrete class with persistent data.
    */
   static ClassDescription<MEee2Higgs2SM> initMEee2Higgs2SM;
 
   /**
    * The assignment operator is private and must never be called.
    * In fact, it should not even be implemented.
    */
   MEee2Higgs2SM & operator=(const MEee2Higgs2SM &);
 
 private:
 
   /**
-   *  Pointer to the Higgs vertex
+   *  Pointer to the Higgs fermion-antifermion vertex
    */
-  AbstractFFSVertexPtr _theFFHVertex;
+  AbstractFFSVertexPtr FFHVertex_;
+
+  /**
+   *  Pointer to Higgs-gluon-gluon vertex
+   */
+  AbstractVVSVertexPtr HGGVertex_;
 
   /**
    * Allowed outgoing particles
    */
-  int _allowed;
+  int allowed_;
 
   /**
    *  Pointer to the Higgs ParticleData object
    */
-  PDPtr _h0;
+  PDPtr h0_;
 };
 
 }
 
 #include "ThePEG/Utilities/ClassTraits.h"
 
 namespace ThePEG {
 
 /** @cond TRAITSPECIALIZATIONS */
 
 /** This template specialization informs ThePEG about the
  *  base classes of MEee2Higgs2SM. */
 template <>
 struct BaseClassTrait<Herwig::MEee2Higgs2SM,1> {
   /** Typedef of the first base class of MEee2Higgs2SM. */
   typedef ME2to2Base NthBase;
 };
 
 /** This template specialization informs ThePEG about the name of
  *  the MEee2Higgs2SM class and the shared object where it is defined. */
 template <>
 struct ClassTraits<Herwig::MEee2Higgs2SM>
   : public ClassTraitsBase<Herwig::MEee2Higgs2SM> {
   /** Return a platform-independent class name */
   static string className() { return "Herwig::MEee2Higgs2SM"; }
   /**
    * The name of a file containing the dynamic library where the class
    * MEee2Higgs2SM is implemented. It may also include several, space-separated,
    * libraries if the class MEee2Higgs2SM depends on other classes (base classes
    * excepted). In this case the listed libraries will be dynamically
    * linked in the order they are specified.
    */
   static string library() { return "LeptonME.so"; }
 };
 
 /** @endcond */
 
 }
 
 #endif /* HERWIG_MEee2Higgs2SM_H */
diff --git a/Contrib/LeptonME/Makefile.in b/Contrib/LeptonME/Makefile.in
--- a/Contrib/LeptonME/Makefile.in
+++ b/Contrib/LeptonME/Makefile.in
@@ -1,36 +1,36 @@
 # -*- Makefile -*- (for emacs)
 
 #
 # This Makefile is intended for compiling Herwig++ plugins
 # You can find plugins here: INSERT URL
 #
 # This Makefile received very little testing, 
 # any bug reports are very welcome!
 #
 
 # location of include files
 THEPEGINCLUDE=
 HERWIGINCLUDE=
 GSLINCLUDE=
 LDFLAGS = 
 SHARED_FLAG = 
 INCLUDE = $(THEPEGINCLUDE) $(HERWIGINCLUDE) $(GSLINCLUDE)
 #
 # C++ flags
 # 
 CXX = 
 CXXFLAGS = 
 
 ALLCCFILES=$(shell echo *.cc)
 
 default : LeptonME.so
 
 %.o : %.cc %.h
 	$(CXX) -fPIC $(CPPFLAGS) $(INCLUDE) $(CXXFLAGS) -c -shared $< -o $@  
 
 LeptonME.so: MEee2Higgs2SM.o MEee2Z.o
 	$(CXX) -fPIC $(CPPFLAGS) $(INCLUDE) $(CXXFLAGS) \
-	MEee2Higgs2SM.o  MEee2VectorMeson.o  MEee2Z.o $(SHARED_FLAG) $(LDFLAGS) -o LeptonME.so
+	MEee2Higgs2SM.o MEee2Z.o $(SHARED_FLAG) $(LDFLAGS) -o LeptonME.so
 
 clean:
 	rm -f $(ALLCCFILES:.cc=.o) LeptonME.so
diff --git a/Contrib/Makefile.am b/Contrib/Makefile.am
--- a/Contrib/Makefile.am
+++ b/Contrib/Makefile.am
@@ -1,20 +1,21 @@
 EXTRA_DIST = \
 AcerDetInterface \
 AlpGen \
 Analysis2 \
 AnomalousHVV \
 DecayAnalysis \
 FxFx \
 HiggsPair \
 HiggsPairOL \
 LeptonME \
 PGSInterface \
 RadiativeZPrime \
 TauAnalysis \
-MultiWeight
+MultiWeight \
+ShowerVeto
 
 dist-hook:
 	rm -rf `find $(distdir) -name '.svn' -or -name 'Makefile' -or -name '.hg'`
 
 all:  
 	bash make_makefiles.sh
diff --git a/Contrib/ShowerVeto/LHC.in b/Contrib/ShowerVeto/LHC.in
new file mode 100644
--- /dev/null
+++ b/Contrib/ShowerVeto/LHC.in
@@ -0,0 +1,62 @@
+# -*- ThePEG-repository -*-
+
+##################################################
+# Example generator based on LHC parameters
+# usage: Herwig read LHC.in
+##################################################
+
+##################################################
+# Technical parameters for this run
+##################################################
+cd /Herwig/Generators
+set LHCGenerator:NumberOfEvents 10000000
+set LHCGenerator:RandomNumberGenerator:Seed 31122001
+set LHCGenerator:PrintEvent 10000
+set LHCGenerator:MaxErrors 10000
+
+##################################################
+# LHC physics parameters (override defaults here) 
+##################################################
+
+# Intrinsic pT tune extrapolated to LHC energy
+set /Herwig/Shower/Evolver:IntrinsicPtGaussian 2.2*GeV
+
+########################
+## sqrt(s) = 13000 GeV ##
+########################
+set LHCGenerator:EventHandler:LuminosityFunction:Energy 13000.0
+
+##################################################
+# Matrix Elements for hadron-hadron collisions 
+# (by default only gamma/Z switched on)
+##################################################
+cd /Herwig/MatrixElements/
+
+#
+#  QCD and gamma processes
+#
+# QCD 2-2 scattering
+insert SimpleQCD:MatrixElements[0] MEQCD2to2
+set MEQCD2to2:Process 1
+
+cd /Herwig/Shower
+# setup to reweight events ensuring b quarks after shower
+create Herwig::NonBShowerVeto NonBShowerVeto HwShowerVeto.so
+insert Evolver:FullShowerVetoes 0 NonBShowerVeto
+set NonBShowerVeto:Type Primary
+# reweighting, change for other behaviour
+set NonBShowerVeto:Behaviour ShowerReweight
+# or to veto events which don't have b quarks after shower
+# set NonBShowerVeto:Behaviour Event
+set Evolver:MaxTry 1000
+
+
+cd /Herwig/Generators
+##################################################
+# Save run for later usage with 'Herwig run'
+##################################################
+set /Herwig/Analysis/Basics:CheckQuark 0
+set /Herwig/Shower/ShowerHandler:MPIHandler NULL
+set LHCGenerator:EventHandler:DecayHandler NULL
+set LHCGenerator:EventHandler:HadronizationHandler NULL
+saverun LHC LHCGenerator
diff --git a/Contrib/ShowerVeto/Makefile.in b/Contrib/ShowerVeto/Makefile.in
new file mode 100644
--- /dev/null
+++ b/Contrib/ShowerVeto/Makefile.in
@@ -0,0 +1,36 @@
+# -*- Makefile -*- (for emacs)
+
+#
+# This Makefile is intended for compiling Herwig++ plugins
+# You can find plugins here: INSERT URL
+#
+# This Makefile received very little testing, 
+# any bug reports are very welcome!
+#
+
+# location of include files
+THEPEGINCLUDE =
+GSLINCLUDE  =
+HERWIGINCLUDE =
+INCLUDE = $(THEPEGINCLUDE) $(GSLINCLUDE) $(HERWIGINCLUDE)
+#
+# C++ flags
+# 
+CXX = 
+CXXFLAGS = 
+LDFLAGS = 
+SHARED_FLAG = 
+
+ALLCCFILES=$(shell echo *.cc)
+
+default : HwShowerVeto.so
+
+%.o : %.cc %.h
+	$(CXX) -fPIC $(CPPFLAGS) $(INCLUDE) $(CXXFLAGS) -c -shared $< -o $@  
+
+HwShowerVeto.so: NonBShowerVeto.o
+	$(CXX) -fPIC $(CPPFLAGS) $(INCLUDE) $(CXXFLAGS) \
+		NonBShowerVeto.o $(SHARED_FLAG) $(LDFLAGS)  -o HwShowerVeto.so
+
+clean:
+	rm -f $(ALLCCFILES:.cc=.o) HwShowerVeto.so
diff --git a/Contrib/ShowerVeto/NonBShowerVeto.cc b/Contrib/ShowerVeto/NonBShowerVeto.cc
new file mode 100644
--- /dev/null
+++ b/Contrib/ShowerVeto/NonBShowerVeto.cc
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the NonBShowerVeto class.
+//
+
+#include "NonBShowerVeto.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/EventRecord/Particle.h"
+#include "ThePEG/Repository/UseRandom.h"
+#include "ThePEG/Repository/EventGenerator.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+
+using namespace Herwig;
+
+IBPtr NonBShowerVeto::clone() const {
+  return new_ptr(*this);
+}
+
+IBPtr NonBShowerVeto::fullclone() const {
+  return new_ptr(*this);
+}
+
+// The following static variable is needed for the type
+// description system in ThePEG. 
+DescribeNoPIOClass<NonBShowerVeto,FullShowerVeto>
+  describeHerwigNonBShowerVeto("Herwig::NonBShowerVeto", "HwShowerVeto.so");
+
+void NonBShowerVeto::Init() {
+
+  static ClassDocumentation<NonBShowerVeto> documentation
+    ("The NonBShowerVeto class vetos the parton-shower when no b (anti)quarks have been produced");
+
+}
+
+bool NonBShowerVeto::vetoShower() {
+  // loop over final-state
+  for(vector<tPPtr>::const_iterator it=finalState().begin(); it!=finalState().end();++it) {
+    // don't veto if find a b (anti)quark
+    if(abs((**it).id())==5) {
+      return false;
+    }
+  }
+  // no b (anti)quarks veto shower
+  return true;
+}
diff --git a/Contrib/ShowerVeto/NonBShowerVeto.h b/Contrib/ShowerVeto/NonBShowerVeto.h
new file mode 100644
--- /dev/null
+++ b/Contrib/ShowerVeto/NonBShowerVeto.h
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+#ifndef Herwig_NonBShowerVeto_H
+#define Herwig_NonBShowerVeto_H
+//
+// This is the declaration of the NonBShowerVeto class.
+//
+
+#include "Herwig/Shower/Base/FullShowerVeto.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The NonBShowerVeto class vetos parton showers where no b (anti)quarks are produced.
+ *
+ * @see \ref NonBShowerVetoInterfaces "The interfaces"
+ * defined for NonBShowerVeto.
+ */
+class NonBShowerVeto: public FullShowerVeto {
+
+public:
+  /**
+   * The default constructor.
+   */
+  NonBShowerVeto() {}
+
+protected:
+
+  /**
+   *  Determine whether to not to veto the shower, to be implemented in inheriting classes
+   */
+  virtual bool vetoShower();
+
+
+public:
+
+  /**
+   * The standard Init function used to initialize the interfaces.
+   * Called exactly once for each class by the class description system
+   * before the main function starts or
+   * when this class is dynamically loaded.
+   */
+  static void Init();
+
+protected:
+
+  /** @name Clone Methods. */
+  //@{
+  /**
+   * Make a simple clone of this object.
+   * @return a pointer to the new object.
+   */
+  virtual IBPtr clone() const;
+
+  /** Make a clone of this object, possibly modifying the cloned object
+   * to make it sane.
+   * @return a pointer to the new object.
+   */
+  virtual IBPtr fullclone() const;
+  //@}
+
+private:
+
+  /**
+   * The assignment operator is private and must never be called.
+   * In fact, it should not even be implemented.
+   */
+  NonBShowerVeto & operator=(const NonBShowerVeto &);
+
+};
+
+}
+
+#endif /* Herwig_NonBShowerVeto_H */
diff --git a/Decay/FormFactors/Makefile.am b/Decay/FormFactors/Makefile.am
--- a/Decay/FormFactors/Makefile.am
+++ b/Decay/FormFactors/Makefile.am
@@ -1,31 +1,31 @@
 noinst_LTLIBRARIES = libHwFormFactor.la
 pkglib_LTLIBRARIES = HwFormFactors.la
 
 libHwFormFactor_la_SOURCES = \
 BaryonFormFactor.cc BaryonFormFactor.fh \
 BaryonFormFactor.h \
 ScalarFormFactor.cc ScalarFormFactor.fh \
 ScalarFormFactor.h \
 BtoSGammaHadronicMass.h \
 BtoSGammaHadronicMass.cc BtoSGammaHadronicMass.fh
 
-HwFormFactors_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 9:0:0
+HwFormFactors_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 9:1:0
 HwFormFactors_la_SOURCES = \
 BallZwickyScalarFormFactor.cc BallZwickyScalarFormFactor.h \
 BallZwickyVectorFormFactor.cc BallZwickyVectorFormFactor.h \
 BaryonSimpleFormFactor.cc     BaryonSimpleFormFactor.h \
 BaryonThreeQuarkModelFormFactor.cc BaryonThreeQuarkModelFormFactor.h \
 ChengHeavyBaryonFormFactor.cc ChengHeavyBaryonFormFactor.h \
 ISGW2FormFactor.cc ISGW2FormFactor.h \
 ISGWFormFactor.cc ISGWFormFactor.h \
 LambdabExcitedLambdacSumRuleFormFactor.cc \
 LambdabExcitedLambdacSumRuleFormFactor.h \
 LightBaryonQuarkModelFormFactor.cc LightBaryonQuarkModelFormFactor.h \
 SingletonFormFactor.cc SingletonFormFactor.h\
 WSBFormFactor.cc WSBFormFactor.h\
 KiselevBcFormFactor.cc KiselevBcFormFactor.h\
 MelikhovFormFactor.cc MelikhovFormFactor.h \
 MelikhovStechFormFactor.cc MelikhovStechFormFactor.h \
 BtoSGammaFlatEnergy.h BtoSGammaFlatEnergy.cc \
 BtoSGammaKagan.h BtoSGammaKagan.cc\
 HQETFormFactor.h HQETFormFactor.cc
diff --git a/DipoleShower/Makefile.am b/DipoleShower/Makefile.am
--- a/DipoleShower/Makefile.am
+++ b/DipoleShower/Makefile.am
@@ -1,14 +1,14 @@
 SUBDIRS = Base Kernels Kinematics Utility AlphaS
 
 pkglib_LTLIBRARIES = HwDipoleShower.la
 
-HwDipoleShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 6:0:0
+HwDipoleShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 7:0:0
 
 HwDipoleShower_la_LIBADD = \
 	Base/libHwDipoleShowerBase.la \
 	Kernels/libHwDipoleShowerKernels.la \
 	Kinematics/libHwDipoleShowerKinematics.la \
 	Utility/libHwDipoleShowerUtility.la
 
 HwDipoleShower_la_SOURCES =  \
 	DipoleShowerHandler.h DipoleShowerHandler.fh DipoleShowerHandler.cc
diff --git a/MatrixElement/Matchbox/External/GoSam/Makefile.am b/MatrixElement/Matchbox/External/GoSam/Makefile.am
--- a/MatrixElement/Matchbox/External/GoSam/Makefile.am
+++ b/MatrixElement/Matchbox/External/GoSam/Makefile.am
@@ -1,18 +1,18 @@
 pkglib_LTLIBRARIES = HwMatchboxGoSam.la
-HwMatchboxGoSam_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 12:0:0
+HwMatchboxGoSam_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 13:0:0
 
 HwMatchboxGoSam_la_SOURCES = \
 GoSamAmplitude.h GoSamAmplitude.cc
 
 HwMatchboxGoSam_la_CPPFLAGS = $(AM_CPPFLAGS) \
 -DHERWIG_BINDIR="\"$(bindir)\"" \
 -DHERWIG_PKGDATADIR="\"$(pkgdatadir)\"" \
 -DGOSAM_PREFIX="\"$(GOSAMPREFIX)\""
 
 EXTRA_DIST = gosam2herwig.py
 
 install-exec-local:
 	$(install_sh_SCRIPT) $(srcdir)/gosam2herwig.py $(DESTDIR)$(bindir)/gosam2herwig
 
 uninstall-local:
 	rm -f  $(DESTDIR)$(bindir)/gosam2herwig
diff --git a/MatrixElement/Matchbox/External/MadGraph/Makefile.am b/MatrixElement/Matchbox/External/MadGraph/Makefile.am
--- a/MatrixElement/Matchbox/External/MadGraph/Makefile.am
+++ b/MatrixElement/Matchbox/External/MadGraph/Makefile.am
@@ -1,28 +1,28 @@
 pkglib_LTLIBRARIES = HwMatchboxMadGraph.la
-HwMatchboxMadGraph_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:1:0
+HwMatchboxMadGraph_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 3:0:0
 
 HwMatchboxMadGraph_la_SOURCES = \
 MadGraphAmplitude.h MadGraphAmplitude.cc
 
 madgraphdir = ${pkgdatadir}/MadGraphInterface
 
 INPUTFILES = \
 InterfaceMadGraph.f.in \
 param_card.dat.in \
 param_card_heft.dat.in
 
 dist_madgraph_DATA = $(INPUTFILES)
 
 HwMatchboxMadGraph_la_CPPFLAGS = $(AM_CPPFLAGS) \
 -DHERWIG_BINDIR="\"$(bindir)\"" \
 -DHERWIG_INCLUDEDIR="\"$(includedir)\"" \
 -DHERWIG_PKGDATADIR="\"$(pkgdatadir)\"" \
 -DMADGRAPH_PREFIX="\"$(MADGRAPHPREFIX)\""
 
 EXTRA_DIST = mg2herwig.py
 
 install-exec-local:
 	$(install_sh_SCRIPT) $(builddir)/mg2herwig.py $(DESTDIR)$(bindir)/mg2herwig
 
 uninstall-local:
 	rm -f  $(DESTDIR)$(bindir)/mg2herwig
diff --git a/MatrixElement/Matchbox/External/VBFNLO/Makefile.am b/MatrixElement/Matchbox/External/VBFNLO/Makefile.am
--- a/MatrixElement/Matchbox/External/VBFNLO/Makefile.am
+++ b/MatrixElement/Matchbox/External/VBFNLO/Makefile.am
@@ -1,16 +1,16 @@
 pkglib_LTLIBRARIES = HwMatchboxVBFNLO.la
 
-HwMatchboxVBFNLO_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:0:0
+HwMatchboxVBFNLO_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:1:0
 
 HwMatchboxVBFNLO_la_CPPFLAGS = $(AM_CPPFLAGS)
 HwMatchboxVBFNLO_la_CPPFLAGS += -I$(VBFNLOINCLUDE)
 HwMatchboxVBFNLO_la_CPPFLAGS += -DVBFNLOLIB=$(VBFNLOLIB)
 
 #HwMatchboxVBFNLO_la_LIBADD = \
 #-L$(VBFNLOLIBS) \
 #-lVBFNLO -lVBFNLOAmplitudes -lVBFNLOUtilities -lVBFNLOLoops \
 #-lHELAS -lVBFNLOPDFsets -lVBFNLOPhasespace -lVBFspecific -lgfortran
 
 HwMatchboxVBFNLO_la_SOURCES = \
 VBFNLOAmplitude.h VBFNLOAmplitude.cc \
 VBFNLOPhasespace.h VBFNLOPhasespace.cc
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,1565 +1,1569 @@
 Herwig News							 -*- outline -*-
 ================================================================================
 
-* Herwig 7.0.3 release: 2016-xx-xx
+* Herwig 7.0.3 release: 2016-07-21
+
+** subprocess generation filters
+   A number of filters has been implemented to speed up process and diagram
+   generation for the case of Standard Model like processes; this is
+   particularly helpful for processes involving a large number of electroweak
+   combinatorics. See the documentation for more details.
+
+** fix to directory hierarchy
+   A bug in the Herwig-scratch directory hierarchy when integrating with
+   different seeds has been fixed.
 
 ** fix for relocating MadGraph generated amplitudes
    The directory and symbolic link structure for MadGraph-built amplitudes has
    been changed to allow for relocation of a run directory to a different file
    system hierarchy.
 
 ** z* variable added to LeptonsJetsAnalysis
    The builtin LeptonsJetsAnalysis has been extented to include the normalized
    relative rapidity z*
 
-** fix to directory hierarchy
-   A bug in the Herwig-scratch directory hierarchy when integrating with
-   different seeds has been fixed.
-
 ** detuning parameter for shower reweighting
    An efficiency tweak when using the shower reweighting facilities has been
    introduced for the veto algorithms in both the QTilde and the Dipole
    shower. See the documentation for more details.
 
-** subprocess generation filters
-   A number of filters has been implemented to speed up process and diagram
-   generation for the case of Standard Model like processes; this is
-   particularly helpful for processes involving a large number of electroweak
-   combinatorics. See the documentation for more details.
+** BaryonThreeQuarkModelFormFactor
+   A scaling bug in the form factor series expansion was fixed.
+
 
 * Herwig 7.0.2 release: 2016-04-29
 
 ** Event reweighting
   New option of calculating the weights for the effect of varying the scale
   used in both the default and dipole showers. The method is described in
   arXiv:1605.08256
 
 ** mergegrids mode
   A main mode for the Herwig executable has been added which merges the
   integration grids from parallel runs.
 
 ** NLO Diphoton production
   The NLO matrix elements in the POWHEG approach for diphoton production as
   described in JHEP 1202 (2012) 130, arXiv:1106.3939 have been included as
   MEPP2GammaGammaPowheg.
 
 ** BSM Hard process constructor
   A missing Feynman diagram with a t-channel vector boson has been added to
   the matrix element for vv2ss
 
 ** BSM Decay Modes calculation
   The behaviour of the option to disable decay modes in BSM Models has been
   changed so that the partial width for the ignored modes is now calculated
   and included in the total width, but the branching ratio is set to
   zero. This is more physical than the previous option where the mode was
   totally ignored and hence not included in the calculation of the width.
 
 ** Mass Generation
   The behaviour of the GenericMassGenerator has been changed so that modes
   which have been disabled are only included in the calculation of the total
   width and not in the partial width used in the numerator of the weight used
   to select the off-shell mass.
 
 ** Boost detection
   Boost could not detect the compiler version for gcc-5.3 and gcc-6.1
 
 
 
 * Herwig 7.0.1 release: 2016-01-17
 
 ** Version number written to log file
    The Herwig version number is now included in addition to ThePEG's version.
 
 ** Tau lifetimes
    A bug with lifetimes for hard process Taus is fixed. Thanks to ATLAS
    for the report!
 
 ** Shower FSR retries
    Rare events could take a long time due to an extremely large number
    of FSR retries. These are now capped at a configurable number.
 
 ** Dipole shower
    Reweighting for non-radiating events; fixes for shower profile
    handling; option to downgrade large-Q expansion for alphaS
 
 ** Matchbox builtins
    Added massive currents for q-qbar
 
 ** ShowerAlphaQCD
    can now use user-defined thresholds
 
 ** Input snippets
    W/Z/H on-shell now split into three files; 4-flavour scheme added
 
 ** UFO converter
    The converter now has experimental support for writing out param
    cards of its current settings.
 
 ** LEPJetAnalysis loading fixed
 
 ** Contrib
    HJets++ has moved to a stand-alone project, FxFx has been added
 
 * Herwig 7.0.0 (Herwig++ 3.0.0) release: 2015-12-04
 
 ** Major new release
    A major new release of the Monte Carlo event generator Herwig++ (version
    3.0) is now available. This release marks the end of distinguishing
    Herwig++ and HERWIG development and therefore constitutes the first major
    release of version 7 of the Herwig event generator family. The new version
    features a number of significant improvements to the event simulation,
    including: built-in NLO hard process calculation for all Standard Model
    processes, with matching to both angular ordered and dipole shower modules
    via variants of both subtractive (MC@NLO-type) and multiplicative
    (Powheg-type) algorithms; QED radiation and spin correlations in the
    angular ordered shower; a consistent treatment of perturbative
    uncertainties within the hard process and parton showering, as well as a
    vastly improved documentation. This version includes (for a more detailed
    overview and further references please see the release note
    arXiv:1512.01178):
 
 ** A long list of improvements and fixes for the Matchbox module
 *** includes MC@NLO and Powheg matching to both showers with truncated showering
 
 ** A long list of improvements and fixes for both of the shower modules
 *** includes improvements of numerics issues relevant to 100 TeV pp collisions
 
 ** NLO event simulation and Matchbox development
 *** Interfaces to a number of external libraries
 *** A new workflow for event generation
 *** Electroweak corrections to VV production
 
 ** Parton shower development
 *** QED radiation in the angular ordered shower
 *** Spin correlations in the angular ordered shower
 *** New scale choices in gluon branchings
 
 ** Improvements to event generation workflow
 *** Re-organized and streamlined input files for the new NLO development
 *** A unified treatment of shower and matching uncertainties
 *** New integrator modules featuring parallel integration
 
 ** New default tunes for both shower modules
 
 ** New contrib modules
 *** Electroweak Higgs plus jets production
 *** FxFx merging support
 *** Higgs boson pair production
 
 
 
 * Herwig++-2.7.1 release: 2014-07-07
 
 ** New shower switches to select schemes for momentum reconstruction
 *** QTildeReconstructor:FinalStateReconOption
     has the following options:
 *** Default
     All momenta are rescaled in the rest frame.
 *** MostOffShell
     Put all particles on the new-mass shell and the most off-shell and
     recoiling system are rescaled to ensure 4-momentum is conserved.
 *** Recursive
     Recursively put the most off-shell particle which hasn't yet been
     rescaled on-shell by rescaling the particles and the recoiling
     system.
 *** RestMostOffShell
     The most off-shell is put on shell by rescaling it and the
     recoiling system, the recoiling system is then put on-shell in its
     rest frame.
 *** RestRecursive
     As above, but recursively treat the currently most-off shell
     (only makes a difference for more than 3 partons)
 
 ** Ticket #378: Hadronization of baryon number violating clusters involving diquarks
    Fixed by only considering non-diquarks to be combined in the
    ClusterFinder.
 
 ** UFO converter can now parse SLHA files for parameter settings
    The UFO converter code can now use SLHA files for modifying
    parameters. The first pass "ufo2herwig" produces the model to be
    compiled. For each parameter card, run "slha2herwig" to get the
    matching input file.
 
 ** Fix for systems using lib64
    The repository is now initialized correctly on systems using lib64
    as the library location.
    
 ** Efficiency optimization
    Better allocation of internal vector variables for a noticeable
    speed increase of 10-20% with LHC events.
 
 
 
 * Herwig++-2.7.0 release: 2013-10-28
 
 ** UFO interface to Feynman rules generators
    Herwig++ now includes "ufo2herwig", a tool that automatically
    creates all required files to run a BSM model from a UFO
    directory. The conversion has been extensively tested against
    Feynrules models MSSM, NMSSM, RS, Technicolor,
    and less extensively with most of the
    other models in the Feynrules model database.
    We expect that following this release there will be no further
    hard-coded new physics models added to Herwig++ and that future
    models will be included using the UFO interface.
 
 ** Shower uncertainties
    A first set of scaling parameters to estimate shower uncertainties
    is provided for both the angular ordered as well as the dipole
    shower; they are Evolver:HardScaleFactor and ShowerAlphaQCD:
    RenormalizationScaleFactor. 
 
 ** Rewrite of Matchbox NLO matching
    The NLO matching implementation has been rewritten and is now more
    flexible and consistent. Profile scales are provided for the
    hardest emission both for the dipole shower and matrix element
    correction matching.
 
 ** BLHA2 Interface and new processes
    Matchbox now features a generic BLHA2 interface to one-loop
    amplitude codes and now also includes W and W+jet production as
    well as Higss production in gluon fusion as builtin processes.
 
 ** Impoved dipole shower kinematics parametrization
    The kinematics parametrization for emissions in the dipole shower
    has been made more efficient.
 
 ** W and Z Powheg decays
    Decays of W and Z bosons now use the Powheg decayers by default.
 
 ** Improved treatment of beam remnants
    The handling of beam remnants has been improved in multiple
    contexts, leading to a much lower error rate at p+/p- collisions.
    An additional value "VeryHard" for ClusterFissioner:RemnantOption
    can be used to disable any special treatment of beam remnant
    clusters.
 
 ** New underlying event tune
    Herwig++ now uses tune UE-EE-5-MRST by default. Other related tunes
    can be obtained from the Herwig++ tunes page
 
 ** Improvements in BSM code
    The UFO development identified many sign fixes in rarely used BSM
    vertices; many improvements were made to general decayers, allowing
    four-body decays in BSM for the first time; Powheg is enabled in
    General two-body decayers; and the handling of colour
    sextets has been improved.
 
 ** A new HiggsPair matrix element in Contrib.
 
 ** A new matrix element for single top production.
 
 ** The Higgs mass is now set to 125.9 GeV (from PDG 2013 update).
 
 ** C++-11 testing
    To help with the coming transition to C++-11, we provide the new
    --enable-stdcxx11 configure flag. Please try to test builds with
    this flag enabled and let us know any problems, but do not use this
    in production code yet. In future releases, this flag will be on by
    default.
 
 ** Other changes
 *** Many new Rivet analyses have been included in the Tests directory.
 *** Cleaned Shower header structure; grouped shower parameters into one struct.
 *** The boolean Powheg flag in HwMEBase changed to an enumeration.
 
 
 
 
 * Herwig++-2.6.3 release: 2013-02-22
 
 ** Decay vertex positioning in HepMC output
    Pseudo-vertices that Herwig++ inserts for technical reasons will
    now not contribute to the Lorentz positions of downstream vertices.
    Thanks to ATLAS for the bug report!
 
 ** Updated Rivet tests 
    Herwig's library of Rivet test runs has been brought up-to-date
    with new analyses that were recently published by the Rivet
    collaboration.
 
 
 
 * Herwig++-2.6.2 release: 2013-01-30
 
 ** Fixes for PDF and scale choices in POWHEG events
    Scale settings for MPI and the regular shower are now correct in
    POWHEG events. This should fix reported anomalies in POWHEG jet rates.
    NLO PDFs are now also set consistently in the example input files.
 
 ** Ticket #373: Branching ratio factors in cross-section
    If any decay modes are selectively disabled, setting the following
    post-handler will cause all reported cross-sections to include the
    branching ratio factor(s) from the previous stages correctly:
 
    create Herwig::BranchingRatioReweighter BRreweight
    insert LHCGenerator:EventHandler:PostDecayHandlers 0 BRreweight
 
 ** Anomalous vertices now possible in MEfftoVH
 
 ** Interactive shell does not quit on error
 
 ** Better warning messages for events from inconsistent LHEF files
 
 ** Possible division by zero error fixed in BSM branching ratio calculations
 
 ** Decayer and ME changes to improve checkpointing
    The checkpointing changes in ThePEG 1.8.2 are implemented here, too. Regular
    dump files are consistent now.
 
 
 
 * Herwig++-2.6.1 release: 2012-10-16
 
 ** Configure switches
    The various switches to turn off compilation of BSM models have
    been unified into a single '--disable-models'. A new flag
    '--disable-dipole' can be used to turn off the compilation of the
    Dipole and Matchbox codes.
 
 ** Ticket #348: Search path for repository 'read' command
    The search path for the 'read' command is configurable on the
    command line with the -i and -I switches. By default, the
    installation location is now included in the search path, so that
    'Herwig++ read LEP.in' will work in an empty directory. The current
    working directory will always be searched first. 
    The rarely used "Herwig++ init" command has been made consistent
    with 'read' and 'run' and should now be used without the '-i' flag.
 
 ** Width treatment in BSM
    The width treatment in BSM decay chains has been greatly improved
    and is now switched on by default in the .model files. To get the
    old behaviour, use 
      set /Herwig/NewPhysics/NewModel:WhichOffshell Selected
 
 ** New BSM models
    Little Higgs models with and without T-parity are now available.
 
 ** Resonance photon lifetime
    A lifetime bug affecting decays of pi0 to e+e-X was fixed. The
    virtual photon is not part of the event record anymore.
 
 ** Ticket #371: Hard diffraction FPE
    Herwig++ 2.6.0 introduced a bug into the diffraction code which
    would abort any runs. This is now fixed.
 
 ** O2AlphaS
    Support for setting quark masses different from the particle data
    objects as introduced in ThePEG 1.8.1 has been enabled.
 
 ** Matchbox
    Several improvements and bug fixes are included for
    Matchbox. Amplitudes relevant to pp -> Z+jet and crossed processes
    at NLO are now available, and various scale choices have been added
    in a more flexible way. All subtraction dipoles for massive quarks
    are now included.
 
 ** Dipole shower
    Parameters to perform scale variations in the shower have been
    added to estimate uncertainties. A bug in showering off gg -> h has
    been fixed.
 
 ** Minor fixes
 *** Two broken colour structures in GeneralHardME
 *** Susy Higgs mixing matrix
 *** BaryonFactorizedDecayer out-of-bounds access
 *** Mass values in SimpleLHCAnalysis
 
 
 
 * Herwig++-2.6.0 release: 2012-05-21 (tagged at SVN r7407)
 
 ** New NLO framework
    Matchbox, a flexible and very general framework for performing NLO
    calculations at fixed order or matched to parton showers is
    provided with this release.
 
 ** Dipole shower algorithm
    A first implementation of the coherent dipole shower algorithm by
    Plätzer and Gieseke (arXiv:0909.5593 and arXiv:1109.6256) is
    available.
 
 ** Alternative samplers and the ExSample library
    The ExSample library by Plätzer (arXiv:1108.6182) is shipped along
    with Herwig++ in an extended version. The extended version provides
    SamplerBase objects which can be used alternatively to the default
    ACDCSampler.
 
 ** New BSM models
 *** New colour sextet diquark model
     A colour sextet diquark model has been included, as described in
     Richardson and Winn (arXiv:1108.6154).
 
 *** Models reproducing the CDF t-tbar asymmetry
     Four models that can reproduce the reported t-tbar asymmetry have
     been included. 
     
 *** Zprime
     A simple standard model extension by one additional heavy neutral
     vector boson.
 
 ** Interface to AlpGen, with MLM merging
    The Contrib directory contains a new interface to the AlpGen matrix
    element generator. AlpGen events must be preprocessed with the
    provided AlpGenToLH.exe tool before they can be used. More
    information can be found in the Herwig++ 2.6 release note.
 
 ** HiggsVBF Powheg
    Higgs boson production by vector boson fusion is available at NLO
    in the POWHEG scheme, as described in d'Errico, Richardson
    (arXiv:1106.2983). The Powheg DIS processes were available in
    Herwig++-2.5.2 already.
    
 ** Statistical colour reconnection
    Alternative mechanisms to minimize the colour length Sum(m_clu)
    before the hadronization stage, based on Metropolis and annealing
    algorithms.
 
 ** Energy extrapolation of underlying-event tunes
    To describe underlying-event data at different c.m. energies, the
    energy-dependent parameter pT_min will now be adjusted
    automatically, following a power-law. The new tune parameters are
    the value at 7000 GeV "MPIHandler:pTmin0", and MPIHandler:Power.
 
 ** Ticket #239: Reporting of minimum-bias cross-section
    When simulating minimum-bias events using the MEMinBias matrix
    element, the correct unitarized cross section can now be reported
    via the standard facilities; it is no longer necessary to extract
    it from the .log file of the run. The corresponding functionality
    is enabled by inserting a MPIXSecReweighter object as a
    post-subprocess handler: 
    create Herwig::MPIXSecReweighter MPIXSecReweighter 
    insert LHCHandler:PostSubProcessHandlers 0 MPIXSecReweighter
 
 ** Dependency on 'boost'
    Herwig++ now requires the boost headers to build; if not detected
    in standard locations, specify with the --with-boost configure
    option.
 
 ** Tests directory
    The Tests directory now contains input cards for almost all Rivet
    analyses. A full comparison run can be initiated with 'make tests'.
 
 ** Minor changes
 *** Default LHC energy now 8 TeV
     All LHC-based defaults have now been updated to use 8 TeV as the
     center-of-mass energy.
 
 *** Herwig::ExtraParticleID -> ThePEG::ParticleID
     The namespace for additional particles has been unified into
     ThePEG::ParticleID
 
 *** MEee2VectorMeson
     The e+e- -> vector meson matrix element has moved from Contrib into
     HwMELepton.so
 
 *** SUSY numerics fixes
     Better handling of rare numerical instabilities.
 
 *** YODA output for Rivet
     The built-in histogramming handler can now output data in the YODA
     format used by Rivet.
 
 *** Consistency checks in SLHA file reader
     Better warnings for inconsistent SusyLHA files
 
 *** better colour flow checking for development
 
 ** Bug fixes
 *** Extremely offshell W from top decay
     Numerical improvements for very off-shell W bosons coming from top
     decays.
 
 *** Ticket #367: problems in using SUSY + LHE
     Susy events from Les Houches event files are now handled better.
 
 *** Infinite loop in remnant decayer
     The remnant decayer will now abort after 100 tries.
 
 *** Fix to HiggsVBF LO diagrams 
     The diagram structure of HiggsVBF LO matrix elements has been fixed.
 
 *** LEP thrust fix 
     The calculation of the transverse momentum of a branching from the
     evolution variable in final-state radiation can now be
     changed. While formally a sub-leading choice this enables a better
     description of the thrust distribution in e+e- collisions at
     small values of the thrust. Currently the default behaviour, where
     the cut-off masses are used in the calculation, remains the same
     as previous versions.
 
 
 
 
 * Herwig++-2.5.2 release: 2011-11-01 (tagged at SVN r6928)
 
 ** Optional new jet vetoing model
    The jet vetoing model by Schofield and Seymour (arXiv:1103.4811) is
    available via Evolver:ColourEvolutionMethod,
    PartnerFinder:PartnerMethod and SplittingFunction:SplittingColourMethod.
    The default behaviour is unchanged.
 
 ** MPI tune
    Version 3 of the MPI tunes is now the default. Please note that the
    pT parameter is energy-dependent and needs to be modified when an
    LHC run is not at 7 TeV.
    The latest tunes are always available at 
      http://projects.hepforge.org/herwig/trac/wiki/MB_UE_tunes
 
 ** MPI PDFs
    MPI PDFs can now be controlled independently.
 
 ** Initialization time speedup
    A new BSMModel base class was introduced between StandardModel and
    the BSM model classes. Together with a restructured decay mode
    initialization, this offers significantly faster startup times for
    BSM runs. ThreeBodyDecays can now always be switched on without a
    large speed penalty.
 
 ** Decay mode file
    Decay mode files in the SLHA format can now be read separately in
    any BSM model with 'set Model:DecayFileName filename'
 
 ** Powheg DIS
    Charged- and neutral-current DIS processes implementing the POWHEG
    method are now available.
 
 ** Diffraction models
    Xi cut implemented in PomeronFlux
 
 ** Ticket #352: Colour reconnection fixed in DIS
 
 ** Ticket #353: Improved numerical stability in chargino decays
 
 ** Ticket #358: Infinite loop in top events with pT cut in shower
 
 ** Ticket #361: Problem with duplicate 2-body modes in BSM
 
 ** Tickets #362 / #363: Crashes with baryon number violating models
    Particle decays in SUSY models with RPV now work correctly in the
    colour 8 -> 3,3,3 case. Colour reshuffling now works for RPV
    clusters.
 
 ** Improved Fastjet detection
    The configure step uses fastjet-config to make sure all header file
    paths are seen.
 
 ** Darwin 11 / OS X Lion
    A configure bug was fixed which prevented 'make check' from
    succeeding on OS X Lion.
 
 ** Vertex classes
    The specification of QED / QCD orders has been moved to the vertex
    constructors, to allow ThePEG consistency checks. WWHH vertices in
    MSSM and NMSSM were fixed. Some Leptoquark and UED vertices fixed.
 
 ** Hadronization
    Cleanup of obsolete code.
 
 
 
 * Herwig++-2.5.1 release: 2011-06-24 (tagged at SVN r6609)
 
 ** Example input files at 7 TeV
    All our example input files for LHC now have their beam energy set
    to 7 TeV instead of 14 TeV.
 
 ** Colour reconnection on by default
    The colour reconnection tunes are now the default setup. Version 2
    of the tunes replaces the *-1 tunes, which had a problem with LEP
    event shapes.
 
 ** Run name tags
    Aded possibility to add a tag to the run name when running with the
    '-t' option. One run file can thus be run with different seeds and
    results stored in different output files.
 
 ** Floating point exceptions
    The new command line option -D enables floating point error checking.
 
 ** General improvements to WeakCurrent decays
 
 ** Remnant decayer
    Hardwired gluon mass was removed.
 
 ** WeakCurrentDecayConstructor
    Instead of specifying separate Particle1...Particle5 vectors for
    the decay modes, the new interface DecayModes can be filled with
    decay tags in the standard syntax.
 
 ** BSM: improvements to handling of vertex and model initialisation
 
 ** Powheg Higgs
    Option to use pT or mT as the scale in alphaS and for the
    factorization scale in the PDFs
 
 ** Ticket #337: Tau polarization wrong in charged Higgs decay
 
 ** Ticket #339: Colour flows in GeneralThreeBody Decayers for 3bar -> 8 3bar 1
 
 ** Ticket #340: Crash for resonant zero-width particles
 
 ** Ticket #341: Varying scale for BSM processes
    The scale used is now ResonantProcessConstructor:ScaleFactor or
    TwoToTwoProcessConstructor:ScaleFactor multiplied by sHat.
 
 ** Ticket #346: Chargino decays
    Chargino decayers now automatically switch between the mesonic
    decays for mass differences less than 2 GeV and the normal partonic
    decays above 2 GeV.
 
 ** Ticket #349: Stop by default on input file errors
    The '--exitonerror' flag is now the default behaviour for the
    Herwig++ binary. To switch back to the old behaviour,
    '--noexitonerror' is required.
 
 ** Ticket #351: Four-body stop decays
 
 ** Tested with gcc-4.6
 
 
 
 * Herwig++-2.5.0 release: 2011-02-08 (tagged at SVN r6274)
 
 ** Uses ThePEG-1.7.0
    Herwig++ 2.5.0 requires ThePEG 1.7.0 to benefit from various
    improvements, particularly: handling of diffractive processes;
    respecting LD_LIBRARY_PATH when loading dynamic libraries,
    including LHAPDF; improvements to repository commands for decay
    modes. See ThePEG's NEWS file for more details.
 
 ** POWHEG improvements
 
 *** New POWHEG processes
     Simulation at NLO accuracy using the POWHEG method is now
     available for hadronic diboson production (pp to WW,WZ,ZZ), Higgs
     decays to heavy quarks, and e+e- to two jets or ttbar, including
     full mass dependence.
 
 *** Input file changes
     The input files for setting up POWHEG process simulation have been
     simplified.  See the example files LHC-Powheg.in and TVT-Powheg.in
     for the improved command list.
 
 *** Structural changes
     The POWHEG backend in the shower code has been restructured to
     make future additions easier: PowhegEvolver has merged with
     Evolver; both the matrix element corrections and real corrections
     in the POWHEG scheme are implemented directly in the ME or Decayer
     classes.
 
 ** New processes at leading order
 
 *** Photon initiated processes
     We have added a matrix element for dijet production in gamma
     hadron collisions.
     
 *** Bottom and charm in heavy quark ME
     The option of bottom and charm quarks is now supported for heavy
     quark production in MEHeavyQuark.
 
 ** Colour reconnection
    The cluster hadronization model has been extended by an option to
    reconnect coloured constituents between clusters with a given
    probability. This new model is different from the colour
    reconnection model used in FORTRAN HERWIG, and improves the
    description of minimum bias and underlying event data.
 
 ** Diffractive Processes
    Both single and double diffractive processes are now supported in
    Herwig++. The Pomeron PDF is implemented using a fit to HERA data,
    and a pion PDF can be used to model reggeon flux.
 
 ** BSM physics
 
 *** New models 
     We have added new BSM models, particularly ADD-type extra
     dimension models and the next-to-minimal supersymmetric standard
     model (NMSSM).  Effects of leptoquarks can as well be simulated.
 
 *** Vertex additions
     We have added flavour changing stop interactions (stop -
     neutralino - charm) and gravitino interactions with particular
     emphasis on numerical stability for very light gravitinos.
     Tri-linear Higgs and Higgs-Higgs/Vector-Vector four-vertices are
     available as well.
 
 *** Input file changes
     The SUSY model can now also extract the SLHA information from the
     header of a Les Houches event file: replace the SLHA file name
     in the example input files with the LH file name.
 
 *** Structure
     The backend structure of the HardProcessConstructor has changed,
     to allow easier inclusion of new process constructors. Some 2->3
     BSM scattering processes involving neutral higgs bosons are now
     included. The spin handling has been improved in the background. 
 
 ** Shower splitting code reorganized
    The selection of spin structures has been decoupled from the choice
    of colour structure. This gives more flexibility in implementing
    new splittings. Selected splittings can be disabled in the input
    files.
 
 ** B mixing
    B mixing, and indirect CP violation in the B meson system are
    included now.
    
 ** Looptools
    The Looptools directory has been updated to reflect T.Hahn's
    Looptools 2.6.
 
 ** Contrib changes
    The ROOT interface has been removed as deprecated. The MCPWNLO code
    has temporarily been removed from the Contrib directory as a major
    review of this code is required. Additionally, there are various
    fixes to all other codes shipped in Contrib.
 
 ** DIS improvements
    The momentum reshuffling in DIS events has been improved.
 
 ** mu and nu beams
    mu, nu_e and nu_mu and their antiparticles are now available as
    beam particles. They are all supported in the DIS matrix
    elements. mu+ mu- collisions are supported in the general
    matrix element code for BSM models, but not yet in the hard-coded
    matrix elements for lepton-lepton scattering.
 
 ** Structural changes
 
 *** Inline code
     Inline code has been merged into the header files, .icc files were
     removed.
 
 *** Silent build
     By default, Herwig++ now builds with silent build rules. To get
     the old behaviour, run 'make V=1'.
 
 *** Debug level
     The debug level on the command line will now always have priority.
 
 *** Event counter
     The event counter has been simplified.
 
 *** Interpolator persistency
     Interpolators can now be written persistently.
 
 ** Ticket #307: Momentum violation check in BasicConsistency
    Added parameters AbsoluteMomentumTolerance and
    RelativeMomentumTolerance
 
 ** Example POWHEG input files
    The example input files for Powheg processes now set the NLO
    alpha_S correctly, and are run as part of 'make check'.
 
 ** Truncated shower
    A problem which lead to the truncated shower not being applied in
    some cases has been fixed.
 
 ** Fixes to numerical problems
    Minor problems with values close to zero were fixed in several
    locations.
 
 ** Remove duplicated calculation of event shapes
    An accidental duplication in the calculation of event shapes was
    removed, they are now only calculated once per event. Several other
    minor issues in the event shape calculations have also been fixed.
 
 ** MRST PDFs fixed
    An initialization problem in the internal MRST PDFs was fixed.
 
 ** Vertex scale choice
    The scale in the Vertex classes can now be zero where
    possible.
 
 ** Treatment of -N flag
    The Herwig++ main program now correctly treats the -N flag
    as optional.
 
 ** Numerical stability improved
    The numerical stability in the 'RunningMass' and
    'QTildeReconstructor' classes has been improved.  The
    stability of the boosts in the SOPTHY code for the
    simulation of QED radiation has been improved.
    The accuracy of boosts in the z-direction has been improved to
    fix problems with extremely high p_T partons.
 
 ** Bugfix in initial state splittings
    A bug in the implementation of the PDF weight in initial-state
    qbar -> qbar g  splittings has been fixed.
 
 ** Bugfix in chargino neutralino vertices
    A bug in the 'chi+- chi0 W-+' and charged
    Higgs-sfermions vertices has been fixed.
 
 ** Remove uninitialized variables written to repository
    A number of uninitialised variables which were written to the
    repository have been initialised to zero to avoid problems on some
    systems.
 
 ** Fix to QED radiation in hadronic collisions
    The longitudinal boost of the centre-of-mass frame in hadronic
    collisions is correctly accounted for now in the generation of QED
    radiation.
 
 ** Fix to numerical problems in two-body decays
    Numerical problems have been fixed, which appeared in the rare case
    that the three-momenta of the decay products in two-body decays are
    zero in the rest frame of the decay particle.
 
 ** A problem with forced splittings in the Remnant was fixed.
 
 ** ME correction for W+- decays applied properly
    The matrix element correction for QCD radiation in W+- decays
    which was not being applied is now correctly used.
 
 ** Top quark decays from SLHA file
    The presence of top quark decay modes in SLHA files is now handled
    correctly.
 
 ** Exceptional shower reconstruction kinematics
    Additional protection against problems due to the shower
    reconstruction leading to partons with x>1 has been added.
 
 ** Ordering of particles in BSM processes
    Changes have been made to allow arbitrary ordering of the outgoing
    particles in BSM processes.
 
 ** Bugfixes in tau decays
    Two bugs involving tau decays have been fixed. The wrong masses
    were used in the 'KPiCurrent' class for the scalar form factors
    and a mistake in the selection of decay products lead to
    tau- --> pi0 K- being generated instead of tau- --> eta K-.
 
 ** Avoid crashes in baryon number violating processes.
    To avoid crashes, better protection has been introduced for the
    case where diquarks cannot be formed from the quarks in a
    baryon-number violating process. In addition, the parents of the
    baryon-number violating clusters have been changed to avoid
    problems with the conversion of the events to HepMC.
 
 ** QED radiation in W- decays
    A bug in the 'QEDRadiationHandler' class which resulted
    in no QED radiation being generated in W- decays has been fixed.
 
 ** A number of minor fixes to the SUSY models have been made.
 
 ** Partial width calculations in BSM models  
    A fix for the direction of the incoming particle in the calculation
    of two-body partial widths in BSM models has been made.
 
 ** LoopTools improvements   
    The LoopTools cache is now cleared more frequently to
    reduce the amount of memory used by the particle.
 
 ** Negative gluino masses are now correctly handled.
 
 ** A problem with mixing matrices which are not square has been fixed. 
 
 ** Removed duplicate diagram
    The 'MEee2gZ2ll' class has been fixed to only include the
    photon exchange diagram once rather than twice as previously.
 
 ** Fix for duplicate particles in DecayConstructor
    A problem has been fixed which occurred if the same particle was
    included in the list of DecayConstructor:DecayParticles.
 
 ** Fixes for UED model vertices
    A number of minor problems in the vertices for the UED model have
    been fixed.
 
 ** Include missing symmetry factor
    The missing identical-particle symmetry factor in
    'MEPP2GammaGamma' has been included.
 
 ** Fix floating point problem in top decays
    A floating point problem in the matrix element correction for top
    decays has been fixed.
 
 
 
 * Herwig++-2.4.2 release: 2009-12-11 (tagged at SVN r5022)
 
 ** Ticket #292: Tau decay numerical instability
    The momentum assignment in tau decays contained numerical
    instabilities which have been fixed by postponing the tau decay
    until after the parton shower. A new interface setting
    DecayHandler:Excluded is available to prevent decays in the shower
    step. This is enabled by default for tau only.
 
 ** Ticket #290: Missing MSSM colour structure
    The missing colour structure for gluino -> gluon neutralino was added.
 
 ** Ticket #294: Zero momentum in some decays
    Some rare phase space points lead to zero momentum in two-body
    decays. This has been fixed.
 
 ** Ticket #295: Stability of QED radiation for lepton collider processes
    The numerical stability of QED radiation momenta was improved
    further.
 
 ** Ticket #296: K0 oscillation vertex was wrong
    The oscillation from K0 to K0_L/S now takes place at the production
    vertex of K0.
 
 ** Ticket #289: Undefined variables in repository
    On some system configurations, undefined variables were written to
    the repository. These have been fixed.
 
 ** Fixed QED radiation for hadron processes
    The longitudinal boost of the centre-of-mass frame in hadronic
    collisions is correctly accounted for now.
 
 ** Numerical stability fixes 
    Small fixes in RunningMass and QTildeReconstructor.
 
 ** Powheg example input files
    The example input files for Powheg processes now set the NLO
    alpha_S correctly, and are run as part of 'make check'.
 
 ** OS X builds for Snow Leopard
    Snow Leopard machines will now be recognized as a 64bit
    architecture.
 
 
 
 
 * Herwig++-2.4.1 release: 2009-11-19 (tagged at SVN r4932)
 
 ** Uses ThePEG-1.6.0 
    Herwig++ now requires ThePEG-1.6.0 to benefit from the improved
    helicity code there. If you have self-written vertex classes, see
    ThePEG's NEWS file for conversion instructions.
 
 ** Vertex improvements
    ThePEG's new helicity code allowed major simplification of the vertex
    implementations for all Standard Model and BSM physics models.
 
 ** New Transplanckian scattering model
    An example configuration is in LHC-TRP.in
 
 ** BSM ModelGenerator as branching ratio calculator
    The BSM ModelGenerator has a new switch to output the branching
    ratios for a given SLHA file in SLHA format, which can then be used
    elsewhere.
 
 ** BSM debugging: HardProcessConstructor
    New interface 'Excluded' to exclude certain particles from
    intermediate lines.  
 
 ** Chargino-Neutralino-W vertex fixed
 
 ** Spin correlations
    are now switched on by default for all perturbative decays.
 
 ** Ticket #276: Scale choice in BSM models' HardProcessConstructor
    New interface 'ScaleChoice' to choose process scale between 
    - sHat (default for colour neutral intermediates) and 
    - transverse mass (default for all other processes).
 
 ** Ticket #287: Powheg process scale choice
    The default choice is now the mass of the colour-singlet system.
    
 ** Ticket #278: QED radiation for BSM
    Soft QED radiation is now enabled in BSM decays and all
    perturbative decays by default. 
 
 ** Ticket #279: Full 1-loop QED radiation for Z decays
    Soft QED radiation in Z decays is now fully 1-loop by default.
 
 ** Ticket #280: Redirect all files to stdout
    This is now implemented globally. The files previously ending in
    -UE.out and -BSMinfo.out are now appended to the log file. They now
    also obey the EventGenerator:UseStdout flag.
 
 ** Ticket #270: LaTeX output updated
    After each run, a LaTeX file is produced that contains the full
    list of citations. Please include the relevant ones in publications.
 
 ** Ticket #256: Mac OS X problems
    An initialization problem that affected only some configurations has
    been identified and fixed.
 
 ** Tests directory added
    This contains many .in files, to exercise most matrix
    elements. 
 
 ** Minor fixes
 *** Prevent rare x>1 partons in shower reconstruction.
 *** SUSY-LHA parameter EXTPAR can be used to set tan beta
 *** Improved Fastjet detection at configure time
 
 
 
 
 
 * Herwig++-2.4.0 release: 2009-09-01 (tagged at SVN r4616)
 
 ** New matrix elements
    We have added a built-in implementation of several new matrix elements:
    PP --> WW / WZ / ZZ
    PP --> W gamma / Z gamma
    PP --> VBF Higgs
    PP --> Higgs tt / Higgs bb
    e+e- --> WW / ZZ
    gamma gamma --> ff / WW 
 
 
 
 ** Base code improvements
 *** Ticket #257: Remnant handling
     A problem with forced splittings in the Remnant was fixed.
 
 *** Ticket #264: Soft matrix element correction
     A problem with emissions form antiquarks was fixed. 
 
 
 
 ** PDF sets
 *** New default set
     MRST LO** is the new default PDF set. LO* is also available built-in.
 
 *** Shower PDFs can be set separately from the hard process
     Use the 'ShowerHandler:PDF' interface.
 
 
 
 ** Parameter tunes
     Shower, hadronization and underlying event parameters were retuned
     against LEP and Tevatron data respectively.
 
 
 
 ** BSM module improvements
 *** Ticket #259: read error for some UED models
     Arbitrary ordering of outgoing lines in the process description is now
     possible.
 
 *** Ticket #266: branching ratio sums
     The warning threshold for branching ratios not summing to 1 has
     been relaxed. It is now a user interface parameter.
 
 *** Ticket #267: Top decay modes
     Top decay modes listed in SLHA files are now handled correctly.
 
 
 
 ** QED radiation 
 *** Ticket #241: Soft QED radiation is now enabled by default
 
 *** Ticket #265: Radiation off W+ and W- is now handled correctly
 
 
 
 ** Interfaces
 *** Ticket #243: Fastjet
     Fastjet is now the only supported jet finder code. All example
     analyses have been converted to use Fastjet.
 
 *** KtJet and CLHEP interfaces have been removed.
 
 *** New interfaces to AcerDet and PGS available in Contrib
 
 *** MCPWnlo distributed in Contrib
 
 *** HepMC and Rivet interfaces moved to ThePEG
 
 
 
 ** Ticket #239: Inelastic cross-section for MinBias
    This information is now available in the ...-UE.out files.
 
 
 
 ** Technical changes
 *** Ticket #186
     Configure now looks for ThePEG in the --prefix location first.
 
 *** Configure information
     Important configuration information is listed at the end of the
     'configure' run and in the file 'config.thepeg'. Please provide
     this file in any bug reports.
 
 *** New ZERO object
     The ZERO object can be used to set any dimensionful quantity to
     zero. This avoids explicit constructs like 0.0*GeV.
 
 *** Exception specifiers removed
     Client code changes are needed in doinit() etc., simply remove the
     exception specifier after the function name.
 
 *** Ticket #263: Tau polarizations can be forced in TauDecayer
 
 
 
 
 
 * Herwig++-2.3.2 release: 2009-05-08 (tagged at SVN r4249)
 
 ** SUSY enhancements
 
 *** Ticket #245: Select inclusive / exclusive production
     Using the new 'HardProcessConstructor:Processes' switch options
     'SingleParticleInclusive', 'TwoParticleInclusive' or 'Exclusive'
 *** Improved three-body decay generation
     Several problems were fixed, incl. tickets #249 #250 #251
     Thanks to J.Tattersall and K.Rolbiecki for the stress-testing!
 *** Looptools fix
     Release 2.3.1 had broken the Looptools initialization.
 *** Improved warning message texts
 
 ** Ticket #237:
    Values of q2last can now be zero where possible.
 
 ** Ticket #240:
    The Herwig++ main program now correctly treats the -N flag as optional.
 
 ** Ticket #246:
    Extreme pT partons fixed by improving accuracy of z boosts.
 
 ** DIS
    Improved parton shower momentum reshuffling.
 
 ** Minimum Bias events
    The zero-momentum interacting particle used for
    bookkeeping is now labelled as a pomeron. 
 
 ** User Makefile
    Makefile-UserModules does not enable -pedantic anymore. User's ROOT
    code will not compile otherwise.
 
 ** Build system
    Small fixes in the build system.
 
 
 
 * Herwig++-2.3.1 release: 2009-03-31 (tagged at SVN r4140)
 ** Initial state showers
    The PDF veto was wrongly applied to qbar->qbar g splittings.
 
 ** User interaction
    The Makefile-UserModules now includes the Herwig version number.
    The -N flag to 'Herwig++ run' is optional now, as was always intended.
 
 ** Contrib
    The contrib directory is now included in the tarball. The omission
    was accidental.
 
 ** Numerical accuracy
    Minor problems with values close to zero were fixed in several
    locations.
 
 ** LEP event shapes
    An accidental duplication was removed, they are now only calculated
    once per event.
 
 ** MRST PDF code
    Initialization problem fixed.
 
 ** Mac OS X
    The configure script was improved to detect libraries better.
 
 ** Libtool
    Updated to version 2.2.6
 
 
 * Herwig++-2.3.0 release: 2008-12-02 (tagged at SVN r3939)
 ** Major release, with many new features and bug fixes
 
 ** Extension to lepton-hadron collisions
 
 ** Inclusion of several processes accurate at next-to-leading order
    in the POsitive Weight Hardest Emission Generator (POWHEG) scheme
 
 ** Inclusion of three-body decays and finite-width effects
    in BSM processes
 
 ** New procedure for reconstructing kinematics of the parton shower
    based on the colour structure of the hard scattering process
 
 ** New model for baryon decays including excited baryon multiplets
 
 ** Addition of a soft component to the multiple scattering model
    of the underlying event and the option to choose more than one hard
    scattering explicitly
 
 ** New matrix elements for DIS and e+e- processes
 
 ** New /Contrib directory added
    containing external modules that will hopefully be of use to some
    users but are not expected to be needed by most users and are not
    supported at the same level as the main Herwig++ code
 
 ** Minor changes to improve the physics simulation:
 
 *** IncomingPhotonEvolver added
     to allow the simulation of partonic processes with incoming photons
     in hadron collisions
 
 *** KTRapidityCut added
     to allow cuts on the p_T and rapidity, rather than just the p_T and
     pseudorapidity used in SimpleKTCut. This is now used by default for
     cuts on massive particles such as the $W^\pm$, $Z^0$ and Higgs
     bosons and the top quark
 
 *** Several changes to the decayers of B mesons
     both to resolve problems with the modelling of partonic decays and
     improve agreement with $\Upsilon(4s)$ data
 
 *** Changes to allow values other than transverse mass of final-state particles as maximum transverse momentum for radiation in parton shower
     either SCALUP for Les Houches events or the scale of the hard
     process for internally generated hard processes
 
 *** Changed defaults for intrinsic transverse momentum in hadron collisions
     to 1.9GeV, 2.1GeV and 2.2GeV for the Tevatron and LHC at 10 TeV and
     14 TeV, respectively
 
 *** Pdfinfo object is now created in the HepMC interface
     However in order to support all versions of HepMC containing this
     feature the PDF set is not specified as not all versions contain
     this information
 
 *** New option of only decaying particles with lifetimes below user specified value
 
 *** New options for the cut-off in the shower
     and some obsolete parameters removed
 
 *** Added option of switching off certain decay modes in BSM models
 
 *** Added a Matcher for Higgs boson
     to allow cuts to be placed on it
 
 *** Diffractive particles deleted from default input files
     they were not previously used
 
 ** Technical changes:
 
 *** Some AnalysisHandler classes comparing to LEP data have been renamed
     e.g. MultiplicityCount becomes LEPMultiplicityCount to avoid
     confusion with those supplied in /Contrib for observables at the
     Upsilon(4s) resonance
 
 *** Reorganisation to remove the majority of the .icc files
     by moving inlined functions to headers in an effort to improve
     compile time
 
 *** Restructured the decay libraries to reduce the amount of memory allocation
     and de-allocation which improves run-time performance
 
 *** The switch to turn off LoopTools has been removed
     because LoopTools is now used by several core modules. As LoopTools
     does not work on 64-bit platforms with g77 this build option is not
     supported
 
 *** Removed support for obsolete version of HepMC supplied with CLHEP
     and improved the support for different units options with HepMC
 
 *** EvtGen interface has been removed until it is more stable
 
 *** Support for ROOT has been removed
     it was not previously used
 
 *** CKKW infrastructure has been removed from the release
     until a concrete implementation is available
 
 *** Default optimisation has been increased from -O2 to -O3
 
 *** Handling of the fortran compiler has been improved
     mainly due to improvements in the autotools
 
 *** Use of FixedAllocator for Particle objects in ThePEG has been removed
     as it had no performance benefits
 
 ** Bugs fixed:
 
 *** Problems with the mother/daughter relations in the hard process
     and diagram selection in W+- and Z0 production in association with a
     hard jet
 
 *** In general matrix element code for fermion-vector to fermion-scalar
     where the outgoing fermion is coloured and the scalar neutral
 
 *** In the selection of diagrams in some associated squark gaugino processes
 
 *** h0->mu+mu- was being generated when h0->tau+tau-
 
 *** Normalisation in the Histogram class for non unit-weight events
 
 *** Protection against negative PDF values has been improved
     these can occur when using NLO PDF sets
 
 *** Lifetime for BSM particles is now automatically calculated
     at the same time as the width
 
 *** Hadrons containing a top quark now treated like hadrons containing BSM particles
     in order to support this possibility
 
 *** Several ambiguous uses of unsigned int
 
 *** Several variables that may have been used undefined
 
 *** Several memory leaks at initialisation
 
 *** The configuration now aborts if no fortran compiler is found
     as this is required to compile Looptools
 
 *** Several minor floating point errors that did not affect results
 
 
 
 * Herwig++-2.2.1 release: 2008-07-09 (tagged at SVN r3434)
 ** Ticket #181: BSM shower with a decay close to threshold
    Now fixed.
 
 ** Ticket #191: Split SUSY crash
    Improved error message. 
 
 ** Ticket #192: using SCALUP as the pT veto in the shower
    Now implemented.
 
 ** Ticket #194: production processes of ~chi_1(2)-
    Fixed bug in the diagram creation.
 
 ** Removed unused particles
    DiffractiveParticles.in was removed, they were never produced.
 
 ** Hadronization
    Top quark clusters now possible, handled as 'exotic' clusters.
 
 ** Improved handling of decay modes
    See ThePEG-1.3.0. 'defaultparticle' command is now obsolete. 
 
 ** Multi-Parton interactions
    Increased phase space sampling to have less than 1% uncertainty on
    average multiplicity.
 
 ** New libtool version
    gfortran is now used as default if it is available. Set FC=g77 to
    override this. 
 
 ** Fixed several memory leaks
 
 ** Memory allocation
    Now using plain 'new' and 'delete'.
 
 
 * Herwig++-2.2.0 release: 2008-04-18 (tagged at SVN r3195)
 ** Major release: now as stand-alone library
    Herwig++ is now a stand-alone dlopen() plugin to ThePEG.
    No compile-time linking to Herwig code is required. The Herwig++
    binary is a simple executable steering ThePEG, which can
    be replaced by other frontends (such as setupThePEG / runThePEG).  
 
 ** New matrix elements
    p p   -> W + jet / Z + jet / W + higgs / Z + higgs
    e+ e- -> Z + higgs
 
 ** Looptools 
    Updated to version 2.2.
 
 ** Ticket #141: segfault from using 'run' command
    Fixed by using default allocators in Herwig++, and the
    Repository::cleanup() method in ThePEG 1.2.0. 
 
 ** Ticket #157: broken gsl library path on some 64bit systems
    Paths with lib64 are correctly identified now.
 
 ** Ticket #159: p_t spectrum of ttbar pair
    Fixed identical particle multiplier in Sudakov form factor.
 
 ** Ticket #161: glibc segfault
    Rare segfault in MPI handler fixed.
 
 ** Ticket #165: rare infinite loop in four-body decay
    All 4-body decays without dedicated decayers now use the Mambo algorithm.
    A loop guard has been introduced to 3-body decays to avoid infinite retries.
 
 ** Ticket #166: rare infinite loop in top ME correction
    These very rare events (O(1) in 10^7) close to mass threshold
    now are discarded.
 
 ** Higgs width fixes
 
 ** SatPDF
    Optionally, the PDF extrapolation behaviour outside a given range 
    can now be specified.
 
 ** gcc 4.3
    Herwig++-2.2 compiles cleanly with the new gcc 4.3 series.
 
 
 
 
 * Herwig++-2.1.4 release: 2008-03-03 (tagged at SVN r3024)
 ** Ticket #152: Vertex positions
    All vertex positions of unphysical particles are set to zero until
    a fix for the previous nonsensical values can be implemented.
 
 
 
 
 * Herwig++-2.1.3 release: 2008-02-25 (tagged at SVN r2957)
 ** Ticket #129: Baryon decays
    Fix for baryon decay modes.
 
 ** Ticket #131: HepMC
    Check if IO_GenEvent exists
 
 ** Ticket #134: Hadronization
    Smearing of hadron directions in cluster decay fixed.
 
 ** Ticket #137: HepMC
    HepMC conversion allows specification of energy and length units to
    be used. 
 
 ** Ticket #139: Neutral kaons
    Ratio K_L / K_S corrected.
 
 ** Ticket #140 / #141: Crash on shutdown
    Event generation from the 'read' stage or an interface now shuts
    down cleanly. Fixes a crash bug introduced in 2.1.1 which affected
    external APIs to ThePEG / Herwig.
 
 ** Ticket #146: BSM models can be disabled
    To save build time, some or all of the BSM models can be disabled
    using the '--enable-models' configure switch.
 
 ** Reorganised .model files
    The .model files now include the model-specific particles, too.
 
 ** Re-tune
    Re-tuned hadronization parameters to LEP data. 
 
 ** Other fixes in
    QSPAC implementation in Shower; Multi-parton interaction tuning;
    MRST initialization
 
 
 
 
 * Herwig++-2.1.2 release: 2008-01-05 (tagged at SVN r2694)
 ** Ticket #127
    Thanks to a patch submitted by Fred Stober, HepMCFile now can
    output event files in all supported formats. 
 
 ** Ticket #128
    Fixed incorrect value of pi in histogram limits.
 
 ** Other fixes in
    CKKW Qtilde clusterers, BSM width cut, SUSY mixing matrices.
 
 
 
 
 * Herwig++-2.1.1 release: 2007-12-08 (tagged at SVN r2589)
 ** Bug #123
    Fixed a bug with particle lifetimes which resulted in nan for some
    vertex positions.
 
 ** Secondary scatters
    Fixed bug which gave intrinsic pT to secondary scatters.
 
 ** gcc abs bug detection
    configure now checks for and works around
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34130
 
 ** CKKW reweighting
    Fixed wrong check for top quarks.
 
 ** MPIHandler
    Fixed call order ambiguity.
 
 
 
 
 * Herwig++-2.1.0 release: 2007-11-20 (tagged at SVN r2542)
 ** Major new release
    Herwig++-2.1 includes significant improvements, including
    multi-parton interactions, BSM physics and a new hadronic decay
    model, tuned to LEP data.
 
    For an overview of the changes, please see the release note
    arXiv:0711.3137
 
 
 
 
 * Herwig++-2.0.3 release: 2007-08-21 (tagged at SVN r2101)
 
 ** Bug #90
    nan in top decay ME corrections fixed.
 
 ** unlisted
    Colour flow fix in LightClusterDecayer
 
 ** unlisted
    Updated version of MultiplicityCount analysis handler.
 
 
 
 
 * Herwig++-2.0.2 release: 2007-07-06 (tagged at SVN r1716)
 
 ** Bug #80
    Separation of HepMC from CLHEP is handled properly now.
 
 ** Bug #83
    Workaround for OS X header problem
 
 ** unlisted
    Veto on very hard emissions from Shower.
 
 ** unlisted
    Detailed documentation in .in files
 
 
 
 
 * Herwig++-2.0.1 release: 2006-12-05 (tagged at SVN r1195)
 
 ** Bug #54
    ClusterFissioner vertex calculation fixed.
 
 ** Bug #57
    Crash when showering W+jet events supplied by Les Houches interface.
 
 ** Bug #59
    Fix for #57 applied to LHC events.
 
 ** Bug #60
    Segfault when PDF is set to NoPDF.
 
 ** Bug #61
    Missing weight factor for I=0 mesons
 
 ** Bug #62
    Spinor vertex calculations broken when spinor rep is not default rep.
 
 ** Bug #63
    Top decay never produces tau.
 
 ** Bug #69
    TTbar and HiggsJet analysis handlers fixed.
 
 ** unlisted 
    Reorganization of Hadronization module gives 30% speedup. 
    Thanks to Vincenzo Innocente at CMS for his profiling work!
 
 ** unlisted
    cleaner automake files in include/ and src/
 
 ** unlisted 
    Hw64 hadron selection algorithm 'abortnow' fixed.
 
 ** unlisted 
    Top/LeptonDalitzAnalysis removed (only worked with modified code).
 
 ** unlisted
    removed f'_0 from particle list, decays were not handled
 
 
 
 
 * Herwig++-2.0.0 release: 2006-09-28 (tagged at SVN r1066)
 
 ** Full simulation of hadron collisions
diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,18 +1,14 @@
 ========
 Herwig 7
 ========
 
-This is the release of Herwig 7.0.2, a multi purpose event
+This is the release of Herwig 7.0.3, a multi purpose event
 generator for high energy physics.
 
 The Herwig++ distribution contains an adapted version of LoopTools 2.6
 <http://www.feynarts.de/looptools/>. 
 
-Please contact <herwig@projects.hepforge.org> to be added to our
-list of users. This will allow you to make full use of the Wiki and
-bug tracker at http://projects.hepforge.org/herwig/trac/
-
 BUILD AND INSTALL
 =================
-Please refer to https://herwig.hepforge.org/tutorials/index.html
-for detailed instructions.
+Please refer to https://herwig.hepforge.org/tutorials/ for detailed 
+instructions.
diff --git a/Sampling/Makefile.am b/Sampling/Makefile.am
--- a/Sampling/Makefile.am
+++ b/Sampling/Makefile.am
@@ -1,40 +1,40 @@
 SUBDIRS = CellGrids
 
 pkglib_LTLIBRARIES = HwSampling.la
 
-HwSampling_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 3:0:0
+HwSampling_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 4:0:0
 HwSampling_la_SOURCES = \
 GeneralStatistics.h GeneralStatistics.cc \
 MultiIterationStatistics.h MultiIterationStatistics.cc \
 BinSampler.h BinSampler.cc \
 GeneralSampler.h GeneralSampler.cc \
 MonacoSampler.h MonacoSampler.cc \
 Remapper.h Remapper.cc \
 exsample/cell.icc \
 exsample/generator.h \
 exsample/linear_interpolator.icc \
 exsample/config.h \
 exsample/selectors.h \
 exsample/adaption_info.h \
 exsample/selectors.icc \
 exsample/adaption_info.icc \
 exsample/exponential_generator.h \
 exsample/exponential_generator.icc \
 exsample/generator.icc \
 exsample/statistics.h \
 exsample/linear_interpolator.h \
 exsample/cell.h \
 exsample/utility.h \
 exsample/binary_tree.h \
 exsample/statistics.icc
 
 HwSampling_la_LIBADD = \
 CellGrids/libHwCellGrids.la
 
 EXTRA_DIST = herwig-mergegrids.py
 
 install-exec-local:
 	$(install_sh_SCRIPT) $(srcdir)/herwig-mergegrids.py $(DESTDIR)$(bindir)/herwig-mergegrids
 
 uninstall-local:
 	rm -f  $(DESTDIR)$(bindir)/herwig-mergegrids
diff --git a/Shower/Base/Evolver.cc b/Shower/Base/Evolver.cc
--- a/Shower/Base/Evolver.cc
+++ b/Shower/Base/Evolver.cc
@@ -1,3636 +1,3713 @@
 // -*- C++ -*-
 //
 // Evolver.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
 // Copyright (C) 2002-2011 The Herwig Collaboration
 //
 // Herwig is licenced under version 2 of the GPL, see COPYING for details.
 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
 //
 //
 // This is the implementation of the non-inlined, non-templated member
 // functions of the Evolver class.
 //
 #include "Evolver.h"
 #include "ThePEG/Interface/ClassDocumentation.h"
 #include "ThePEG/Interface/Reference.h"
 #include "ThePEG/Interface/RefVector.h"
 #include "ThePEG/Interface/Switch.h"
 #include "ThePEG/Interface/Parameter.h"
 #include "ThePEG/Persistency/PersistentOStream.h"
 #include "ThePEG/Persistency/PersistentIStream.h"
 #include "Herwig/Shower/Base/ShowerParticle.h"
 #include "ThePEG/Utilities/EnumIO.h"
 #include "ShowerKinematics.h"
 #include "ThePEG/PDT/EnumParticles.h"
 #include "ThePEG/Repository/EventGenerator.h"
 #include "ThePEG/Handlers/EventHandler.h"
+#include "ThePEG/Handlers/StandardEventHandler.h"
 #include "ThePEG/Utilities/Throw.h"
 #include "ShowerTree.h"
 #include "ShowerProgenitor.h"
 #include "KinematicsReconstructor.h"
 #include "PartnerFinder.h"
 #include "ThePEG/Handlers/StandardXComb.h"
 #include "ThePEG/PDT/DecayMode.h"
 #include "Herwig/Shower/ShowerHandler.h" 
 #include "ThePEG/Utilities/DescribeClass.h"
 #include "ShowerVertex.h"
 #include "ThePEG/Repository/CurrentGenerator.h"
 #include "Herwig/MatrixElement/Matchbox/Base/SubtractedME.h"
 #include "Herwig/MatrixElement/Matchbox/MatchboxFactory.h"
 #include "ThePEG/Handlers/StandardXComb.h"
 
 using namespace Herwig;
 
 namespace {
 
   /**
    *  A struct to order the particles in the same way as in the DecayMode's
    */
   struct ParticleOrdering {
     /**
      *  Operator for the ordering
      * @param p1 The first ParticleData object
      * @param p2 The second ParticleData object
      */
     bool operator() (tcPDPtr p1, tcPDPtr p2) {
       return abs(p1->id()) > abs(p2->id()) ||
 	( abs(p1->id()) == abs(p2->id()) && p1->id() > p2->id() ) ||
 	( p1->id() == p2->id() && p1->fullName() > p2->fullName() );
     }
   };
   typedef multiset<tcPDPtr,ParticleOrdering> OrderedParticles;
 
   /**
    * Cached lookup of decay modes.
    * Generator::findDecayMode() is not efficient.
    */
   tDMPtr findDecayMode(const string & tag) {
     static map<string,DMPtr> cache;
     map<string,DMPtr>::const_iterator pos = cache.find(tag);
 
     if ( pos != cache.end() ) 
     	return pos->second;
 
     tDMPtr dm = CurrentGenerator::current().findDecayMode(tag);
     cache[tag] = dm;
     return dm;
   }
 }
 
 DescribeClass<Evolver,Interfaced>
 describeEvolver ("Herwig::Evolver","HwShower.so");
 
 bool Evolver::_hardEmissionModeWarn = true;
 bool Evolver::_missingTruncWarn = true;
 
 IBPtr Evolver::clone() const {
   return new_ptr(*this);
 }
 
 IBPtr Evolver::fullclone() const {
   return new_ptr(*this);
 }
 
 void Evolver::persistentOutput(PersistentOStream & os) const {
   os << _model << _splittingGenerator << _maxtry 
      << _meCorrMode << _hardVetoMode << _hardVetoRead << _hardVetoReadOption
      << _limitEmissions << _spinOpt << _softOpt << _hardPOWHEG
      << ounit(_iptrms,GeV) << _beta << ounit(_gamma,GeV) << ounit(_iptmax,GeV) 
-     << _vetoes << _trunc_Mode << _hardEmissionMode << _reconOpt 
+     << _vetoes << _fullShowerVetoes << _nReWeight << _reWeight
+     << _trunc_Mode << _hardEmissionMode << _reconOpt 
      << isMCatNLOSEvent << isMCatNLOHEvent
      << isPowhegSEvent << isPowhegHEvent
      << theFactorizationScaleFactor << theRenormalizationScaleFactor << ounit(muPt,GeV)
      << interaction_ << _maxTryFSR << _maxFailFSR << _fracFSR << interactions_.size();
   for(unsigned int ix=0;ix<interactions_.size();++ix) 
     os << oenum(interactions_[ix]);
 }
 
 void Evolver::persistentInput(PersistentIStream & is, int) {
   unsigned int isize;
   is >> _model >> _splittingGenerator >> _maxtry 
      >> _meCorrMode >> _hardVetoMode >> _hardVetoRead >> _hardVetoReadOption
      >> _limitEmissions >> _spinOpt >> _softOpt >> _hardPOWHEG
      >> iunit(_iptrms,GeV) >> _beta >> iunit(_gamma,GeV) >> iunit(_iptmax,GeV)
-     >> _vetoes >> _trunc_Mode >> _hardEmissionMode >> _reconOpt
+     >> _vetoes >> _fullShowerVetoes >> _nReWeight >> _reWeight
+     >> _trunc_Mode >> _hardEmissionMode >> _reconOpt
      >> isMCatNLOSEvent >> isMCatNLOHEvent
      >> isPowhegSEvent >> isPowhegHEvent
      >> theFactorizationScaleFactor >> theRenormalizationScaleFactor >> iunit(muPt,GeV)
      >> interaction_ >> _maxTryFSR >> _maxFailFSR >> _fracFSR >> isize;
   interactions_.resize(isize);
   for(unsigned int ix=0;ix<interactions_.size();++ix) 
     is >> ienum(interactions_[ix]);
 }
 
 void Evolver::doinit() {
   Interfaced::doinit();
   // interactions may have been changed through a setup file so we
   // clear it up here
   interactions_.clear();
   if(interaction_==0) {
     interactions_.push_back(ShowerInteraction::QCD);
     interactions_.push_back(ShowerInteraction::QED);
   }
   else if(interaction_==1) {
     interactions_.push_back(ShowerInteraction::QCD);
   }
   else if(interaction_==2) {
     interactions_.push_back(ShowerInteraction::QED);
     interactions_.push_back(ShowerInteraction::QCD);
   }
   else if(interaction_==3) {
     interactions_.push_back(ShowerInteraction::QED);
   }
   else if(interaction_==4) {
     interactions_.push_back(ShowerInteraction::Both);
   }
   // calculate max no of FSR vetos
   _maxFailFSR = max(int(_maxFailFSR), int(_fracFSR*double(generator()->N())));
+  // check on the reweighting
+  for(unsigned int ix=0;ix<_fullShowerVetoes.size();++ix) {
+    if(_fullShowerVetoes[ix]->behaviour()==1) {
+      _reWeight = true;
+      break;
+    }
+  }
+  if(_reWeight && maximumTries()<_nReWeight) {
+    throw Exception() << "Reweight being performed in the shower but the number of attempts for the"
+		      << "shower is less than that for the reweighting.\n"
+		      << "Maximum number of attempt for the shower "
+		      << fullName() << ":MaxTry is " << maximumTries() << "\nand for reweighting is "
+		      << fullName() << ":NReWeight is " << _nReWeight << "\n"
+		      << "we recommend the number of attempts is 10 times the number for reweighting\n"
+		      << Exception::runerror;
+  }
 }
 
 void Evolver::Init() {
   
   static ClassDocumentation<Evolver> documentation
     ("This class is responsible for carrying out the showering,",
      "including the kinematics reconstruction, in a given scale range,"
      "including the option of the POWHEG approach to simulated next-to-leading order"
      " radiation\\cite{Nason:2004rx}.",
      "%\\cite{Nason:2004rx}\n"
      "\\bibitem{Nason:2004rx}\n"
      "  P.~Nason,\n"
      "  ``A new method for combining NLO QCD with shower Monte Carlo algorithms,''\n"
      "  JHEP {\\bf 0411} (2004) 040\n"
      "  [arXiv:hep-ph/0409146].\n"
      "  %%CITATION = JHEPA,0411,040;%%\n");
 
   static Reference<Evolver,SplittingGenerator> 
     interfaceSplitGen("SplittingGenerator", 
 		      "A reference to the SplittingGenerator object", 
 		      &Herwig::Evolver::_splittingGenerator,
 		      false, false, true, false);
 
   static Reference<Evolver,ShowerModel> interfaceShowerModel
     ("ShowerModel",
      "The pointer to the object which defines the shower evolution model.",
      &Evolver::_model, false, false, true, false, false);
 
   static Parameter<Evolver,unsigned int> interfaceMaxTry
     ("MaxTry",
      "The maximum number of attempts to generate the shower from a"
      " particular ShowerTree",
-     &Evolver::_maxtry, 100, 1, 1000,
+     &Evolver::_maxtry, 100, 1, 100000,
+     false, false, Interface::limited);
+
+  static Parameter<Evolver,unsigned int> interfaceNReWeight
+    ("NReWeight",
+     "The number of attempts for the shower when reweighting",
+     &Evolver::_nReWeight, 100, 10, 10000,
      false, false, Interface::limited);
 
   static Switch<Evolver, unsigned int> ifaceMECorrMode
     ("MECorrMode",
      "Choice of the ME Correction Mode",
      &Evolver::_meCorrMode, 1, false, false);
   static SwitchOption off
     (ifaceMECorrMode,"No","MECorrections off", 0);
   static SwitchOption on
     (ifaceMECorrMode,"Yes","hard+soft on", 1);
   static SwitchOption hard
     (ifaceMECorrMode,"Hard","only hard on", 2);
   static SwitchOption soft
     (ifaceMECorrMode,"Soft","only soft on", 3);
 
   static Switch<Evolver, unsigned int> ifaceHardVetoMode
     ("HardVetoMode",
      "Choice of the Hard Veto Mode",
      &Evolver::_hardVetoMode, 1, false, false);
   static SwitchOption HVoff
     (ifaceHardVetoMode,"No","hard vetos off", 0);
   static SwitchOption HVon
     (ifaceHardVetoMode,"Yes","hard vetos on", 1);
   static SwitchOption HVIS
     (ifaceHardVetoMode,"Initial", "only IS emissions vetoed", 2);
   static SwitchOption HVFS
     (ifaceHardVetoMode,"Final","only FS emissions vetoed", 3);
 
   static Switch<Evolver, unsigned int> ifaceHardVetoRead
     ("HardVetoScaleSource",
      "If hard veto scale is to be read",
      &Evolver::_hardVetoRead, 0, false, false);
   static SwitchOption HVRcalc
     (ifaceHardVetoRead,"Calculate","Calculate from hard process", 0);
   static SwitchOption HVRread
     (ifaceHardVetoRead,"Read","Read from XComb->lastScale", 1);
 
   static Switch<Evolver, bool> ifaceHardVetoReadOption
     ("HardVetoReadOption",
      "Apply read-in scale veto to all collisions or just the primary one?",
      &Evolver::_hardVetoReadOption, false, false, false);
   static SwitchOption AllCollisions
     (ifaceHardVetoReadOption,
      "AllCollisions",
      "Read-in pT veto applied to primary and secondary collisions.",
      false);
   static SwitchOption PrimaryCollision
     (ifaceHardVetoReadOption,
      "PrimaryCollision",
      "Read-in pT veto applied to primary but not secondary collisions.",
      true);
 
   static Parameter<Evolver, Energy> ifaceiptrms
     ("IntrinsicPtGaussian",
      "RMS of intrinsic pT of Gaussian distribution:\n"
      "2*(1-Beta)*exp(-sqr(intrinsicpT/RMS))/sqr(RMS)",
      &Evolver::_iptrms, GeV, ZERO, ZERO, 1000000.0*GeV,
      false, false, Interface::limited);
 
   static Parameter<Evolver, double> ifacebeta
     ("IntrinsicPtBeta",
      "Proportion of inverse quadratic distribution in generating intrinsic pT.\n"
      "(1-Beta) is the proportion of Gaussian distribution",
      &Evolver::_beta, 0, 0, 1,
      false, false, Interface::limited);
 
   static Parameter<Evolver, Energy> ifacegamma
     ("IntrinsicPtGamma",
      "Parameter for inverse quadratic:\n"
      "2*Beta*Gamma/(sqr(Gamma)+sqr(intrinsicpT))",
      &Evolver::_gamma,GeV, ZERO, ZERO, 100000.0*GeV,
      false, false, Interface::limited);
 
   static Parameter<Evolver, Energy> ifaceiptmax
     ("IntrinsicPtIptmax",
      "Upper bound on intrinsic pT for inverse quadratic",
      &Evolver::_iptmax,GeV, ZERO, ZERO, 100000.0*GeV,
      false, false, Interface::limited);
 
   static RefVector<Evolver,ShowerVeto> ifaceVetoes
     ("Vetoes",
      "The vetoes to be checked during showering",
      &Evolver::_vetoes, -1,
      false,false,true,true,false);
 
+  static RefVector<Evolver,FullShowerVeto> interfaceFullShowerVetoes
+    ("FullShowerVetoes",
+     "The vetos to be appliede on the full final state of the shower",
+     &Evolver::_fullShowerVetoes, -1, false, false, true, false, false);
+
   static Switch<Evolver,unsigned int> interfaceLimitEmissions
     ("LimitEmissions",
      "Limit the number and type of emissions for testing",
      &Evolver::_limitEmissions, 0, false, false);
   static SwitchOption interfaceLimitEmissionsNoLimit
     (interfaceLimitEmissions,
      "NoLimit",
      "Allow an arbitrary number of emissions",
      0);
   static SwitchOption interfaceLimitEmissionsOneInitialStateEmission
     (interfaceLimitEmissions,
      "OneInitialStateEmission",
      "Allow one emission in the initial state and none in the final state",
      1);
   static SwitchOption interfaceLimitEmissionsOneFinalStateEmission
     (interfaceLimitEmissions,
      "OneFinalStateEmission",
      "Allow one emission in the final state and none in the initial state",
      2);
   static SwitchOption interfaceLimitEmissionsHardOnly
     (interfaceLimitEmissions,
      "HardOnly",
      "Only allow radiation from the hard ME correction",
      3);
   static SwitchOption interfaceLimitEmissionsOneEmission
     (interfaceLimitEmissions,
      "OneEmission",
      "Allow one emission in either the final state or initial state, but not both",
      4);
 
   static Switch<Evolver,bool> interfaceTruncMode
     ("TruncatedShower", "Include the truncated shower?", 
      &Evolver::_trunc_Mode, 1, false, false);
   static SwitchOption interfaceTruncMode0
     (interfaceTruncMode,"No","Truncated Shower is OFF", 0);
   static SwitchOption interfaceTruncMode1
     (interfaceTruncMode,"Yes","Truncated Shower is ON", 1);
 
   static Switch<Evolver,int> interfaceHardEmissionMode
     ("HardEmissionMode",
      "Whether to use ME corrections or POWHEG for the hardest emission",
      &Evolver::_hardEmissionMode, 0, false, false);
   static SwitchOption interfaceHardEmissionModeDecayMECorrection
     (interfaceHardEmissionMode,
      "DecayMECorrection",
      "Old fashioned ME correction for decays only",
      -1);
   static SwitchOption interfaceHardEmissionModeMECorrection
     (interfaceHardEmissionMode,
      "MECorrection",
      "Old fashioned ME correction",
      0);
   static SwitchOption interfaceHardEmissionModePOWHEG
     (interfaceHardEmissionMode,
      "POWHEG",
      "Powheg style hard emission using internal matrix elements",
      1);
   static SwitchOption interfaceHardEmissionModeMatchboxPOWHEG
     (interfaceHardEmissionMode,
      "MatchboxPOWHEG",
      "Powheg style emission for the hard process using Matchbox",
      2);
   static SwitchOption interfaceHardEmissionModeFullPOWHEG
     (interfaceHardEmissionMode,
      "FullPOWHEG",
      "Powheg style emission for the hard process using Matchbox "
      "and decays using internal matrix elements",
      3);
 
   static Switch<Evolver,unsigned int > interfaceInteractions
     ("Interactions",
      "The interactions to be used in the shower",
      &Evolver::interaction_, 1, false, false);
   static SwitchOption interfaceInteractionsQCDFirst
     (interfaceInteractions,
      "QCDFirst",
      "QCD first then QED",
      0);
   static SwitchOption interfaceInteractionsQCDOnly
     (interfaceInteractions,
      "QCDOnly",
      "Only QCD",
      1);
   static SwitchOption interfaceInteractionsQEDFirst
     (interfaceInteractions,
      "QEDFirst",
      "QED first then QCD",
      2);
   static SwitchOption interfaceInteractionsQEDOnly
     (interfaceInteractions,
      "QEDOnly",
      "Only QED",
      3);
   static SwitchOption interfaceInteractionsBothAtOnce
     (interfaceInteractions,
      "BothAtOnce",
      "Generate both at the same time",
      4);
 
   static Switch<Evolver,unsigned int> interfaceReconstructionOption
     ("ReconstructionOption",
      "Treatment of the reconstruction of the transverse momentum of "
      "a branching from the evolution scale.",
      &Evolver::_reconOpt, 0, false, false);
   static SwitchOption interfaceReconstructionOptionCutOff
     (interfaceReconstructionOption,
      "CutOff",
      "Use the cut-off masses in the calculation",
      0);
   static SwitchOption interfaceReconstructionOptionOffShell
     (interfaceReconstructionOption,
      "OffShell",
      "Use the off-shell masses in the calculation veto the emission of the parent,"
      " no veto in generation of emissions from children",
      1);
   static SwitchOption interfaceReconstructionOptionOffShell2
     (interfaceReconstructionOption,
      "OffShell2",
      "Use the off-shell masses in the calculation veto the emissions from the children."
      " no veto in generation of emissions from children",
      2);
   static SwitchOption interfaceReconstructionOptionOffShell3
     (interfaceReconstructionOption,
      "OffShell3",
      "Use the off-shell masses in the calculation veto the emissions from the children."
      " veto in generation of emissions from children using cut-off for second parton",
      3);
   static SwitchOption interfaceReconstructionOptionOffShell4
     (interfaceReconstructionOption,
      "OffShell4",
      "Ass OffShell3 but with a restriction on the mass of final-state"
      " jets produced via backward evolution.",
      4);
 
   static Switch<Evolver,unsigned int> interfaceSpinCorrelations
     ("SpinCorrelations",
      "Treatment of spin correlations in the parton shower",
      &Evolver::_spinOpt, 1, false, false);
   static SwitchOption interfaceSpinCorrelationsOff
     (interfaceSpinCorrelations,
      "No",
      "No spin correlations",
      0);
   static SwitchOption interfaceSpinCorrelationsSpin
     (interfaceSpinCorrelations,
      "Yes",
      "Include the azimuthal spin correlations only",
      1);
 
   static Switch<Evolver,unsigned int> interfaceSoftCorrelations
     ("SoftCorrelations",
      "Option for the treatment of soft correlations in the parton shower",
      &Evolver::_softOpt, 2, false, false);
   static SwitchOption interfaceSoftCorrelationsNone
     (interfaceSoftCorrelations,
      "No",
      "No soft correlations",
      0);
   static SwitchOption interfaceSoftCorrelationsFull
     (interfaceSoftCorrelations,
      "Full",
      "Use the full eikonal",
      1);
   static SwitchOption interfaceSoftCorrelationsSingular
     (interfaceSoftCorrelations,
      "Singular",
      "Use original Webber-Marchisini form",
      2);
 
   static Switch<Evolver,bool> interfaceHardPOWHEG
     ("HardPOWHEG",
      "Treatment of powheg emissions which are too hard to have a shower interpretation",
      &Evolver::_hardPOWHEG, false, false, false);
   static SwitchOption interfaceHardPOWHEGAsShower
     (interfaceHardPOWHEG,
      "AsShower",
      "Still interpret as shower emissions",
      false);
   static SwitchOption interfaceHardPOWHEGRealEmission
     (interfaceHardPOWHEG,
      "RealEmission",
      "Generate shower from the real emmission configuration",
      true);
 
   static Parameter<Evolver,unsigned int> interfaceMaxTryFSR
     ("MaxTryFSR",
      "The maximum number of attempted FSR emissions in"
      " the generation of the FSR",
      &Evolver::_maxTryFSR, 100000, 10, 100000000,
      false, false, Interface::limited);
 
   static Parameter<Evolver,unsigned int> interfaceMaxFailFSR
     ("MaxFailFSR",
      "Maximum number of failures generating the FSR",
      &Evolver::_maxFailFSR, 100, 1, 100000000,
      false, false, Interface::limited);
 
 
   static Parameter<Evolver,double> interfaceFSRFailureFraction
     ("FSRFailureFraction",
      "Maximum fraction of events allowed to fail due to too many FSR emissions",
      &Evolver::_fracFSR, 0.001, 1e-10, 1,
      false, false, Interface::limited);
 }
 
 void Evolver::generateIntrinsicpT(vector<ShowerProgenitorPtr> particlesToShower) {
   _intrinsic.clear();
   if ( !ipTon() || !isISRadiationON() ) return;
   // don't do anything for the moment for secondary scatters
   if( !ShowerHandler::currentHandler()->firstInteraction() ) return;
   // generate intrinsic pT
   for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
     // only consider initial-state particles
     if(particlesToShower[ix]->progenitor()->isFinalState()) continue;
     if(!particlesToShower[ix]->progenitor()->dataPtr()->coloured()) continue;
     Energy ipt;
     if(UseRandom::rnd() > _beta) {
       ipt=_iptrms*sqrt(-log(UseRandom::rnd()));
     }
     else {
       ipt=_gamma*sqrt(pow(1.+sqr(_iptmax/_gamma), UseRandom::rnd())-1.);
     }
     pair<Energy,double> pt = make_pair(ipt,UseRandom::rnd(Constants::twopi));
     _intrinsic[particlesToShower[ix]] = pt;
   }
 }
 
 void Evolver::setupMaximumScales(const vector<ShowerProgenitorPtr> & p,
 				 XCPtr xcomb) {
   // let POWHEG events radiate freely
   if(_hardEmissionMode>0&&hardTree()) {
     vector<ShowerProgenitorPtr>::const_iterator ckt = p.begin();
     for (; ckt != p.end(); ckt++) (*ckt)->maxHardPt(Constants::MaxEnergy);
     return;
   }
   // return if no vetos
   if (!hardVetoOn()) return; 
   // find out if hard partonic subprocess.
   bool isPartonic(false); 
   map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator 
     cit = _currenttree->incomingLines().begin();
   Lorentz5Momentum pcm;
   for(; cit!=currentTree()->incomingLines().end(); ++cit) {
     pcm += cit->first->progenitor()->momentum();
     isPartonic |= cit->first->progenitor()->coloured();
   }
   // find minimum pt from hard process, the maximum pt from all outgoing
   // coloured lines (this is simpler and more general than
   // 2stu/(s^2+t^2+u^2)).  Maximum scale for scattering processes will
   // be transverse mass.
   Energy ptmax = generator()->maximumCMEnergy();
   // general case calculate the scale  
   if (!hardVetoXComb()||
       (hardVetoReadOption()&&
        !ShowerHandler::currentHandler()->firstInteraction())) {
     // scattering process
     if(currentTree()->isHard()) {
       assert(xcomb);
       // coloured incoming particles
       if (isPartonic) {
 	map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator 
 	  cjt = currentTree()->outgoingLines().begin();
 	for(; cjt!=currentTree()->outgoingLines().end(); ++cjt) {
 	  if (cjt->first->progenitor()->coloured())
 	    ptmax = min(ptmax,cjt->first->progenitor()->momentum().mt());
 	}
       }
       if (ptmax == generator()->maximumCMEnergy() ) ptmax = pcm.m();
       if(hardVetoXComb()&&hardVetoReadOption()&&
 	 !ShowerHandler::currentHandler()->firstInteraction()) {
 	ptmax=min(ptmax,sqrt(xcomb->lastShowerScale()));
       }
     } 
     // decay, incoming() is the decaying particle.
     else { 
       ptmax = currentTree()->incomingLines().begin()->first
 	->progenitor()->momentum().mass(); 
     }
   }
   // hepeup.SCALUP is written into the lastXComb by the
   // LesHouchesReader itself - use this by user's choice. 
   // Can be more general than this. 
   else {
     if(currentTree()->isHard()) {
       assert(xcomb);
       ptmax = sqrt( xcomb->lastShowerScale() );
     }
     else {
       ptmax = currentTree()->incomingLines().begin()->first
 	->progenitor()->momentum().mass(); 
     }
   }
   ptmax *= ShowerHandler::currentHandler()->hardScaleFactor();
   // set maxHardPt for all progenitors.  For partonic processes this
   // is now the max pt in the FS, for non-partonic processes or
   // processes with no coloured FS the invariant mass of the IS
   vector<ShowerProgenitorPtr>::const_iterator ckt = p.begin();
   for (; ckt != p.end(); ckt++) (*ckt)->maxHardPt(ptmax);
 }
 
 void Evolver::setupHardScales(const vector<ShowerProgenitorPtr> & p,
 			      XCPtr xcomb) {
   if ( hardVetoXComb() &&
        (!hardVetoReadOption() ||
 	ShowerHandler::currentHandler()->firstInteraction()) ) {
     Energy hardScale = ZERO;
     if(currentTree()->isHard()) {
       assert(xcomb);
       hardScale = sqrt( xcomb->lastShowerScale() );
     }
     else {
       hardScale = currentTree()->incomingLines().begin()->first
 	->progenitor()->momentum().mass(); 
     }
     hardScale *= ShowerHandler::currentHandler()->hardScaleFactor();
     vector<ShowerProgenitorPtr>::const_iterator ckt = p.begin();
     for (; ckt != p.end(); ckt++) (*ckt)->hardScale(hardScale);
     muPt = hardScale;
   }
 }
 
 void Evolver::showerHardProcess(ShowerTreePtr hard, XCPtr xcomb) {
 
 
   isMCatNLOSEvent = false;
   isMCatNLOHEvent = false;
   isPowhegSEvent  = false;
   isPowhegHEvent  = false;
 
   Ptr<SubtractedME>::tptr subme;
   Ptr<MatchboxMEBase>::tptr me;
   Ptr<SubtractionDipole>::tptr dipme;
 
   Ptr<StandardXComb>::ptr sxc = dynamic_ptr_cast<Ptr<StandardXComb>::ptr>(xcomb);
 
   if ( sxc ) {
     subme = dynamic_ptr_cast<Ptr<SubtractedME>::tptr>(sxc->matrixElement());
     me = dynamic_ptr_cast<Ptr<MatchboxMEBase>::tptr>(sxc->matrixElement());
     dipme = dynamic_ptr_cast<Ptr<SubtractionDipole>::tptr>(sxc->matrixElement());
   }
 
   if ( subme ) {
     if ( subme->showerApproximation() ) {
       theShowerApproximation = subme->showerApproximation();
       // separate MCatNLO and POWHEG-type corrections
       if ( !subme->showerApproximation()->needsSplittingGenerator() ) {
 	if ( subme->realShowerSubtraction() )
 	  isMCatNLOHEvent = true;
 	else if ( subme->virtualShowerSubtraction() )
 	  isMCatNLOSEvent = true;
       }
       else {
   	if ( subme->realShowerSubtraction() )
   	  isPowhegHEvent = true;
   	else if ( subme->virtualShowerSubtraction() ||  subme->loopSimSubtraction() )
   	  isPowhegSEvent = true;
       }
     }
   } else if ( me ) {
     if ( me->factory()->showerApproximation() ) {
       theShowerApproximation = me->factory()->showerApproximation();
       if ( !me->factory()->showerApproximation()->needsSplittingGenerator() ) 
 	isMCatNLOSEvent = true;
       else
   	isPowhegSEvent = true;
     }
   }
 
   string error = "Inconsistent hard emission set-up in Evolver::showerHardProcess(). "; 
   if ( ( isMCatNLOSEvent || isMCatNLOHEvent ) ){
     if (_hardEmissionMode > 1)
       throw Exception() << error
 			<< "Cannot generate POWHEG matching with MC@NLO shower "
 			<< "approximation.  Add 'set Evolver:HardEmissionMode 0' to input file."
 			<< Exception::runerror;
     if ( ShowerHandler::currentHandler()->canHandleMatchboxTrunc())
       throw Exception() << error
 			<< "Cannot use truncated qtilde shower with MC@NLO shower "
 			<< "approximation.  Set LHCGenerator:EventHandler"
 			<< ":CascadeHandler to '/Herwig/Shower/ShowerHandler' or "
 			<< "'/Herwig/DipoleShower/DipoleShowerHandler'."
 			<< Exception::runerror;
   }
   else if ( ((isPowhegSEvent || isPowhegHEvent) || dipme) &&
 	    _hardEmissionMode < 2){
     if ( ShowerHandler::currentHandler()->canHandleMatchboxTrunc())
       throw Exception() << error
 			<< "Unmatched events requested for POWHEG shower "
 			<< "approximation.  Set Evolver:HardEmissionMode to "
 			<< "'MatchboxPOWHEG' or 'FullPOWHEG'."
 			<< Exception::runerror;
     else if (_hardEmissionModeWarn){
       _hardEmissionModeWarn = false;
       _hardEmissionMode+=2;
       throw Exception() << error
 			<< "Unmatched events requested for POWHEG shower "
 			<< "approximation. Changing Evolver:HardEmissionMode from "
 			<< _hardEmissionMode-2 << " to " << _hardEmissionMode
 			<< Exception::warning;
     }
   }
 
   if ( isPowhegSEvent || isPowhegHEvent) {
     if (theShowerApproximation->needsTruncatedShower() &&
 	!ShowerHandler::currentHandler()->canHandleMatchboxTrunc() )
       throw Exception() << error
 			<< "Current shower handler cannot generate truncated shower.  "
 			<< "Set Generator:EventHandler:CascadeHandler to "
 			<< "'/Herwig/Shower/PowhegShowerHandler'."
 			<< Exception::runerror;
   }
   else if ( dipme && _missingTruncWarn){
     _missingTruncWarn=false;
     throw Exception() << "Warning: POWHEG shower approximation used without "
 		      << "truncated shower.  Set Generator:EventHandler:"
 		      << "CascadeHandler to '/Herwig/Shower/PowhegShowerHandler' and "
 		      << "'MEMatching:TruncatedShower Yes'."
 		      << Exception::warning;   
   }
   else if ( !dipme && _hardEmissionMode > 1 && 
 	    ShowerHandler::currentHandler()->firstInteraction())
     throw Exception() << error
 		      << "POWHEG matching requested for LO events.  Include "
 		      << "'set Factory:ShowerApproximation MEMatching' in input file."
 		      << Exception::runerror;
 
   _hardme = HwMEBasePtr();
   // extract the matrix element
   tStdXCombPtr lastXC = dynamic_ptr_cast<tStdXCombPtr>(xcomb);
   if(lastXC) {
     _hardme = dynamic_ptr_cast<HwMEBasePtr>(lastXC->matrixElement());
   }
   _decayme = HwDecayerBasePtr();
   // set the current tree
   currentTree(hard);
   hardTree(HardTreePtr());
   // number of attempts if more than one interaction switched on
   unsigned int interactionTry=0;
   do {
     try {
       // generate the showering
       doShowering(true,xcomb);
       // if no vetos return
       return;
     }
     catch (InteractionVeto) {
       currentTree()->clear();
       ++interactionTry;
     }
   }
   while(interactionTry<=5);
   throw Exception() << "Too many tries for shower in "
 		    << "Evolver::showerHardProcess()"
 		    << Exception::eventerror;
 }
 
 void Evolver::hardMatrixElementCorrection(bool hard) {
   // set the initial enhancement factors for the soft correction
   _initialenhance = 1.;
   _finalenhance   = 1.;
   // if hard matrix element switched off return
   if(!MECOn(hard)) return;
   // see if we can get the correction from the matrix element
   // or decayer
   if(hard) {
     if(_hardme&&_hardme->hasMECorrection()) {
       _hardme->initializeMECorrection(_currenttree,
 				      _initialenhance,_finalenhance);
       if(hardMEC(hard))
 	_hardme->applyHardMatrixElementCorrection(_currenttree);
     }
   }
   else {
     if(_decayme&&_decayme->hasMECorrection()) {
       _decayme->initializeMECorrection(_currenttree,
 				       _initialenhance,_finalenhance);
       if(hardMEC(hard))
 	_decayme->applyHardMatrixElementCorrection(_currenttree);
     }
   }
 }
 
 ShowerParticleVector Evolver::createTimeLikeChildren(tShowerParticlePtr particle, IdList ids) {
   // Create the ShowerParticle objects for the two children of
   // the emitting particle; set the parent/child relationship
   // if same as definition create particles, otherwise create cc
   tcPDPtr pdata[2];
   for(unsigned int ix=0;ix<2;++ix) pdata[ix]=getParticleData(ids[ix+1]);
   if(particle->id()!=ids[0]) {
     for(unsigned int ix=0;ix<2;++ix) {
       tPDPtr cc(pdata[ix]->CC());
       if(cc) pdata[ix]=cc;
     }
   }
   ShowerParticleVector children;
   for(unsigned int ix=0;ix<2;++ix) {
     children.push_back(new_ptr(ShowerParticle(pdata[ix],true)));
     if(children[ix]->id()==_progenitor->id()&&!pdata[ix]->stable())
       children[ix]->set5Momentum(Lorentz5Momentum(_progenitor->progenitor()->mass()));
     else
       children[ix]->set5Momentum(Lorentz5Momentum(pdata[ix]->mass()));
   }
   return children;
 }
 
 bool Evolver::timeLikeShower(tShowerParticlePtr particle, 
 			     ShowerInteraction::Type type,
 			     Branching fb, bool first) {
   // don't do anything if not needed
   if(_limitEmissions == 1 || hardOnly() || 
      ( _limitEmissions == 2 && _nfs != 0) ||
      ( _limitEmissions == 4 && _nfs + _nis != 0) ) {
     if(particle->spinInfo()) particle->spinInfo()->develop();
     return false;
   }
   // too many tries
   if(_nFSR>=_maxTryFSR) {
     ++_nFailedFSR;
     // too many failed events
     if(_nFailedFSR>=_maxFailFSR)
       throw Exception() << "Too many events have failed due to too many shower emissions, in\n"
 			<< "Evolver::timeLikeShower(). Terminating run\n"
 			<< Exception::runerror;
     throw Exception() << "Too many attempted emissions in Evolver::timeLikeShower()\n"
 		      << Exception::eventerror;
   }
   // generate the emission
   ShowerParticleVector children;
   int ntry=0;
   // generate the emission
   if(!fb.kinematics) 
     fb = selectTimeLikeBranching(particle,type,HardBranchingPtr());
   // no emission, return
   if(!fb.kinematics) {
     if(particle->spinInfo()) particle->spinInfo()->develop();
     return false;
   }
   Branching fc[2];
   bool setupChildren = true;
   while (ntry<50) {
     fc[0] = Branching();
     fc[1] = Branching();
     ++ntry;
     assert(fb.kinematics);
     // has emitted
     // Assign the shower kinematics to the emitting particle.
     if(setupChildren) {
       ++_nFSR;
       particle->showerKinematics(fb.kinematics);
       // generate phi
       fb.kinematics->phi(fb.sudakov->generatePhiForward(*particle,fb.ids,fb.kinematics));
       // check highest pT
       if(fb.kinematics->pT()>progenitor()->highestpT())
 	progenitor()->highestpT(fb.kinematics->pT());
       // create the children
       children = createTimeLikeChildren(particle,fb.ids);
       // update the children
       particle->showerKinematics()->
 	updateChildren(particle, children,fb.type,_reconOpt>=3);
       // update number of emissions
       ++_nfs;
       if(_limitEmissions!=0) {
 	if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
 	if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
 	if(particle->spinInfo()) particle->spinInfo()->develop();
 	return true;
       }
       setupChildren = false;
     }
     // select branchings for children
     fc[0] = selectTimeLikeBranching(children[0],type,HardBranchingPtr());
     fc[1] = selectTimeLikeBranching(children[1],type,HardBranchingPtr());
     // old default
     if(_reconOpt==0) {
       // shower the first  particle
       if(fc[0].kinematics) timeLikeShower(children[0],type,fc[0],false);
       if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
       // shower the second particle
       if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],false);
       if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
       break;
     }
     // Herwig default
     else if(_reconOpt==1) {
       // shower the first  particle
       if(fc[0].kinematics) timeLikeShower(children[0],type,fc[0],false);
       if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
       // shower the second particle
       if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],false);
       if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
       // branching has happened
       particle->showerKinematics()->updateParent(particle, children,fb.type);
       // clean up the vetoed emission
       if(particle->virtualMass()==ZERO) {
    	particle->showerKinematics(ShoKinPtr());
    	for(unsigned int ix=0;ix<children.size();++ix)
    	  particle->abandonChild(children[ix]);
    	children.clear();
    	if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
 	particle->vetoEmission(fb.type,fb.kinematics->scale());
 	// generate the new emission
 	fb = selectTimeLikeBranching(particle,type,HardBranchingPtr());
 	// no emission, return
 	if(!fb.kinematics) {
 	  if(particle->spinInfo()) particle->spinInfo()->develop();
 	  return false;
 	}
 	setupChildren = true;
 	continue;
       }
       else
 	break;
     }
     // veto children
     else if(_reconOpt>=2) {
       // cut-off masses for the branching
       const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
       // compute the masses of the children
       Energy masses[3];
       for(unsigned int ix=0;ix<2;++ix) {
    	if(fc[ix].kinematics) {
    	  const vector<Energy> & vm = fc[ix].sudakov->virtualMasses(fc[ix].ids);
    	  Energy2 q2 = 
    	    fc[ix].kinematics->z()*(1.-fc[ix].kinematics->z())*sqr(fc[ix].kinematics->scale());
    	  if(fc[ix].ids[0]!=ParticleID::g) q2 += sqr(vm[0]);
    	  masses[ix+1] = sqrt(q2);
    	}
    	else {
    	  masses[ix+1] = virtualMasses[ix+1];
    	}
       }
       masses[0] = fb.ids[0]!=ParticleID::g ? virtualMasses[0] : ZERO;
       double z = fb.kinematics->z();
       Energy2 pt2 = z*(1.-z)*(z*(1.-z)*sqr(fb.kinematics->scale()) + sqr(masses[0]))
    	- sqr(masses[1])*(1.-z) - sqr(masses[2])*z;
       if(pt2>=ZERO) {
 	break;
       }
       else {
 	// reset the scales for the children
 	for(unsigned int ix=0;ix<2;++ix) {
 	  if(fc[ix].kinematics)
 	    children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
 	  else
 	    children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
 	  children[ix]->virtualMass(ZERO);
 	} 
       }
     }
   };
   if(_reconOpt>=2) {
     // shower the first  particle
     if(fc[0].kinematics) timeLikeShower(children[0],type,fc[0],false);
     if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
     // shower the second particle
     if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],false);
     if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
     // branching has happened
       particle->showerKinematics()->updateParent(particle, children,fb.type);
   }
   if(first&&!children.empty())
     particle->showerKinematics()->resetChildren(particle,children);
   if(particle->spinInfo()) particle->spinInfo()->develop();
   return true;
 }
 
 bool 
 Evolver::spaceLikeShower(tShowerParticlePtr particle, PPtr beam,
 			 ShowerInteraction::Type type) {
   //using the pdf's associated with the ShowerHandler assures, that
   //modified pdf's are used for the secondary interactions via 
   //CascadeHandler::resetPDFs(...)
   tcPDFPtr pdf;
   if(ShowerHandler::currentHandler()->firstPDF().particle() == _beam)
     pdf = ShowerHandler::currentHandler()->firstPDF().pdf();
   if(ShowerHandler::currentHandler()->secondPDF().particle() == _beam)
     pdf = ShowerHandler::currentHandler()->secondPDF().pdf();
   Energy freeze = ShowerHandler::currentHandler()->pdfFreezingScale();
   // don't do anything if not needed
   if(_limitEmissions == 2  || hardOnly() ||
      ( _limitEmissions == 1 && _nis != 0 ) ||
      ( _limitEmissions == 4 && _nis + _nfs != 0 ) ) {
     if(particle->spinInfo()) particle->spinInfo()->develop();
     return false;
   }
   Branching bb;
   // generate branching
   while (true) {
     bb=_splittingGenerator->chooseBackwardBranching(*particle,beam,
 						    _initialenhance,
 						    _beam,type,
 						    pdf,freeze);
     // return if no emission
     if(!bb.kinematics) {
       if(particle->spinInfo()) particle->spinInfo()->develop();
       return false;
     }
     // if not vetoed break
     if(!spaceLikeVetoed(bb,particle)) break;
     // otherwise reset scale and continue
     particle->vetoEmission(bb.type,bb.kinematics->scale());
     if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
   }
   // assign the splitting function and shower kinematics
   particle->showerKinematics(bb.kinematics);
   if(bb.kinematics->pT()>progenitor()->highestpT())
     progenitor()->highestpT(bb.kinematics->pT());
   // For the time being we are considering only 1->2 branching
   // particles as in Sudakov form factor
   tcPDPtr part[2]={getParticleData(bb.ids[0]),
 		   getParticleData(bb.ids[2])};
   if(particle->id()!=bb.ids[1]) {
     if(part[0]->CC()) part[0]=part[0]->CC();
     if(part[1]->CC()) part[1]=part[1]->CC();
   }
   // Now create the actual particles, make the otherChild a final state
   // particle, while the newParent is not
   ShowerParticlePtr newParent=new_ptr(ShowerParticle(part[0],false));
   ShowerParticlePtr otherChild = new_ptr(ShowerParticle(part[1],true,true));
   ShowerParticleVector theChildren;
   theChildren.push_back(particle); 
   theChildren.push_back(otherChild);
   //this updates the evolution scale
   particle->showerKinematics()->
     updateParent(newParent, theChildren,bb.type);
   // update the history if needed
   _currenttree->updateInitialStateShowerProduct(_progenitor,newParent);
   _currenttree->addInitialStateBranching(particle,newParent,otherChild);
   // for the reconstruction of kinematics, parent/child
   // relationships are according to the branching process:
   // now continue the shower
   ++_nis;
   bool emitted = _limitEmissions==0 ? 
     spaceLikeShower(newParent,beam,type) : false;
   if(newParent->spinInfo()) newParent->spinInfo()->develop();
   // now reconstruct the momentum
   if(!emitted) {
     if(_intrinsic.find(_progenitor)==_intrinsic.end()) {
       bb.kinematics->updateLast(newParent,ZERO,ZERO);
     }
     else {
       pair<Energy,double> kt=_intrinsic[_progenitor];
       bb.kinematics->updateLast(newParent,
 				kt.first*cos(kt.second),
 				kt.first*sin(kt.second));
     }
   }
   particle->showerKinematics()->
     updateChildren(newParent, theChildren,bb.type,_reconOpt>=4);
   if(_limitEmissions!=0) {
     if(particle->spinInfo()) particle->spinInfo()->develop();
     return true;
   }
   // perform the shower of the final-state particle
   timeLikeShower(otherChild,type,Branching(),true);
   updateHistory(otherChild);
   if(theChildren[1]->spinInfo()) theChildren[1]->spinInfo()->develop();
   // return the emitted
   if(particle->spinInfo()) particle->spinInfo()->develop();
   return true;
 }
 
 void Evolver::showerDecay(ShowerTreePtr decay) {
   _decayme = HwDecayerBasePtr();
   _hardme  = HwMEBasePtr();
   // find the decayer
   // try the normal way if possible
   tDMPtr dm = decay->incomingLines().begin()->first->original()   ->decayMode();
   if(!dm) dm = decay->incomingLines().begin()->first->copy()      ->decayMode();
   if(!dm) dm = decay->incomingLines().begin()->first->progenitor()->decayMode();
   // otherwise make a string and look it up
   if(!dm) {
     string tag = decay->incomingLines().begin()->first->original()->dataPtr()->name() 
       + "->";
     OrderedParticles outgoing;
     for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator 
 	  it=decay->outgoingLines().begin();it!=decay->outgoingLines().end();++it) {
       if(abs(decay->incomingLines().begin()->first->original()->id()) == ParticleID::t &&
 	 abs(it->first->original()->id())==ParticleID::Wplus &&
 	 decay->treelinks().size() == 1) {
 	ShowerTreePtr Wtree = decay->treelinks().begin()->first;
 	for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
 	      it2=Wtree->outgoingLines().begin();it2!=Wtree->outgoingLines().end();++it2) {
 	  outgoing.insert(it2->first->original()->dataPtr());
 	}
       }
       else {
 	outgoing.insert(it->first->original()->dataPtr());
       }
     }
     for(OrderedParticles::const_iterator it=outgoing.begin(); it!=outgoing.end();++it) {
       if(it!=outgoing.begin()) tag += ",";
       tag +=(**it).name();
     }
     tag += ";";
     dm = findDecayMode(tag);
   }
   if(dm) _decayme = dynamic_ptr_cast<HwDecayerBasePtr>(dm->decayer());
   // set the ShowerTree to be showered
   currentTree(decay);
   decay->applyTransforms();
   hardTree(HardTreePtr());
   unsigned int interactionTry=0;
   do {
     try {
       // generate the showering
       doShowering(false,XCPtr());
       // if no vetos 
       // force calculation of spin correlations
       SpinPtr spInfo = decay->incomingLines().begin()->first->progenitor()->spinInfo();
       if(spInfo) {
 	if(!spInfo->developed()) spInfo->needsUpdate();
 	spInfo->develop();
       }
       // and then return
       return;
     }
     catch (InteractionVeto) {
       currentTree()->clear();
       ++interactionTry;
     }
   }
   while(interactionTry<=5);
   throw Exception() << "Too many tries for QED shower in Evolver::showerDecay()"
 		    << Exception::eventerror;
 }
 
 bool Evolver::spaceLikeDecayShower(tShowerParticlePtr particle,
 				   const ShowerParticle::EvolutionScales & maxScales,
 				   Energy minmass,ShowerInteraction::Type type,
 				   Branching fb) {
   // too many tries
   if(_nFSR>=_maxTryFSR) {
     ++_nFailedFSR;
     // too many failed events
     if(_nFailedFSR>=_maxFailFSR)
       throw Exception() << "Too many events have failed due to too many shower emissions, in\n"
 			<< "Evolver::timeLikeShower(). Terminating run\n"
 			<< Exception::runerror;
     throw Exception() << "Too many attempted emissions in Evolver::timeLikeShower()\n"
 		      << Exception::eventerror;
   }
   // generate the emission
   ShowerParticleVector children;
   int ntry=0;
   // generate the emission
   if(!fb.kinematics) 
     fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,
 				       HardBranchingPtr());
   // no emission, return
   if(!fb.kinematics) return false;
   Branching fc[2];
   bool setupChildren = true;
   while (ntry<50) {
     if(particle->virtualMass()==ZERO) 
       particle->virtualMass(_progenitor->progenitor()->mass());
     fc[0] = Branching();
     fc[1] = Branching();
     ++ntry;
     assert(fb.kinematics);
     // has emitted
     // Assign the shower kinematics to the emitting particle.
     if(setupChildren) {
       ++_nFSR;
       // Assign the shower kinematics to the emitting particle.
       particle->showerKinematics(fb.kinematics);
       if(fb.kinematics->pT()>progenitor()->highestpT())
 	progenitor()->highestpT(fb.kinematics->pT());
       // create the ShowerParticle objects for the two children
       children = createTimeLikeChildren(particle,fb.ids);
       // updateChildren the children
       particle->showerKinematics()->
 	updateChildren(particle, children, fb.type,_reconOpt>=3);
       setupChildren = false;
     }
     // select branchings for children
     fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,
 					  type,HardBranchingPtr());
     fc[1] = selectTimeLikeBranching      (children[1],type,HardBranchingPtr());
     // old default
     if(_reconOpt==0) {
       // shower the first  particle
       _currenttree->updateInitialStateShowerProduct(_progenitor,children[0]);
       _currenttree->addInitialStateBranching(particle,children[0],children[1]);
       if(fc[0].kinematics) spaceLikeDecayShower(children[0],maxScales,minmass,type,Branching());
       // shower the second particle
       if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],true);
       updateHistory(children[1]);
       // branching has happened
       break;
     }
     // Herwig default
     else if(_reconOpt==1) {
       // shower the first  particle
       _currenttree->updateInitialStateShowerProduct(_progenitor,children[0]);
       _currenttree->addInitialStateBranching(particle,children[0],children[1]);
       if(fc[0].kinematics) spaceLikeDecayShower(children[0],maxScales,minmass,type,Branching());
       // shower the second particle
       if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],true);
       updateHistory(children[1]);
       // branching has happened
       particle->showerKinematics()->updateParent(particle, children,fb.type);
       // clean up the vetoed emission
       if(particle->virtualMass()==ZERO) {
     	particle->showerKinematics(ShoKinPtr());
    	for(unsigned int ix=0;ix<children.size();++ix)
    	  particle->abandonChild(children[ix]);
     	children.clear();
  	particle->vetoEmission(fb.type,fb.kinematics->scale());
  	// generate the new emission
   	fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,
 				       HardBranchingPtr());
  	// no emission, return
   	if(!fb.kinematics) {
   	  return false;
    	}
   	setupChildren = true;
    	continue;
       }
       else
    	break;
     }
     else if(_reconOpt>=2) {
       // cut-off masses for the branching
       const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
       // compute the masses of the children
       Energy masses[3];
       // space-like children
       masses[1] = children[0]->virtualMass();
       // time-like child
       if(fc[1].kinematics) {
 	const vector<Energy> & vm = fc[1].sudakov->virtualMasses(fc[1].ids);
 	Energy2 q2 = 
 	  fc[1].kinematics->z()*(1.-fc[1].kinematics->z())*sqr(fc[1].kinematics->scale());
 	if(fc[1].ids[0]!=ParticleID::g) q2 += sqr(vm[0]);
 	masses[2] = sqrt(q2);
       }
       else {
 	masses[2] = virtualMasses[2];
       } 
       masses[0]=particle->virtualMass();
       double z = fb.kinematics->z();
       Energy2 pt2 = (1.-z)*(z*sqr(masses[0])-sqr(masses[1])-z/(1.-z)*sqr(masses[2]));
       if(pt2>=ZERO) {
   	break;
       }
       else {
   	// reset the scales for the children
   	for(unsigned int ix=0;ix<2;++ix) {
   	  if(fc[ix].kinematics)
   	    children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
   	  else {
 	    if(ix==0) 
 	      children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,Constants::MaxEnergy);
 	    else
 	      children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
 	  }
    	} 
 	children[0]->virtualMass(_progenitor->progenitor()->mass());
 	children[1]->virtualMass(ZERO);
       }
     }
   };
   if(_reconOpt>=2) {
     // In the case of splittings which involves coloured particles,
     // set properly the colour flow of the branching.
     // update the history if needed
     _currenttree->updateInitialStateShowerProduct(_progenitor,children[0]);
     _currenttree->addInitialStateBranching(particle,children[0],children[1]);
     // shower the first  particle
     if(fc[0].kinematics) spaceLikeDecayShower(children[0],maxScales,minmass,type,Branching());
     // shower the second particle
     if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],true);
     updateHistory(children[1]);
     // branching has happened
     particle->showerKinematics()->updateParent(particle, children,fb.type);
   }
   // branching has happened
   return true;
 }
 
 vector<ShowerProgenitorPtr> Evolver::setupShower(bool hard) {
   // generate POWHEG hard emission if needed
   if(_hardEmissionMode>0) hardestEmission(hard);
   ShowerInteraction::Type inter = interactions_[0];
   if(_hardtree&&inter!=ShowerInteraction::Both) {
     inter = _hardtree->interaction();
   }
   // set the initial colour partners
   setEvolutionPartners(hard,inter,false);
   // generate hard me if needed
   if(_hardEmissionMode==0 ||
      (!hard && _hardEmissionMode==-1)) hardMatrixElementCorrection(hard);
   // get the particles to be showered
   vector<ShowerProgenitorPtr> particlesToShower = 
     currentTree()->extractProgenitors();
   // remake the colour partners if needed
   if(_currenttree->hardMatrixElementCorrection()) {
     setEvolutionPartners(hard,interactions_[0],true);
     _currenttree->resetShowerProducts();
   }
   // return the answer
   return particlesToShower;
 }
 
 void Evolver::setEvolutionPartners(bool hard,ShowerInteraction::Type type,
 				   bool clear) {
   // match the particles in the ShowerTree and hardTree
   if(hardTree() && !hardTree()->connect(currentTree()))
     throw Exception() << "Can't match trees in "
 		      << "Evolver::setEvolutionPartners()"
 		      << Exception::eventerror;
   // extract the progenitors
   vector<ShowerParticlePtr> particles = 
     currentTree()->extractProgenitorParticles();
   // clear the partners if needed
   if(clear) {
     for(unsigned int ix=0;ix<particles.size();++ix) {
       particles[ix]->partner(ShowerParticlePtr());
       particles[ix]->clearPartners();
     }
   }
   // sort out the colour partners
   if(hardTree()) {
     // find the partner
     for(unsigned int ix=0;ix<particles.size();++ix) {
       tHardBranchingPtr partner = 
 	hardTree()->particles()[particles[ix]]->colourPartner();
       if(!partner) continue;
       for(map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
 	    it=hardTree()->particles().begin();
 	  it!=hardTree()->particles().end();++it) {
 	if(it->second==partner) particles[ix]->partner(it->first);
       }
       if(!particles[ix]->partner()) 
 	throw Exception() << "Can't match partners in "
 			  << "Evolver::setEvolutionPartners()"
 			  << Exception::eventerror;
     }
   }
   // Set the initial evolution scales
   showerModel()->partnerFinder()->
     setInitialEvolutionScales(particles,!hard,type,!_hardtree);
   if(hardTree() && _hardPOWHEG) {
     bool tooHard=false;
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       eit=hardTree()->particles().end();
     for(unsigned int ix=0;ix<particles.size();++ix) {
       map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
 	mit = hardTree()->particles().find(particles[ix]);
       Energy hardScale(ZERO);
       ShowerPartnerType::Type type(ShowerPartnerType::Undefined);
       // final-state
       if(particles[ix]->isFinalState()) {
 	if(mit!= eit && !mit->second->children().empty()) {
 	  hardScale = mit->second->scale();
 	  type = mit->second->type();
 	}
       }
       // initial-state
       else {
 	if(mit!= eit && mit->second->parent()) {
 	  hardScale = mit->second->parent()->scale();
 	  type = mit->second->parent()->type();
 	}
       }
       if(type!=ShowerPartnerType::Undefined) {
 	if(type==ShowerPartnerType::QED) {
 	  tooHard |= particles[ix]->scales().QED_noAO<hardScale;
 	}
 	else if(type==ShowerPartnerType::QCDColourLine) {
 	  tooHard |= particles[ix]->scales().QCD_c_noAO<hardScale;
 	}
 	else if(type==ShowerPartnerType::QCDAntiColourLine) {
 	  tooHard |= particles[ix]->scales().QCD_ac_noAO<hardScale;
 	}
       }
     }
     if(tooHard) convertHardTree(hard,type);
   }
 }
 
 void Evolver::updateHistory(tShowerParticlePtr particle) {
   if(!particle->children().empty()) {
     ShowerParticleVector theChildren;
     for(unsigned int ix=0;ix<particle->children().size();++ix) {
       ShowerParticlePtr part = dynamic_ptr_cast<ShowerParticlePtr>
 	(particle->children()[ix]);
       theChildren.push_back(part);
     }
     // update the history if needed
     if(particle==_currenttree->getFinalStateShowerProduct(_progenitor))
       _currenttree->updateFinalStateShowerProduct(_progenitor,
 						  particle,theChildren);
     _currenttree->addFinalStateBranching(particle,theChildren);
     for(unsigned int ix=0;ix<theChildren.size();++ix)
       updateHistory(theChildren[ix]);
   }
 }
 
 bool Evolver::startTimeLikeShower(ShowerInteraction::Type type) {
   _nFSR = 0;
   if(hardTree()) {
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       eit=hardTree()->particles().end(),
       mit = hardTree()->particles().find(progenitor()->progenitor());
     if( mit != eit && !mit->second->children().empty() ) {
       bool output=truncatedTimeLikeShower(progenitor()->progenitor(),
 					  mit->second ,type,Branching(),true);
       if(output) updateHistory(progenitor()->progenitor());
       return output;
     }
   }
   bool output = hardOnly() ? false :
     timeLikeShower(progenitor()->progenitor() ,type,Branching(),true) ;
   if(output) updateHistory(progenitor()->progenitor());
   return output;
 }
 
 bool Evolver::startSpaceLikeShower(PPtr parent, ShowerInteraction::Type type) {
   if(hardTree()) {
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       eit =hardTree()->particles().end(),
       mit = hardTree()->particles().find(progenitor()->progenitor());
     if( mit != eit && mit->second->parent() ) {
       return truncatedSpaceLikeShower( progenitor()->progenitor(),
 				       parent, mit->second->parent(), type );
     } 
   }
   return  hardOnly() ? false :
     spaceLikeShower(progenitor()->progenitor(),parent,type);
 }
 
 bool Evolver::
 startSpaceLikeDecayShower(const ShowerParticle::EvolutionScales & maxScales,
 			  Energy minimumMass,ShowerInteraction::Type type) {
   _nFSR = 0;
   if(hardTree()) {
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       eit =hardTree()->particles().end(),
       mit = hardTree()->particles().find(progenitor()->progenitor());
     if( mit != eit && mit->second->parent() ) {
       HardBranchingPtr branch=mit->second;
       while(branch->parent()) branch=branch->parent();
       return truncatedSpaceLikeDecayShower(progenitor()->progenitor(),maxScales,
 					   minimumMass, branch ,type, Branching());
     }
   }
   return  hardOnly() ? false :
     spaceLikeDecayShower(progenitor()->progenitor(),maxScales,minimumMass,type,Branching());
 }
 
 bool Evolver::timeLikeVetoed(const Branching & fb,
 			     ShowerParticlePtr particle) {
   // work out type of interaction
   ShowerInteraction::Type type = fb.type==ShowerPartnerType::QED ? 
     ShowerInteraction::QED : ShowerInteraction::QCD;
   // check whether emission was harder than largest pt of hard subprocess
   if ( hardVetoFS() && fb.kinematics->pT() > _progenitor->maxHardPt() ) 
     return true;
   // soft matrix element correction veto
   if( softMEC()) {
     if(_hardme && _hardme->hasMECorrection()) {
       if(_hardme->softMatrixElementVeto(_progenitor,particle,fb))
 	return true;
     }
     else if(_decayme && _decayme->hasMECorrection()) {
       if(_decayme->softMatrixElementVeto(_progenitor,particle,fb))
 	return true;
     }
   }
   // veto on maximum pt
   if(fb.kinematics->pT()>_progenitor->maximumpT(type)) return true;
   // general vetos
   if (fb.kinematics && !_vetoes.empty()) {
     bool vetoed=false;
     for (vector<ShowerVetoPtr>::iterator v = _vetoes.begin();
 	 v != _vetoes.end(); ++v) {
       bool test = (**v).vetoTimeLike(_progenitor,particle,fb);
       switch((**v).vetoType()) {
       case ShowerVeto::Emission:
 	vetoed |= test;
 	break;
       case ShowerVeto::Shower:
 	if(test) throw VetoShower();
 	break;
       case ShowerVeto::Event:
 	if(test) throw Veto();
 	break;
       }
     }
     if(vetoed) return true;
   }
   if ( ShowerHandler::currentHandler()->firstInteraction() &&
        ShowerHandler::currentHandler()->profileScales() ) {
     double weight = 
       ShowerHandler::currentHandler()->profileScales()->
       hardScaleProfile(_progenitor->hardScale(),fb.kinematics->pT());
     if ( UseRandom::rnd() > weight )
       return true;
   }
   return false;
 }
 
 bool Evolver::spaceLikeVetoed(const Branching & bb,
 			      ShowerParticlePtr particle) {
   // work out type of interaction
   ShowerInteraction::Type type = bb.type==ShowerPartnerType::QED ? 
     ShowerInteraction::QED : ShowerInteraction::QCD;
   // check whether emission was harder than largest pt of hard subprocess
   if (hardVetoIS() && bb.kinematics->pT() > _progenitor->maxHardPt())
     return true;
   // apply the soft correction
   if( softMEC() && _hardme && _hardme->hasMECorrection() ) {
     if(_hardme->softMatrixElementVeto(_progenitor,particle,bb))
       return true;
   }
   // the more general vetos
 
   // check vs max pt for the shower
   if(bb.kinematics->pT()>_progenitor->maximumpT(type)) return true;
 
   if (!_vetoes.empty()) {
     bool vetoed=false;
     for (vector<ShowerVetoPtr>::iterator v = _vetoes.begin();
 	 v != _vetoes.end(); ++v) {
       bool test = (**v).vetoSpaceLike(_progenitor,particle,bb);
       switch ((**v).vetoType()) {
       case ShowerVeto::Emission:
 	vetoed |= test;
 	break;
       case ShowerVeto::Shower:
 	if(test) throw VetoShower();
 	break;
       case ShowerVeto::Event:
 	if(test) throw Veto();
 	break;
       }
     }
     if (vetoed) return true;
   }
   if ( ShowerHandler::currentHandler()->firstInteraction() &&
        ShowerHandler::currentHandler()->profileScales() ) {
     double weight = 
       ShowerHandler::currentHandler()->profileScales()->
       hardScaleProfile(_progenitor->hardScale(),bb.kinematics->pT());
     if ( UseRandom::rnd() > weight )
       return true;
   }
   return false;
 }
 
 bool Evolver::spaceLikeDecayVetoed( const Branching & fb,
 				    ShowerParticlePtr particle) {
   // work out type of interaction
   ShowerInteraction::Type type = fb.type==ShowerPartnerType::QED ? 
     ShowerInteraction::QED : ShowerInteraction::QCD;
   // apply the soft correction
   if( softMEC() && _decayme && _decayme->hasMECorrection() ) {
     if(_decayme->softMatrixElementVeto(_progenitor,particle,fb))
       return true;
   }
   // veto on hardest pt in the shower
   if(fb.kinematics->pT()> _progenitor->maximumpT(type)) return true;
   // general vetos
   if (!_vetoes.empty()) {
     bool vetoed=false;
     for (vector<ShowerVetoPtr>::iterator v = _vetoes.begin();
 	 v != _vetoes.end(); ++v) {
       bool test = (**v).vetoSpaceLike(_progenitor,particle,fb);
       switch((**v).vetoType()) {
       case ShowerVeto::Emission:
 	vetoed |= test;
 	break;
       case ShowerVeto::Shower:
 	if(test) throw VetoShower();
 	break;
       case ShowerVeto::Event:
 	if(test) throw Veto();
 	break;
       }
       if (vetoed) return true;
     }
   }
   return false;
 }
 
 void Evolver::hardestEmission(bool hard) {
   HardTreePtr ISRTree;
   if(  ( _hardme  &&  _hardme->hasPOWHEGCorrection()!=0  && _hardEmissionMode< 2) ||
        ( _decayme && _decayme->hasPOWHEGCorrection()!=0  && _hardEmissionMode!=2) ) {
     if(_hardme) {
       assert(hard);
       if(interaction_==4) {
 	vector<ShowerInteraction::Type> inter(2);
 	inter[0] = ShowerInteraction::QCD;
 	inter[1] = ShowerInteraction::QED;
 	_hardtree =  _hardme->generateHardest( currentTree(),inter         );
       }
       else {
 	_hardtree =  _hardme->generateHardest( currentTree(),interactions_ );
       }
     }
     else {
       assert(!hard);
       _hardtree = _decayme->generateHardest( currentTree() );
     }
     // store initial state POWHEG radiation
     if(_hardtree && _hardme && _hardme->hasPOWHEGCorrection()==1) 
       ISRTree=_hardtree;
   }
 
   else if (_hardEmissionMode>1 && hard) {
     // Get minimum pT cutoff used in shower approximation
     Energy maxpt = 1.*GeV;
     int colouredIn  = 0;
     int colouredOut = 0;
     for( map< ShowerProgenitorPtr, tShowerParticlePtr >::iterator it
 	   = currentTree()->outgoingLines().begin(); 
 	 it != currentTree()->outgoingLines().end(); ++it ) {
       if( it->second->coloured() ) colouredOut+=1;
     }  
     for( map< ShowerProgenitorPtr, ShowerParticlePtr >::iterator it
 	   = currentTree()->incomingLines().begin(); 
 	 it != currentTree()->incomingLines().end(); ++it ) {
       if( ! it->second->coloured() ) colouredIn+=1;
     }
 
     if ( theShowerApproximation ){
       if ( theShowerApproximation->ffPtCut() == theShowerApproximation->fiPtCut() &&
 	   theShowerApproximation->ffPtCut() == theShowerApproximation->iiPtCut() ) 
 	maxpt = theShowerApproximation->ffPtCut();
       else if ( colouredIn == 2 && colouredOut == 0 )
 	maxpt = theShowerApproximation->iiPtCut();
       else if ( colouredIn == 0 && colouredOut > 1 )
 	maxpt = theShowerApproximation->ffPtCut();
       else if ( colouredIn == 2 && colouredOut == 1 )
 	maxpt = min(theShowerApproximation->iiPtCut(), theShowerApproximation->fiPtCut());
       else if ( colouredIn == 1 && colouredOut > 1 )
 	maxpt = min(theShowerApproximation->ffPtCut(), theShowerApproximation->fiPtCut());
       else 
 	maxpt = min(min(theShowerApproximation->iiPtCut(), theShowerApproximation->fiPtCut()), 
 		    theShowerApproximation->ffPtCut());
     }
 
     // Generate hardtree from born and real emission subprocesses
     _hardtree = ShowerHandler::currentHandler()->generateCKKW(currentTree());
 
     // Find transverse momentum of hardest emission
     if (_hardtree){
       for(set<HardBranchingPtr>::iterator it=_hardtree->branchings().begin();
      	  it!=_hardtree->branchings().end();++it) {
       	if ((*it)->parent() && (*it)->status()==HardBranching::Incoming)
       	  maxpt=(*it)->branchingParticle()->momentum().perp();
       	if ((*it)->children().size()==2 && (*it)->status()==HardBranching::Outgoing){
 	  if ((*it)->branchingParticle()->id()!=21 &&
 	      abs((*it)->branchingParticle()->id())>5 ){
 	    if ((*it)->children()[0]->branchingParticle()->id()==21 ||
 		abs((*it)->children()[0]->branchingParticle()->id())<6)
 	      maxpt=(*it)->children()[0]->branchingParticle()->momentum().perp();
 	    else if ((*it)->children()[1]->branchingParticle()->id()==21 ||
 		     abs((*it)->children()[1]->branchingParticle()->id())<6)
 	      maxpt=(*it)->children()[1]->branchingParticle()->momentum().perp();
 	  }
 	  else {
 	    if ( abs((*it)->branchingParticle()->id())<6){
 	      if (abs((*it)->children()[0]->branchingParticle()->id())<6)
 		maxpt = (*it)->children()[1]->branchingParticle()->momentum().perp();
 	      else 
 		maxpt = (*it)->children()[0]->branchingParticle()->momentum().perp();
 	    }
 	    else maxpt = (*it)->children()[1]->branchingParticle()->momentum().perp();
 	  }
       	}
       } 
     }
      
     
     // Hardest (pt) emission should be the first powheg emission.
     maxpt=min(sqrt(ShowerHandler::currentHandler()->lastXCombPtr()->lastShowerScale()),maxpt);
 
     // Set maxpt to pT of emission when showering POWHEG real-emission subprocesses
     if (!isPowhegSEvent && !isPowhegHEvent){
       vector<int> outGluon;
       vector<int> outQuark;
       map< ShowerProgenitorPtr, tShowerParticlePtr >::iterator it;
       for( it = currentTree()->outgoingLines().begin(); 
 	   it != currentTree()->outgoingLines().end(); ++it ) {
 	if ( abs(it->second->id())< 6) outQuark.push_back(it->second->id());
 	if ( it->second->id()==21 )    outGluon.push_back(it->second->id());
       } 
       if (outGluon.size() + outQuark.size() == 1){
 	for( it = currentTree()->outgoingLines().begin(); 
 	     it != currentTree()->outgoingLines().end(); ++it ) {
 	  if ( abs(it->second->id())< 6 || it->second->id()==21 )
 	    maxpt = it->second->momentum().perp();
 	}
       }
       else if (outGluon.size() + outQuark.size() > 1){
 	// assume qqbar pair from a Z/gamma
 	if (outGluon.size()==1 && outQuark.size() == 2 && outQuark[0]==-outQuark[1]){
 	  for( it = currentTree()->outgoingLines().begin(); 
 	       it != currentTree()->outgoingLines().end(); ++it ) {
 	    if ( it->second->id()==21 )
 	      maxpt = it->second->momentum().perp();
 	  }
 	}
 	// otherwise take the lowest pT avoiding born DY events
 	else {
 	  maxpt = generator()->maximumCMEnergy();
 	  for( it = currentTree()->outgoingLines().begin(); 
 	       it != currentTree()->outgoingLines().end(); ++it ) {
 	    if ( abs(it->second->id())< 6 || it->second->id()==21 )
 	      maxpt = min(maxpt,it->second->momentum().perp());
 	  }
 	}
       }
     } 
 
     // set maximum pT for subsequent emissions from S events
     if ( isPowhegSEvent  || (!isPowhegSEvent && !isPowhegHEvent)){
       for( map< ShowerProgenitorPtr, tShowerParticlePtr >::iterator it
 	     = currentTree()->outgoingLines().begin(); 
 	   it != currentTree()->outgoingLines().end(); ++it ) {
 	if( ! it->second->coloured() ) continue;
 	it->first->maximumpT(maxpt, ShowerInteraction::QCD  );
       }  
       for( map< ShowerProgenitorPtr, ShowerParticlePtr >::iterator it
 	     = currentTree()->incomingLines().begin(); 
 	   it != currentTree()->incomingLines().end(); ++it ) {
 	if( ! it->second->coloured() ) continue;
 	it->first->maximumpT(maxpt, ShowerInteraction::QCD );
       }
     }  
   }
   else 
     _hardtree = ShowerHandler::currentHandler()->generateCKKW(currentTree());
 
   // if hard me doesn't have a FSR powheg 
   // correction use decay powheg correction
   if (_hardme && _hardme->hasPOWHEGCorrection()<2) {      
     // check for intermediate colour singlet resonance
     const ParticleVector inter =  _hardme->subProcess()->intermediates();
     if (inter.size()!=1 || 
 	inter[0]->momentum().m2()/GeV2 < 0 || 
 	inter[0]->dataPtr()->iColour()!=PDT::Colour0){
       if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
       return;
     }
    
     map<ShowerProgenitorPtr, tShowerParticlePtr > out = currentTree()->outgoingLines();
     // ignore cases where outgoing particles are not coloured
     if (out.size()!=2 ||
 	out. begin()->second->dataPtr()->iColour()==PDT::Colour0 ||
     	out.rbegin()->second->dataPtr()->iColour()==PDT::Colour0) {
       if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
       return;
     }
     
     // look up decay mode
     tDMPtr dm;
     string tag;
     string inParticle = inter[0]->dataPtr()->name() + "->";
     vector<string> outParticles;
     outParticles.push_back(out.begin ()->first->progenitor()->dataPtr()->name());
     outParticles.push_back(out.rbegin()->first->progenitor()->dataPtr()->name());
     for (int it=0; it<2; ++it){
       tag = inParticle + outParticles[it] + "," + outParticles[(it+1)%2] + ";";
       dm = generator()->findDecayMode(tag);
       if(dm) break;
     }
 
     // get the decayer
     HwDecayerBasePtr decayer;   
     if(dm) decayer = dynamic_ptr_cast<HwDecayerBasePtr>(dm->decayer());
     // check if decayer has a FSR POWHEG correction 
     if (!decayer || decayer->hasPOWHEGCorrection()<2){
       if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
       return;
     }
     
     // generate the hardest emission
     ShowerDecayMap decay;
     PPtr in = new_ptr(*inter[0]);
     ShowerTreePtr decayTree = new_ptr(ShowerTree(in, decay));
     HardTreePtr     FSRTree = decayer->generateHardest(decayTree); 
     if (!FSRTree) {
       if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
       return;
     }
 
     // if there is no ISRTree make _hardtree from FSRTree
     if (!ISRTree){
       vector<HardBranchingPtr> inBranch,hardBranch;
       for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
 	  cit =currentTree()->incomingLines().begin();
 	  cit!=currentTree()->incomingLines().end();++cit ) {
 	inBranch.push_back(new_ptr(HardBranching(cit->second,SudakovPtr(),
 						 HardBranchingPtr(),
 						 HardBranching::Incoming)));
 	inBranch.back()->beam(cit->first->original()->parents()[0]);
 	hardBranch.push_back(inBranch.back());
       }
       if(inBranch[0]->branchingParticle()->dataPtr()->coloured()) {
 	inBranch[0]->colourPartner(inBranch[1]);
 	inBranch[1]->colourPartner(inBranch[0]);
       }
       for(set<HardBranchingPtr>::iterator it=FSRTree->branchings().begin();
 	  it!=FSRTree->branchings().end();++it) {
 	if((**it).branchingParticle()->id()!=in->id()) 
 	  hardBranch.push_back(*it);
       } 
       hardBranch[2]->colourPartner(hardBranch[3]);
       hardBranch[3]->colourPartner(hardBranch[2]);
       HardTreePtr newTree = new_ptr(HardTree(hardBranch,inBranch,
 					     ShowerInteraction::QCD));            
       _hardtree = newTree;    
     }
 
     // Otherwise modify the ISRTree to include the emission in FSRTree
     else {    
       vector<tShowerParticlePtr> FSROut, ISROut;   
       set<HardBranchingPtr>::iterator itFSR, itISR;
       // get outgoing particles 
       for(itFSR =FSRTree->branchings().begin();
 	  itFSR!=FSRTree->branchings().end();++itFSR){
 	if ((**itFSR).status()==HardBranching::Outgoing) 
 	  FSROut.push_back((*itFSR)->branchingParticle());
       }     
       for(itISR =ISRTree->branchings().begin();
 	  itISR!=ISRTree->branchings().end();++itISR){
 	if ((**itISR).status()==HardBranching::Outgoing) 
 	  ISROut.push_back((*itISR)->branchingParticle());
       }
 
       // find COM frame formed by outgoing particles
       LorentzRotation eventFrameFSR, eventFrameISR;
       eventFrameFSR = ((FSROut[0]->momentum()+FSROut[1]->momentum()).findBoostToCM());  
       eventFrameISR = ((ISROut[0]->momentum()+ISROut[1]->momentum()).findBoostToCM());
 
       // find rotation between ISR and FSR frames
       int j=0;
       if (ISROut[0]->id()!=FSROut[0]->id()) j=1;
       eventFrameISR.rotateZ( (eventFrameFSR*FSROut[0]->momentum()).phi()-
 			     (eventFrameISR*ISROut[j]->momentum()).phi() );
       eventFrameISR.rotateY( (eventFrameFSR*FSROut[0]->momentum()).theta()-
 			     (eventFrameISR*ISROut[j]->momentum()).theta() );
       eventFrameISR.invert();
 
       for (itFSR=FSRTree->branchings().begin();
 	   itFSR!=FSRTree->branchings().end();++itFSR){
 	if ((**itFSR).branchingParticle()->id()==in->id()) continue;
 	for (itISR =ISRTree->branchings().begin();
 	     itISR!=ISRTree->branchings().end();++itISR){
 	  if ((**itISR).status()==HardBranching::Incoming) continue;
 	  if ((**itFSR).branchingParticle()->id()==
 	      (**itISR).branchingParticle()->id()){
 	    // rotate FSRTree particle to ISRTree event frame
 	    (**itISR).branchingParticle()->setMomentum(eventFrameISR*
 						       eventFrameFSR*
 			  (**itFSR).branchingParticle()->momentum());
 	    (**itISR).branchingParticle()->rescaleMass();
 	    // add the children of the FSRTree particles to the ISRTree
 	    if(!(**itFSR).children().empty()){
 	      (**itISR).addChild((**itFSR).children()[0]);
 	      (**itISR).addChild((**itFSR).children()[1]);
 	      // rotate momenta to ISRTree event frame
 	      (**itISR).children()[0]->branchingParticle()->setMomentum(eventFrameISR*
 									eventFrameFSR*
 			    (**itFSR).children()[0]->branchingParticle()->momentum());
 	      (**itISR).children()[1]->branchingParticle()->setMomentum(eventFrameISR*
 									eventFrameFSR*
 			    (**itFSR).children()[1]->branchingParticle()->momentum());
 	    }
 	  }
 	}	
       }
       _hardtree = ISRTree;
     }
   }
   if(_hardtree){
     connectTrees(currentTree(),_hardtree,hard); 
   }
 }
 
 bool Evolver::truncatedTimeLikeShower(tShowerParticlePtr particle,
 				      HardBranchingPtr branch,
 				      ShowerInteraction::Type type,
 				      Branching fb, bool first) {
   // select a branching if we don't have one
   if(!fb.kinematics)
     fb = selectTimeLikeBranching(particle,type,branch);
   // must be an emission, the forced one it not a truncated one
   assert(fb.kinematics);
   ShowerParticleVector children;
   int ntry=0;
   Branching fc[2];
   bool setupChildren = true;
   while (ntry<50) {
     if(!fc[0].hard) fc[0] = Branching();
     if(!fc[1].hard) fc[1] = Branching();
     ++ntry;
     // Assign the shower kinematics to the emitting particle.
     if(setupChildren) {
       ++_nFSR;
       // Assign the shower kinematics to the emitting particle.
       particle->showerKinematics(fb.kinematics);
       if(fb.kinematics->pT()>progenitor()->highestpT())
 	progenitor()->highestpT(fb.kinematics->pT());
       // if not hard generate phi
       if(!fb.hard)
 	fb.kinematics->phi(fb.sudakov->generatePhiForward(*particle,fb.ids,fb.kinematics));
       // create the children
       children = createTimeLikeChildren(particle,fb.ids);
       // update the children
       particle->showerKinematics()->
    	updateChildren(particle, children,fb.type,_reconOpt>=3);
       setupChildren = false;
     }
     // select branchings for children
     if(!fc[0].kinematics) {
       // select branching for first particle
       if(!fb.hard && fb.iout ==1 )
 	fc[0] = selectTimeLikeBranching(children[0],type,branch);
       else if(fb.hard && !branch->children()[0]->children().empty() )
 	fc[0] = selectTimeLikeBranching(children[0],type,branch->children()[0]);
       else
 	fc[0] = selectTimeLikeBranching(children[0],type,HardBranchingPtr());
     }
     // select branching for the second particle
     if(!fc[1].kinematics) {
       // select branching for first particle
       if(!fb.hard && fb.iout ==2 )
 	fc[1] = selectTimeLikeBranching(children[1],type,branch);
       else if(fb.hard && !branch->children()[1]->children().empty() )
 	fc[1] = selectTimeLikeBranching(children[1],type,branch->children()[1]);
       else
 	fc[1] = selectTimeLikeBranching(children[1],type,HardBranchingPtr());
     }
     // old default
     if(_reconOpt==0 || (_reconOpt==1 && fb.hard) ) {
       // shower the first  particle
       if(fc[0].kinematics) {
 	// the parent has truncated emission and following line
 	if(!fb.hard && fb.iout == 1)
 	  truncatedTimeLikeShower(children[0],branch,type,fc[0],false);
 	// hard emission and subsquent hard emissions
 	else if(fb.hard && !branch->children()[0]->children().empty() )
 	  truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
 	// normal shower
 	else
 	  timeLikeShower(children[0],type,fc[0],false);
       }
       if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
       // shower the second particle
       if(fc[1].kinematics) {
 	// the parent has truncated emission and following line
 	if(!fb.hard && fb.iout == 2)
 	  truncatedTimeLikeShower(children[1],branch,type,fc[1],false);
 	// hard emission and subsquent hard emissions
 	else if(fb.hard && !branch->children()[1]->children().empty() )
 	  truncatedTimeLikeShower(children[1],branch->children()[1],type,fc[1],false);
 	else
 	  timeLikeShower(children[1],type,fc[1],false);
       }
       if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
       // branching has happened
       particle->showerKinematics()->updateParent(particle, children,fb.type);
       break;
     }
     // H7 default
     else if(_reconOpt==1) {
       // shower the first  particle
       if(fc[0].kinematics) {
 	// the parent has truncated emission and following line
 	if(!fb.hard && fb.iout == 1)
 	  truncatedTimeLikeShower(children[0],branch,type,fc[0],false);
 	else
 	  timeLikeShower(children[0],type,fc[0],false);
       }
       if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
       // shower the second particle
       if(fc[1].kinematics) {
 	// the parent has truncated emission and following line
 	if(!fb.hard && fb.iout == 2)
 	  truncatedTimeLikeShower(children[1],branch,type,fc[1],false);
 	else
 	  timeLikeShower(children[1],type,fc[1],false);
       }
       if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
       // branching has happened
       particle->showerKinematics()->updateParent(particle, children,fb.type);
       // clean up the vetoed emission
       if(particle->virtualMass()==ZERO) {
    	particle->showerKinematics(ShoKinPtr());
     	for(unsigned int ix=0;ix<children.size();++ix)
    	  particle->abandonChild(children[ix]);
     	children.clear();
    	if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
   	particle->vetoEmission(fb.type,fb.kinematics->scale());
    	// generate the new emission
    	fb = selectTimeLikeBranching(particle,type,branch);
 	// must be at least hard emission
 	assert(fb.kinematics);
    	setupChildren = true;
   	continue;
       }
       else
    	break;
     }
     else if(_reconOpt>=2) {
       // cut-off masses for the branching
       const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
       // compute the masses of the children
       Energy masses[3];
       for(unsigned int ix=0;ix<2;++ix) {
    	if(fc[ix].kinematics) {
    	  const vector<Energy> & vm = fc[ix].sudakov->virtualMasses(fc[ix].ids);
    	  Energy2 q2 = 
    	    fc[ix].kinematics->z()*(1.-fc[ix].kinematics->z())*sqr(fc[ix].kinematics->scale());
    	  if(fc[ix].ids[0]!=ParticleID::g) q2 += sqr(vm[0]);
    	  masses[ix+1] = sqrt(q2);
    	}
    	else {
    	  masses[ix+1] = virtualMasses[ix+1];
    	}
       }
       masses[0] = fb.ids[0]!=ParticleID::g ? virtualMasses[0] : ZERO;
       double z = fb.kinematics->z();
       Energy2 pt2 = z*(1.-z)*(z*(1.-z)*sqr(fb.kinematics->scale()) + sqr(masses[0]))
    	- sqr(masses[1])*(1.-z) - sqr(masses[2])*z;
       if(pt2>=ZERO) {
   	break;
       }
       // if only the hard emission have to accept it
       else if ((fc[0].hard && !fc[1].kinematics) ||
 	       (fc[1].hard && !fc[0].kinematics) ) {
 	break;
       }
       else {
   	// reset the scales for the children
    	for(unsigned int ix=0;ix<2;++ix) {
 	  if(fc[ix].hard) continue;
    	  if(fc[ix].kinematics && ! fc[ix].hard )
    	    children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
   	  else
   	    children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
   	  children[ix]->virtualMass(ZERO);
   	} 
       }
     }
   };
   if(_reconOpt>=2) {
     // shower the first  particle
     if(fc[0].kinematics) {
       // the parent has truncated emission and following line
       if(!fb.hard && fb.iout == 1)
 	truncatedTimeLikeShower(children[0],branch,type,fc[0],false);
       // hard emission and subsquent hard emissions
       else if(fb.hard && !branch->children()[0]->children().empty() )
 	truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
       // normal shower
       else
 	timeLikeShower(children[0],type,fc[0],false);
     }
     if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
     // shower the second particle
     if(fc[1].kinematics) {
       // the parent has truncated emission and following line
       if(!fb.hard && fb.iout == 2)
 	truncatedTimeLikeShower(children[1],branch,type,fc[1],false);
       // hard emission and subsquent hard emissions
       else if(fb.hard && !branch->children()[1]->children().empty() )
 	truncatedTimeLikeShower(children[1],branch->children()[1],type,fc[1],false);
       else
 	timeLikeShower(children[1],type,fc[1],false);
     }
     if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
     // branching has happened
     particle->showerKinematics()->updateParent(particle, children,fb.type);
   }
   if(first&&!children.empty())
     particle->showerKinematics()->resetChildren(particle,children);
   if(particle->spinInfo()) particle->spinInfo()->develop();
   return true;
 }
 
 bool Evolver::truncatedSpaceLikeShower(tShowerParticlePtr particle, PPtr beam,
 				       HardBranchingPtr branch,
 				       ShowerInteraction::Type type) {
   tcPDFPtr pdf;
   if(ShowerHandler::currentHandler()->firstPDF().particle()  == beamParticle())
     pdf = ShowerHandler::currentHandler()->firstPDF().pdf();
   if(ShowerHandler::currentHandler()->secondPDF().particle() == beamParticle())
     pdf = ShowerHandler::currentHandler()->secondPDF().pdf();
   Energy freeze = ShowerHandler::currentHandler()->pdfFreezingScale();
   Branching bb;
   // parameters of the force branching
   double z(0.);
   HardBranchingPtr timelike;
   for( unsigned int ix = 0; ix < branch->children().size(); ++ix ) {
     if( branch->children()[ix]->status() ==HardBranching::Outgoing) {
       timelike = branch->children()[ix];
     }
     if( branch->children()[ix]->status() ==HardBranching::Incoming )
       z = branch->children()[ix]->z();
   }
   // generate truncated branching
   tcPDPtr part[2];
   if(z>=0.&&z<=1.) {
     while (true) {
       if( !isTruncatedShowerON() || hardOnly() ) break;
       bb = splittingGenerator()->chooseBackwardBranching( *particle, 
 							  beam, 1., beamParticle(), 
 							  type , pdf,freeze);
       if( !bb.kinematics || bb.kinematics->scale() < branch->scale() ) {
 	bb = Branching();
 	break;
       }
       // particles as in Sudakov form factor
       part[0] = getParticleData( bb.ids[0] );
       part[1] = getParticleData( bb.ids[2] );
       
       //is emitter anti-particle
       if( particle->id() != bb.ids[1]) {
 	if( part[0]->CC() ) part[0] = part[0]->CC();
 	if( part[1]->CC() ) part[1] = part[1]->CC();
       }
       double zsplit = bb.kinematics->z();
       // apply the vetos for the truncated shower
       // if doesn't carry most of momentum
       ShowerInteraction::Type type2 = bb.type==ShowerPartnerType::QED ? 
 	ShowerInteraction::QED : ShowerInteraction::QCD;
       if(type2==branch->sudakov()->interactionType() &&
 	 zsplit < 0.5) {
 	particle->vetoEmission(bb.type,bb.kinematics->scale());
 	continue;
       }
       // others
       if( part[0]->id() != particle->id() || // if particle changes type
 	  bb.kinematics->pT() > progenitor()->maximumpT(type2) ||   // pt veto
 	  bb.kinematics->scale() < branch->scale()) { // angular ordering veto
 	particle->vetoEmission(bb.type,bb.kinematics->scale());
 	continue;
       }
       // and those from the base class
       if(spaceLikeVetoed(bb,particle)) {
 	particle->vetoEmission(bb.type,bb.kinematics->scale());
 	continue;
       }
       break;
     }
   }
   if( !bb.kinematics ) {
     //do the hard emission
     ShoKinPtr kinematics =
       branch->sudakov()->createInitialStateBranching( branch->scale(), z, branch->phi(),
     						      branch->children()[0]->pT() );
     kinematics->initialize( *particle, beam );
     // assign the splitting function and shower kinematics
     particle->showerKinematics( kinematics );
     if(kinematics->pT()>progenitor()->highestpT())
       progenitor()->highestpT(kinematics->pT());
     // For the time being we are considering only 1->2 branching
     // Now create the actual particles, make the otherChild a final state
     // particle, while the newParent is not
     ShowerParticlePtr newParent = 
       new_ptr( ShowerParticle( branch->branchingParticle()->dataPtr(), false ) );
     ShowerParticlePtr otherChild = 
       new_ptr( ShowerParticle( timelike->branchingParticle()->dataPtr(),
     			       true, true ) );
     ShowerParticleVector theChildren;
     theChildren.push_back( particle ); 
     theChildren.push_back( otherChild );
     particle->showerKinematics()->
       updateParent( newParent, theChildren, branch->type());
     // update the history if needed
     currentTree()->updateInitialStateShowerProduct( progenitor(), newParent );
     currentTree()->addInitialStateBranching( particle, newParent, otherChild );
     // for the reconstruction of kinematics, parent/child
     // relationships are according to the branching process:
     // now continue the shower
     bool emitted=false;
     if(!hardOnly()) {
       if( branch->parent() ) {
     	emitted = truncatedSpaceLikeShower( newParent, beam, branch->parent() , type);
       }
       else {
     	emitted = spaceLikeShower( newParent, beam , type);
       }
     }
     if( !emitted ) {
       if( intrinsicpT().find( progenitor() ) == intrinsicpT().end() ) {
     	kinematics->updateLast( newParent, ZERO, ZERO );
       }
       else {
     	pair<Energy,double> kt = intrinsicpT()[progenitor()];
     	kinematics->updateLast( newParent,
     				kt.first*cos( kt.second ),
     				kt.first*sin( kt.second ) );
       }
     }
     particle->showerKinematics()->
       updateChildren( newParent, theChildren,bb.type,false);
     if(hardOnly()) return true;
     // perform the shower of the final-state particle
     if( timelike->children().empty() ) {
       timeLikeShower( otherChild , type,Branching(),true);
     }
     else {
       truncatedTimeLikeShower( otherChild, timelike , type,Branching(), true);
     }
     updateHistory(otherChild);
     // return the emitted
     return true;
   }
   // assign the splitting function and shower kinematics
   particle->showerKinematics( bb.kinematics );
   if(bb.kinematics->pT()>progenitor()->highestpT())
     progenitor()->highestpT(bb.kinematics->pT());
   // For the time being we are considering only 1->2 branching
   // Now create the actual particles, make the otherChild a final state
   // particle, while the newParent is not
   ShowerParticlePtr newParent = new_ptr( ShowerParticle( part[0], false ) );
   ShowerParticlePtr otherChild = new_ptr( ShowerParticle( part[1], true, true ) );
   ShowerParticleVector theChildren; 
   theChildren.push_back( particle ); 
   theChildren.push_back( otherChild );
   particle->showerKinematics()->
     updateParent( newParent, theChildren, bb.type);
   // update the history if needed
   currentTree()->updateInitialStateShowerProduct( progenitor(), newParent );
   currentTree()->addInitialStateBranching( particle, newParent, otherChild );
   // for the reconstruction of kinematics, parent/child
   // relationships are according to the branching process:
   // now continue the shower
   bool emitted = truncatedSpaceLikeShower( newParent, beam, branch,type);
   // now reconstruct the momentum
   if( !emitted ) {
     if( intrinsicpT().find( progenitor() ) == intrinsicpT().end() ) {
       bb.kinematics->updateLast( newParent, ZERO, ZERO );
     }
     else {
       pair<Energy,double> kt = intrinsicpT()[ progenitor() ];
       bb.kinematics->updateLast( newParent,
 				 kt.first*cos( kt.second ),
 				 kt.first*sin( kt.second ) );
     }
   }
   particle->showerKinematics()->
     updateChildren( newParent, theChildren, bb.type,false);
   // perform the shower of the final-state particle
   timeLikeShower( otherChild , type,Branching(),true);
   updateHistory(otherChild);
   // return the emitted
   return true;
 }
 
 bool Evolver::
 truncatedSpaceLikeDecayShower(tShowerParticlePtr particle, 
 			      const ShowerParticle::EvolutionScales & maxScales,
 			      Energy minmass, HardBranchingPtr branch,
 			      ShowerInteraction::Type type, Branching fb) {
   // select a branching if we don't have one
   if(!fb.kinematics)
     fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,branch);
   // must be an emission, the forced one it not a truncated one
   assert(fb.kinematics);
   ShowerParticleVector children;
   int ntry=0;
   Branching fc[2];
   bool setupChildren = true;
   while (ntry<50) {
     if(!fc[0].hard) fc[0] = Branching();
     if(!fc[1].hard) fc[1] = Branching();
     ++ntry;
     if(setupChildren) {
       ++_nFSR;
       // Assign the shower kinematics to the emitting particle.
       particle->showerKinematics(fb.kinematics);
       if(fb.kinematics->pT()>progenitor()->highestpT())
 	progenitor()->highestpT(fb.kinematics->pT());
       // create the ShowerParticle objects for the two children
       children = createTimeLikeChildren(particle,fb.ids);
       // updateChildren the children
       particle->showerKinematics()->
 	updateChildren(particle, children, fb.type,_reconOpt>=3);
       setupChildren = false;
     }
     // select branchings for children
     if(!fc[0].kinematics) {
       if(children[0]->id()==particle->id()) {
 	// select branching for first particle
 	if(!fb.hard)
 	  fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,type,branch);
 	else if(fb.hard && ! branch->children()[0]->children().empty() )
 	  fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,type,
 						branch->children()[0]);
 	else
 	  fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,type,
 						HardBranchingPtr());
       }
       else {
 	// select branching for first particle
 	if(fb.hard && !branch->children()[0]->children().empty() )
 	  fc[0] = selectTimeLikeBranching(children[0],type,branch->children()[0]);
 	else
 	  fc[0] = selectTimeLikeBranching(children[0],type,HardBranchingPtr());
       }
     }
     // select branching for the second particle
      if(!fc[1].kinematics) {
        if(children[1]->id()==particle->id()) {
 	 // select branching for first particle
 	 if(!fb.hard)
 	   fc[1] = selectSpaceLikeDecayBranching(children[1],maxScales,minmass,type,branch);
 	 else if(fb.hard && ! branch->children()[1]->children().empty() )
 	   fc[1] = selectSpaceLikeDecayBranching(children[1],maxScales,minmass,type,
 						 branch->children()[1]);
 	 else
 	   fc[1] = selectSpaceLikeDecayBranching(children[1],maxScales,minmass,type,
 						 HardBranchingPtr());
        }
        else {
 	 if(fb.hard && !branch->children()[1]->children().empty() )
 	   fc[1] = selectTimeLikeBranching(children[1],type,branch->children()[1]);
 	 else
 	   fc[1] = selectTimeLikeBranching(children[1],type,HardBranchingPtr());
        }
      }
     // old default
     if(_reconOpt==0 || (_reconOpt==1 && fb.hard) ) {
       // update the history if needed
       currentTree()->updateInitialStateShowerProduct(progenitor(),children[0]);
       currentTree()->addInitialStateBranching(particle,children[0],children[1]);
       // shower the first  particle
       if(fc[0].kinematics) {
 	if(children[0]->id()==particle->id()) {
 	  if(!fb.hard)
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch,type,fc[0]);
 	  else if(fb.hard && ! branch->children()[0]->children().empty() )
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch->children()[0],type,fc[0]);
 	  else
 	    spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[0]);
 	}
 	else {
 	  if(fb.hard && !branch->children()[0]->children().empty() )
 	    truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
 	  // normal shower
 	  else
 	    timeLikeShower(children[0],type,fc[0],false);
 	}
       }
       // shower the second  particle
       if(fc[1].kinematics) {
 	if(children[0]->id()==particle->id()) {
 	  if(!fb.hard)
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch,type,fc[1]);
 	  else if(fb.hard && ! branch->children()[0]->children().empty() )
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch->children()[0],type,fc[1]);
 	  else
 	    spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[1]);
 	}
 	else {
 	  if(fb.hard && !branch->children()[0]->children().empty() )
 	    truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[1],false);
 	  // normal shower
 	  else
 	    timeLikeShower(children[0],type,fc[1],false);
 	}
       }
       updateHistory(children[1]);
       // branching has happened
       break;
     }
     // H7 default
     else if(_reconOpt==1) {
       // update the history if needed
       currentTree()->updateInitialStateShowerProduct(progenitor(),children[0]);
       currentTree()->addInitialStateBranching(particle,children[0],children[1]);
       // shower the first  particle
       if(fc[0].kinematics) {
 	if(children[0]->id()==particle->id()) {
 	  if(!fb.hard)
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch,type,fc[0]);
 	  else if(fb.hard && ! branch->children()[0]->children().empty() )
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch->children()[0],type,fc[0]);
 	  else
 	    spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[0]);
 	}
 	else {
 	  if(fb.hard && !branch->children()[0]->children().empty() )
 	    truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
 	  // normal shower
 	  else
 	    timeLikeShower(children[0],type,fc[0],false);
 	}
       }
       // shower the second  particle
       if(fc[1].kinematics) {
 	if(children[0]->id()==particle->id()) {
 	  if(!fb.hard)
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch,type,fc[1]);
 	  else if(fb.hard && ! branch->children()[0]->children().empty() )
 	    truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					   branch->children()[0],type,fc[1]);
 	  else
 	    spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[1]);
 	}
 	else {
 	  if(fb.hard && !branch->children()[0]->children().empty() )
 	    truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[1],false);
 	  // normal shower
 	  else
 	    timeLikeShower(children[0],type,fc[1],false);
 	}
       }
       // clean up the vetoed emission
       if(particle->virtualMass()==ZERO) {
    	particle->showerKinematics(ShoKinPtr());
     	for(unsigned int ix=0;ix<children.size();++ix)
    	  particle->abandonChild(children[ix]);
     	children.clear();
    	particle->vetoEmission(fb.type,fb.kinematics->scale());
     	// generate the new emission
    	fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,branch);
    	// must be at least hard emission
   	assert(fb.kinematics);
    	setupChildren = true;
  	continue;
       }
       else {
 	updateHistory(children[1]);
   	break;
       }
     }
     else if(_reconOpt>=2) {
       // cut-off masses for the branching
       const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
       // compute the masses of the children
       Energy masses[3];
       // space-like children
       masses[1] = children[0]->virtualMass();
       // time-like child
       if(fc[1].kinematics) {
 	const vector<Energy> & vm = fc[1].sudakov->virtualMasses(fc[1].ids);
 	Energy2 q2 = 
 	  fc[1].kinematics->z()*(1.-fc[1].kinematics->z())*sqr(fc[1].kinematics->scale());
 	if(fc[1].ids[0]!=ParticleID::g) q2 += sqr(vm[0]);
 	masses[2] = sqrt(q2);
       }
       else {
 	masses[2] = virtualMasses[2];
       } 
       masses[0]=particle->virtualMass();
       double z = fb.kinematics->z();
       Energy2 pt2 = (1.-z)*(z*sqr(masses[0])-sqr(masses[1])-z/(1.-z)*sqr(masses[2]));
       if(pt2>=ZERO) {
   	break;
       }
       else {
   	// reset the scales for the children
   	for(unsigned int ix=0;ix<2;++ix) {
   	  if(fc[ix].kinematics)
   	    children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
   	  else {
 	    if(ix==0) 
 	      children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,Constants::MaxEnergy);
 	    else
 	      children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
 	  }
    	} 
 	children[0]->virtualMass(_progenitor->progenitor()->mass());
 	children[1]->virtualMass(ZERO);
       }
     }
   };
   if(_reconOpt>=2) {
     // update the history if needed
     currentTree()->updateInitialStateShowerProduct(progenitor(),children[0]);
     currentTree()->addInitialStateBranching(particle,children[0],children[1]);
     // shower the first  particle
     if(fc[0].kinematics) {
       if(children[0]->id()==particle->id()) {
 	if(!fb.hard)
 	  truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					 branch,type,fc[0]);
 	else if(fb.hard && ! branch->children()[0]->children().empty() )
 	  truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					 branch->children()[0],type,fc[0]);
 	else
 	  spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[0]);
       }
       else {
 	if(fb.hard && !branch->children()[0]->children().empty() )
 	  truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
 	// normal shower
 	else
 	  timeLikeShower(children[0],type,fc[0],false);
       }
     }
     // shower the second  particle
     if(fc[1].kinematics) {
       if(children[0]->id()==particle->id()) {
 	if(!fb.hard)
 	  truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					 branch,type,fc[1]);
 	else if(fb.hard && ! branch->children()[0]->children().empty() )
 	  truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
 					 branch->children()[0],type,fc[1]);
 	else
 	  spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[1]);
       }
       else {
 	if(fb.hard && !branch->children()[0]->children().empty() )
 	  truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[1],false);
 	// normal shower
 	else
 	  timeLikeShower(children[0],type,fc[1],false);
       }
     }
     updateHistory(children[1]);
   }
   return true;
 }
 
 bool Evolver::constructDecayTree(vector<ShowerProgenitorPtr> & particlesToShower,
 				 ShowerInteraction::Type inter) {
   Energy ptmax(-GeV);
   // get the maximum pt is all ready a hard tree
   if(hardTree()) {
     for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
       if(particlesToShower[ix]->maximumpT(inter)>ptmax&&
 	 particlesToShower[ix]->progenitor()->isFinalState()) 
 	ptmax = particlesToShower[ix]->maximumpT(inter);
     }
   }
   vector<HardBranchingPtr> spaceBranchings,allBranchings;
   for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
     if(particlesToShower[ix]->progenitor()->isFinalState()) {
       HardBranchingPtr newBranch;
       if(particlesToShower[ix]->hasEmitted()) {
 	newBranch = 
 	  new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				particlesToShower[ix]->progenitor()->
 				showerKinematics()->SudakovFormFactor(),
 				HardBranchingPtr(),HardBranching::Outgoing));
 	constructTimeLikeLine(newBranch,particlesToShower[ix]->progenitor());
       }
       else {
 	newBranch = 
 	  new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				SudakovPtr(),HardBranchingPtr(),
 				HardBranching::Outgoing));
       }
       allBranchings.push_back(newBranch);
     }
     else {
       HardBranchingPtr newBranch;
       if(particlesToShower[ix]->hasEmitted()) {
 	newBranch = 
 	  new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				particlesToShower[ix]->progenitor()->
 				showerKinematics()->SudakovFormFactor(),
 				HardBranchingPtr(),HardBranching::Decay));
 	constructTimeLikeLine(newBranch,particlesToShower[ix]->progenitor());
 	HardBranchingPtr last=newBranch;
 	do {
 	  for(unsigned int ix=0;ix<last->children().size();++ix) {
 	    if(last->children()[ix]->branchingParticle()->id()==
 	       particlesToShower[ix]->id()) {
 	      last = last->children()[ix];
 	      continue;
 	    }
 	  }
 	}
 	while(!last->children().empty());
 	last->status(HardBranching::Incoming);
 	spaceBranchings.push_back(newBranch);
 	allBranchings  .push_back(last);
       }
       else {
 	newBranch = 
 	  new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				SudakovPtr(),HardBranchingPtr(),
 				HardBranching::Incoming));
 	spaceBranchings.push_back(newBranch);
 	allBranchings  .push_back(newBranch);
       }
     }
   }
   HardTreePtr QCDTree = new_ptr(HardTree(allBranchings,spaceBranchings,inter));
   // set the charge partners
   ShowerParticleVector particles;
   particles.push_back(spaceBranchings.back()->branchingParticle());
   for(set<HardBranchingPtr>::iterator cit=QCDTree->branchings().begin();
       cit!=QCDTree->branchings().end();++cit) {
     if((*cit)->status()==HardBranching::Outgoing)
       particles.push_back((*cit)->branchingParticle());
   }
   // get the partners
   showerModel()->partnerFinder()->setInitialEvolutionScales(particles,true,inter,true);
   // do the inverse recon
   if(!showerModel()->kinematicsReconstructor()->
      deconstructDecayJets(QCDTree,this,inter)) {
     return false;
   }
   // clear the old shower
   currentTree()->clear();
   // set the hard tree
   hardTree(QCDTree);
   // set the charge partners
   setEvolutionPartners(false,inter,false);
   // get the particles to be showered
   map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator cit;
   map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator cjt;
   particlesToShower.clear();
   // incoming particles
   for(cit=currentTree()->incomingLines().begin();
       cit!=currentTree()->incomingLines().end();++cit)
     particlesToShower.push_back(((*cit).first));
   assert(particlesToShower.size()==1);
   // outgoing particles
   for(cjt=currentTree()->outgoingLines().begin();
       cjt!=currentTree()->outgoingLines().end();++cjt) {
     particlesToShower.push_back(((*cjt).first));
     if(ptmax>ZERO) particlesToShower.back()->maximumpT(ptmax,inter);
   }
   for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       eit=hardTree()->particles().end(),
       mit = hardTree()->particles().find(particlesToShower[ix]->progenitor());
     if( mit != eit) {
       if(mit->second->status()==HardBranching::Outgoing)
 	particlesToShower[ix]->progenitor()->set5Momentum(mit->second->pVector());
     }
   }
   return true;
 }
 
 bool Evolver::constructHardTree(vector<ShowerProgenitorPtr> & particlesToShower,
 				ShowerInteraction::Type inter) {
   bool noEmission = true;
   vector<HardBranchingPtr> spaceBranchings,allBranchings;
   for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
     if(particlesToShower[ix]->progenitor()->isFinalState()) {
       HardBranchingPtr newBranch;
       if(particlesToShower[ix]->hasEmitted()) {
 	noEmission = false;
 	newBranch = 
 	  new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				particlesToShower[ix]->progenitor()->
 				showerKinematics()->SudakovFormFactor(),
 				HardBranchingPtr(),HardBranching::Outgoing));
 	constructTimeLikeLine(newBranch,particlesToShower[ix]->progenitor());
       }
       else {
 	newBranch = 
 	  new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				SudakovPtr(),HardBranchingPtr(),
 				HardBranching::Outgoing));
       }
       allBranchings.push_back(newBranch);
     }
     else {
       HardBranchingPtr first,last;
       if(!particlesToShower[ix]->progenitor()->parents().empty()) {
 	noEmission = false;
 	constructSpaceLikeLine(particlesToShower[ix]->progenitor(),
 			       first,last,SudakovPtr(),
 			       particlesToShower[ix]->original()->parents()[0]);
       }
       else {
 	first = new_ptr(HardBranching(particlesToShower[ix]->progenitor(),
 				      SudakovPtr(),HardBranchingPtr(),
 				      HardBranching::Incoming));
 	if(particlesToShower[ix]->original()->parents().empty())
 	  first->beam(particlesToShower[ix]->original());
 	else
 	  first->beam(particlesToShower[ix]->original()->parents()[0]);
 	last = first;
       }
       spaceBranchings.push_back(first);
       allBranchings.push_back(last);
     }
   }
   if(!noEmission) {
     HardTreePtr QCDTree = new_ptr(HardTree(allBranchings,spaceBranchings,
 					   inter));
     // set the charge partners
     ShowerParticleVector particles;
     for(set<HardBranchingPtr>::iterator cit=QCDTree->branchings().begin();
 	cit!=QCDTree->branchings().end();++cit) {
       particles.push_back((*cit)->branchingParticle());
     }
     // get the partners
     showerModel()->partnerFinder()->setInitialEvolutionScales(particles,false,
 							      inter,true);
     // do the inverse recon
     if(!showerModel()->kinematicsReconstructor()->
        deconstructHardJets(QCDTree,this,inter))
       throw Exception() << "Can't to shower deconstruction for QED shower in"
 			<< "QEDEvolver::showerHard" << Exception::eventerror;
     // set the hard tree
     hardTree(QCDTree);
   }
   // clear the old shower
   currentTree()->clear();
   // set the charge partners
   setEvolutionPartners(true,inter,false);
   // get the particles to be showered
   particlesToShower = currentTree()->extractProgenitors();
   // reset momenta
   if(hardTree()) {
     for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
       map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
 	eit=hardTree()->particles().end(),
 	mit = hardTree()->particles().find(particlesToShower[ix]->progenitor());
       if( mit != eit) {
 	particlesToShower[ix]->progenitor()->set5Momentum(mit->second->showerMomentum());
       }
     }
   }
   return true;
 }
 
 void Evolver::constructTimeLikeLine(tHardBranchingPtr branch,
 				       tShowerParticlePtr particle) {
   for(unsigned int ix=0;ix<particle->children().size();++ix) {
     HardBranching::Status status = branch->status();
     tShowerParticlePtr child = 
       dynamic_ptr_cast<ShowerParticlePtr>(particle->children()[ix]);
     if(child->children().empty()) {
       HardBranchingPtr newBranch = 
 	new_ptr(HardBranching(child,SudakovPtr(),branch,status));
       branch->addChild(newBranch);
     }
     else {
       HardBranchingPtr newBranch = 
 	new_ptr(HardBranching(child,child->showerKinematics()->SudakovFormFactor(),
 			      branch,status));
       constructTimeLikeLine(newBranch,child);
       branch->addChild(newBranch);
     }
   }
   // sort out the type of interaction
   if(!branch->children().empty()) {
     if(branch->branchingParticle()->id()==ParticleID::gamma ||
        branch->children()[0]->branchingParticle()->id()==ParticleID::gamma ||
        branch->children()[1]->branchingParticle()->id()==ParticleID::gamma)
       branch->type(ShowerPartnerType::QED);
     else {
       if(branch->branchingParticle()->id()==
 	 branch->children()[0]->branchingParticle()->id()) {
 	if(branch->branchingParticle()->dataPtr()->iColour()==PDT::Colour8) {
 	  tShowerParticlePtr emittor = 
 	    branch->branchingParticle()->showerKinematics()->z()>0.5 ?
 	    branch->children()[0]->branchingParticle() : 
 	    branch->children()[1]->branchingParticle();
 	  if(branch->branchingParticle()->colourLine()==emittor->colourLine())
 	    branch->type(ShowerPartnerType::QCDAntiColourLine);
 	  else if(branch->branchingParticle()->antiColourLine()==emittor->antiColourLine())
 	    branch->type(ShowerPartnerType::QCDColourLine);
 	  else
 	    assert(false);
 	}
 	else if(branch->branchingParticle()->colourLine()) {
 	  branch->type(ShowerPartnerType::QCDColourLine);
 	}
 	else if(branch->branchingParticle()->antiColourLine()) {
 	  branch->type(ShowerPartnerType::QCDAntiColourLine);
 	}
 	else
 	  assert(false);
       }
       else if(branch->branchingParticle()->id()==ParticleID::g &&
 	      branch->children()[0]->branchingParticle()->id()== 
 	      -branch->children()[1]->branchingParticle()->id()) {
 	if(branch->branchingParticle()->showerKinematics()->z()>0.5)
 	  branch->type(ShowerPartnerType::QCDAntiColourLine);
 	else
 	  branch->type(ShowerPartnerType::QCDColourLine);
 	
       }
       else
 	assert(false);
     }
   }
 }
 
 void Evolver::constructSpaceLikeLine(tShowerParticlePtr particle,
 				     HardBranchingPtr & first,
 				     HardBranchingPtr & last,
 				     SudakovPtr sud,PPtr beam) {
   if(!particle) return;
   if(!particle->parents().empty()) {
     tShowerParticlePtr parent = 
       dynamic_ptr_cast<ShowerParticlePtr>(particle->parents()[0]);
     SudakovPtr newSud=particle->showerKinematics()->SudakovFormFactor();
     constructSpaceLikeLine(parent,first,last,newSud,beam);
   }
   HardBranchingPtr newBranch = 
     new_ptr(HardBranching(particle,sud,last,HardBranching::Incoming));
   newBranch->beam(beam);
   if(!first) {
     first=newBranch;
     last =newBranch;
     return;
   }
   last->addChild(newBranch);
   tShowerParticlePtr timeChild = 
     dynamic_ptr_cast<ShowerParticlePtr>(particle->parents()[0]->children()[1]);
   HardBranchingPtr timeBranch;
   if(!timeChild->children().empty()) {
     timeBranch = 
       new_ptr(HardBranching(timeChild,
 			    timeChild->showerKinematics()->SudakovFormFactor(),
 			    last,HardBranching::Outgoing));
     constructTimeLikeLine(timeBranch,timeChild);
   }
   else {
     timeBranch = 
       new_ptr(HardBranching(timeChild,SudakovPtr(),last,HardBranching::Outgoing));
   }
   last->addChild(timeBranch);
   // sort out the type
   if(last->branchingParticle()      ->id() == ParticleID::gamma ||
      newBranch->branchingParticle() ->id() == ParticleID::gamma ||
      timeBranch->branchingParticle()->id() == ParticleID::gamma) {
     last->type(ShowerPartnerType::QED);
   }
   else if(last->branchingParticle()->id()==newBranch->branchingParticle()->id()) {
     if(last->branchingParticle()->id()==ParticleID::g) {
       if(last->branchingParticle()->colourLine()==
 	 newBranch->branchingParticle()->colourLine()) {
 	last->type(ShowerPartnerType::QCDAntiColourLine);
       }
       else {
 	last->type(ShowerPartnerType::QCDColourLine);
       }
     }
     else if(last->branchingParticle()->hasColour()) {
       last->type(ShowerPartnerType::QCDColourLine);
     }
     else if(last->branchingParticle()->hasAntiColour()) {
       last->type(ShowerPartnerType::QCDAntiColourLine);
     }
     else
       assert(false);
   }
   else if(newBranch->branchingParticle()->id()==ParticleID::g) { 
     if(last->branchingParticle()->hasColour()) {
       last->type(ShowerPartnerType::QCDAntiColourLine);
     }
     else if(last->branchingParticle()->hasAntiColour()) {
       last->type(ShowerPartnerType::QCDColourLine);
     }
     else
       assert(false);
   }
   else if(newBranch->branchingParticle()->hasColour()) {
     last->type(ShowerPartnerType::QCDColourLine);
   }
   else if(newBranch->branchingParticle()->hasAntiColour()) {
     last->type(ShowerPartnerType::QCDAntiColourLine);
   }
   else {
     assert(false);
   }
   last=newBranch;
 }
 
 void Evolver::connectTrees(ShowerTreePtr showerTree, 
 			   HardTreePtr hardTree, bool hard ) {
   ShowerParticleVector particles;
   // find the Sudakovs
   for(set<HardBranchingPtr>::iterator cit=hardTree->branchings().begin();
       cit!=hardTree->branchings().end();++cit) {
     // Sudakovs for ISR
     if((**cit).parent()&&(**cit).status()==HardBranching::Incoming) {
       ++_nis;
       IdList br(3);
       br[0] = (**cit).parent()->branchingParticle()->id();
       br[1] = (**cit).          branchingParticle()->id();
       br[2] = (**cit).parent()->children()[0]==*cit ?
 	(**cit).parent()->children()[1]->branchingParticle()->id() :
 	(**cit).parent()->children()[0]->branchingParticle()->id();
       BranchingList branchings = splittingGenerator()->initialStateBranchings();
       if(br[1]<0&&br[0]==br[1]) {
 	br[0] = abs(br[0]);
 	br[1] = abs(br[1]);
       }
       else if(br[1]<0) {
 	br[1] = -br[1];
 	br[2] = -br[2];
       }
       long index = abs(br[1]);
       SudakovPtr sudakov;
       for(BranchingList::const_iterator cjt = branchings.lower_bound(index); 
 	  cjt != branchings.upper_bound(index); ++cjt ) {
 	IdList ids = cjt->second.second;
 	if(ids[0]==br[0]&&ids[1]==br[1]&&ids[2]==br[2]) {
 	  sudakov=cjt->second.first;
 	  break;
 	}
       }
       if(!sudakov) throw Exception() << "Can't find Sudakov for the hard emission in "
 				     << "Evolver::connectTrees() for ISR" 
 				     << Exception::runerror;
       (**cit).parent()->sudakov(sudakov);
     }
     // Sudakovs for FSR
     else if(!(**cit).children().empty()) {
       ++_nfs;
       IdList br(3);
       br[0] = (**cit)               .branchingParticle()->id();
       br[1] = (**cit).children()[0]->branchingParticle()->id();
       br[2] = (**cit).children()[1]->branchingParticle()->id();
       BranchingList branchings = splittingGenerator()->finalStateBranchings();
       if(br[0]<0) {
 	br[0] = abs(br[0]);
 	br[1] = abs(br[1]);
 	br[2] = abs(br[2]);
       }
       long index = br[0];
       SudakovPtr sudakov;
       for(BranchingList::const_iterator cjt = branchings.lower_bound(index); 
 	  cjt != branchings.upper_bound(index); ++cjt ) {
 	IdList ids = cjt->second.second;
 	if(ids[0]==br[0]&&ids[1]==br[1]&&ids[2]==br[2]) {
 	  sudakov=cjt->second.first;
 	  break;
 	}
       }
       if(!sudakov) throw Exception() << "Can't find Sudakov for the hard emission in "
 				     << "Evolver::connectTrees()" 
 				     << Exception::runerror;
       (**cit).sudakov(sudakov);
     }
   }
   // calculate the evolution scale
   for(set<HardBranchingPtr>::iterator cit=hardTree->branchings().begin();
       cit!=hardTree->branchings().end();++cit) {
     particles.push_back((*cit)->branchingParticle());
   }
   showerModel()->partnerFinder()->
     setInitialEvolutionScales(particles,!hard,hardTree->interaction(),
 			      !hardTree->partnersSet());
   hardTree->partnersSet(true);
   // inverse reconstruction
   if(hard) {
     showerModel()->kinematicsReconstructor()->
       deconstructHardJets(hardTree,ShowerHandler::currentHandler()->evolver(),
 			  hardTree->interaction());
   }
   else
     showerModel()->kinematicsReconstructor()->
       deconstructDecayJets(hardTree,ShowerHandler::currentHandler()->evolver(),
 			   hardTree->interaction());
   // now reset the momenta of the showering particles
   vector<ShowerProgenitorPtr> particlesToShower;
   for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
 	cit=showerTree->incomingLines().begin();
       cit!=showerTree->incomingLines().end();++cit )
     particlesToShower.push_back(cit->first);
   // extract the showering particles
   for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
 	  cit=showerTree->outgoingLines().begin();
 	cit!=showerTree->outgoingLines().end();++cit )
     particlesToShower.push_back(cit->first);
   // match them
   map<ShowerProgenitorPtr,HardBranchingPtr> partners;
   for(set<HardBranchingPtr>::const_iterator bit=hardTree->branchings().begin();
       bit!=hardTree->branchings().end();++bit) {
     Energy2 dmin( 1e30*GeV2 );
     ShowerProgenitorPtr partner;
     for(vector<ShowerProgenitorPtr>::const_iterator pit=particlesToShower.begin();
 	pit!=particlesToShower.end();++pit) {
       if(partners.find(*pit)!=partners.end()) continue;
       if( (**bit).branchingParticle()->id() !=  (**pit).progenitor()->id() ) continue;
       if( (**bit).branchingParticle()->isFinalState() !=
 	  (**pit).progenitor()->isFinalState() ) continue;
       if( (**pit).progenitor()->isFinalState() ) {
 	Energy2 dtest =
 	  sqr( (**pit).progenitor()->momentum().x() - (**bit).showerMomentum().x() ) +
 	  sqr( (**pit).progenitor()->momentum().y() - (**bit).showerMomentum().y() ) +
 	  sqr( (**pit).progenitor()->momentum().z() - (**bit).showerMomentum().z() ) +
 	  sqr( (**pit).progenitor()->momentum().t() - (**bit).showerMomentum().t() );
 	// add mass difference for identical particles (e.g. Z0 Z0 production)
 	dtest += 1e10*sqr((**pit).progenitor()->momentum().m()-(**bit).showerMomentum().m());
 	if( dtest < dmin ) {
 	  partner = *pit;
 	  dmin = dtest;
 	}
       }
       else {
 	// ensure directions are right
 	if((**pit).progenitor()->momentum().z()/(**bit).showerMomentum().z()>ZERO) {
 	  partner = *pit;
 	  break;
 	}
       }
     }
     if(!partner) throw Exception() << "Failed to match shower and hard trees in Evolver::hardestEmission"
 				   << Exception::eventerror;
     partners[partner] = *bit;
   }
   for(vector<ShowerProgenitorPtr>::const_iterator pit=particlesToShower.begin();
       pit!=particlesToShower.end();++pit) {
     HardBranchingPtr partner = partners[*pit];
     if((**pit).progenitor()->dataPtr()->stable()) {
       (**pit).progenitor()->set5Momentum(partner->showerMomentum());
       (**pit).copy()->set5Momentum(partner->showerMomentum());
     }
     else {
       Lorentz5Momentum oldMomentum = (**pit).progenitor()->momentum();
       Lorentz5Momentum newMomentum = partner->showerMomentum();
       LorentzRotation boost( oldMomentum.findBoostToCM(),oldMomentum.e()/oldMomentum.mass());
       (**pit).progenitor()->transform(boost);
       (**pit).copy()      ->transform(boost);
       boost = LorentzRotation(-newMomentum.findBoostToCM(),newMomentum.e()/newMomentum.mass());
       (**pit).progenitor()->transform(boost);
       (**pit).copy()      ->transform(boost);
     }
   }
   // correction boosts for daughter trees
   for(map<tShowerTreePtr,pair<tShowerProgenitorPtr,tShowerParticlePtr> >::const_iterator 
 	tit  = showerTree->treelinks().begin();
       tit != showerTree->treelinks().end();++tit) {
     ShowerTreePtr decayTree = tit->first;
     map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator 
       cit = decayTree->incomingLines().begin();
     // reset the momentum of the decay particle
     Lorentz5Momentum oldMomentum = cit->first->progenitor()->momentum();
     Lorentz5Momentum newMomentum = tit->second.second->momentum();
     LorentzRotation boost( oldMomentum.findBoostToCM(),oldMomentum.e()/oldMomentum.mass());
     decayTree->transform(boost,true);
     boost = LorentzRotation(-newMomentum.findBoostToCM(),newMomentum.e()/newMomentum.mass());
     decayTree->transform(boost,true);
   }
 }
 
 void Evolver::doShowering(bool hard,XCPtr xcomb) {
   // order of the interactions
   bool showerOrder(true);
   // zero number of emissions
   _nis = _nfs = 0;
   // if MC@NLO H event and limited emissions
   // indicate both final and initial state emission
   if ( isMCatNLOHEvent && _limitEmissions != 0 ) {
     _nis = _nfs = 1;
   }
   // extract particles to shower
   vector<ShowerProgenitorPtr> particlesToShower(setupShower(hard));
   // setup the maximum scales for the shower
   if (hardVetoOn()) setupMaximumScales(particlesToShower,xcomb);
   // set the hard scales for the profiles
   setupHardScales(particlesToShower,xcomb);
   // specific stuff for hard processes and decays
   Energy minmass(ZERO), mIn(ZERO);
   // hard process generate the intrinsic p_T once and for all
   if(hard) {
     generateIntrinsicpT(particlesToShower);
   }
   // decay compute the minimum mass of the final-state
   else {
     for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
       if(particlesToShower[ix]->progenitor()->isFinalState()) {
 	if(particlesToShower[ix]->progenitor()->dataPtr()->stable()) 
 	  minmass += particlesToShower[ix]->progenitor()->dataPtr()->constituentMass();
 	else
 	  minmass += particlesToShower[ix]->progenitor()->mass();
       }
       else {
 	mIn = particlesToShower[ix]->progenitor()->mass();
       }
     }
     // throw exception if decay can't happen
     if ( minmass > mIn ) {
       throw Exception() << "Evolver.cc: Mass of decaying particle is "
 			<< "below constituent masses of decay products."
 			<< Exception::eventerror;
     }
   }
   // check if interactions in right order
   if(hardTree() && interaction_!=4 && 
      hardTree()->interaction()!=interactions_[0]) {
     assert(interactions_.size()==2);
     showerOrder = false;
     swap(interactions_[0],interactions_[1]);
   }
   // loop over possible interactions
+  bool reWeighting = _reWeight && hard && ShowerHandler::currentHandler()->firstInteraction();
+  double eventWeight=0.;
+  unsigned int nTryReWeight(0);
   for(unsigned int inter=0;inter<interactions_.size();++inter) {
     // set up for second pass if required
     if(inter!=0) {
       // zero intrinsic pt so only added first time round
       intrinsicpT().clear();
       // construct the tree and throw veto if not possible
       if(!(hard ? 
 	   constructHardTree (particlesToShower,interactions_[inter]) :
 	   constructDecayTree(particlesToShower,interactions_[inter]))) 
 	throw InteractionVeto();
     }
     // create random particle vector (only need to do once)
     vector<ShowerProgenitorPtr> tmp;
     unsigned int nColouredIncoming = 0;
     while(particlesToShower.size()>0){
       unsigned int xx=UseRandom::irnd(particlesToShower.size());
       tmp.push_back(particlesToShower[xx]);
       particlesToShower.erase(particlesToShower.begin()+xx);
     }
     particlesToShower=tmp;
     for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
       if(!particlesToShower[ix]->progenitor()->isFinalState() &&
 	 particlesToShower[ix]->progenitor()->coloured()) ++nColouredIncoming;
     }
     bool switchRecon = hard && nColouredIncoming !=1;
     // main shower loop
     unsigned int ntry(0);
     bool reconstructed = false;
     do {
       // clear results of last attempt if needed
       if(ntry!=0) {
 	currentTree()->clear();
 	setEvolutionPartners(hard,interactions_[inter],true);
 	_nis = _nfs = 0;
 	// if MC@NLO H event and limited emissions
 	// indicate both final and initial state emission
 	if ( isMCatNLOHEvent && _limitEmissions != 0 ) {
 	  _nis = _nfs = 1;
 	}
 	for(unsigned int ix=0; ix<particlesToShower.size();++ix) {
 	  SpinPtr spin = particlesToShower[ix]->progenitor()->spinInfo();
 	  if(spin && spin->decayVertex() &&
 	     dynamic_ptr_cast<tcSVertexPtr>(spin->decayVertex())) {
 	    spin->decayVertex(VertexPtr());
 	  }
 	}
       }
       // loop over particles
       for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
 	// extract the progenitor
 	progenitor(particlesToShower[ix]);
 	// final-state radiation
 	if(progenitor()->progenitor()->isFinalState()) {
 	  if(!isFSRadiationON()) continue;
 	  // perform shower
 	  progenitor()->hasEmitted(startTimeLikeShower(interactions_[inter]));
 	}
 	// initial-state radiation
 	else {
 	  if(!isISRadiationON()) continue;
 	  // hard process
 	  if(hard) {
 	    // get the PDF
 	    setBeamParticle(_progenitor->beam());
 	    assert(beamParticle());
 	    // perform the shower
 	    // set the beam particle
 	    tPPtr beamparticle=progenitor()->original();
 	    if(!beamparticle->parents().empty()) 
 	      beamparticle=beamparticle->parents()[0];
 	    // generate the shower
 	    progenitor()->hasEmitted(startSpaceLikeShower(beamparticle,
 							  interactions_[inter]));
 	  }
 	  // decay
 	  else {
 	    // skip colour and electrically neutral particles
 	    if(!progenitor()->progenitor()->dataPtr()->coloured() &&
 	       !progenitor()->progenitor()->dataPtr()->charged()) {
 	      progenitor()->hasEmitted(false);
 	      continue;
 	    }
  	    // perform shower
  	    // set the scales correctly. The current scale is the maximum scale for
  	    // emission not the starting scale
 	    ShowerParticle::EvolutionScales maxScales(progenitor()->progenitor()->scales());
 	    progenitor()->progenitor()->scales() = ShowerParticle::EvolutionScales();
 	    if(progenitor()->progenitor()->dataPtr()->charged()) {
 	      progenitor()->progenitor()->scales().QED      = progenitor()->progenitor()->mass();
 	      progenitor()->progenitor()->scales().QED_noAO = progenitor()->progenitor()->mass();
 	    }
 	    if(progenitor()->progenitor()->hasColour()) {
 	      progenitor()->progenitor()->scales().QCD_c       = progenitor()->progenitor()->mass();
 	      progenitor()->progenitor()->scales().QCD_c_noAO  = progenitor()->progenitor()->mass();
 	    }
 	    if(progenitor()->progenitor()->hasAntiColour()) {
 	      progenitor()->progenitor()->scales().QCD_ac      = progenitor()->progenitor()->mass();
 	      progenitor()->progenitor()->scales().QCD_ac_noAO = progenitor()->progenitor()->mass();
 	    }
 	    // perform the shower
 	    progenitor()->hasEmitted(startSpaceLikeDecayShower(maxScales,minmass,
 							       interactions_[inter]));
 	  }
 	}
       }
       // do the kinematic reconstruction, checking if it worked
       reconstructed = hard ?
 	showerModel()->kinematicsReconstructor()->
 	reconstructHardJets (currentTree(),intrinsicpT(),interactions_[inter],
 			     switchRecon && ntry>maximumTries()/2) :
 	showerModel()->kinematicsReconstructor()->
 	reconstructDecayJets(currentTree(),interactions_[inter]);
+      if(!reconstructed) continue;
+      // apply vetos on the full shower
+      for(vector<FullShowerVetoPtr>::const_iterator it=_fullShowerVetoes.begin();
+	  it!=_fullShowerVetoes.end();++it) {
+	int veto = (**it).applyVeto(currentTree());
+	if(veto<0) continue;
+	// veto the shower
+	if(veto==0) {
+	  reconstructed = false;
+	  break;
+	}
+	// veto the shower and reweight
+	else if(veto==1) {
+	  reconstructed = false;
+	  break;
+	}
+	// veto the event
+	else if(veto==2) {
+	  throw Veto();
+	}
+      }
+      if(reWeighting) {
+	if(reconstructed) eventWeight += 1.;
+	reconstructed=false;
+	++nTryReWeight;
+	if(nTryReWeight==_nReWeight) {
+	  reWeighting = false;
+	  if(eventWeight==0.) throw Veto();
+	}
+      }
     }
     while(!reconstructed&&maximumTries()>++ntry);
     // check if failed to generate the shower
     if(ntry==maximumTries()) {
       if(hard)
 	throw ShowerHandler::ShowerTriesVeto(ntry);
       else
 	throw Exception() << "Failed to generate the shower after "
 			  << ntry << " attempts in Evolver::showerDecay()"
 			  << Exception::eventerror;
     }
   }
+  // handle the weights and apply any reweighting required
+  if(nTryReWeight>0) {
+    tStdEHPtr seh = dynamic_ptr_cast<tStdEHPtr>(generator()->currentEventHandler());
+    static bool first = true;
+    if(seh) {
+      seh->reweight(eventWeight/double(nTryReWeight));
+    }
+    else if(first) {
+      generator()->log() << "Reweighting the shower only works with internal Herwig7 processes"
+    			 << "Presumably you are showering Les Houches Events. These will not be"
+    			 << "reweighted\n";
+      first = false;
+    }
+  }
   // tree has now showered
   _currenttree->hasShowered(true);
   if(!showerOrder) swap(interactions_[0],interactions_[1]);
   hardTree(HardTreePtr());
 }
 
 void Evolver:: convertHardTree(bool hard,ShowerInteraction::Type type) {
   map<ColinePtr,ColinePtr> cmap;
   // incoming particles
   for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator 
 	cit=currentTree()->incomingLines().begin();cit!=currentTree()->incomingLines().end();++cit) {
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       mit = hardTree()->particles().find(cit->first->progenitor());
     // put the colour lines in the map
     ShowerParticlePtr oldParticle = cit->first->progenitor();
     ShowerParticlePtr newParticle = mit->second->branchingParticle();
     ColinePtr cLine = oldParticle->    colourLine();
     ColinePtr aLine = oldParticle->antiColourLine();
     if(newParticle->colourLine() &&
        cmap.find(newParticle->    colourLine())==cmap.end())
       cmap[newParticle->    colourLine()] = cLine;
     if(newParticle->antiColourLine() &&
        cmap.find(newParticle->antiColourLine())==cmap.end())
       cmap[newParticle->antiColourLine()] = aLine;
     // check whether or not particle emits
     bool emission = mit->second->parent();
     if(emission) {
       if(newParticle->colourLine()) {
 	ColinePtr ctemp = newParticle->    colourLine();
 	ctemp->removeColoured(newParticle);
       }
       if(newParticle->antiColourLine()) {
 	ColinePtr ctemp = newParticle->antiColourLine();
 	ctemp->removeAntiColoured(newParticle);
       }
       newParticle = mit->second->parent()->branchingParticle();
     }
     // get the new colour lines
     ColinePtr newCLine,newALine;
     // sort out colour lines
     if(newParticle->colourLine()) {
       ColinePtr ctemp = newParticle->    colourLine();
       ctemp->removeColoured(newParticle);
       if(cmap.find(ctemp)!=cmap.end()) {
 	newCLine = cmap[ctemp];
       }
       else {
 	newCLine = new_ptr(ColourLine());
 	cmap[ctemp] = newCLine;
       }
     }
     // and anticolour lines
     if(newParticle->antiColourLine()) {
       ColinePtr ctemp = newParticle->antiColourLine();
       ctemp->removeAntiColoured(newParticle);
       if(cmap.find(ctemp)!=cmap.end()) {
 	newALine = cmap[ctemp];
       }
       else {
 	newALine = new_ptr(ColourLine());
 	cmap[ctemp] = newALine;
       }
     }
     // remove colour lines from old particle
     if(aLine) {
       aLine->removeAntiColoured(cit->first->copy());
       aLine->removeAntiColoured(cit->first->progenitor());
     }
     if(cLine) {
       cLine->removeColoured(cit->first->copy());
       cLine->removeColoured(cit->first->progenitor());
     }
     // add particle to colour lines
     if(newCLine) newCLine->addColoured    (newParticle);
     if(newALine) newALine->addAntiColoured(newParticle);
     // insert new particles
     cit->first->copy(newParticle);
     ShowerParticlePtr sp(new_ptr(ShowerParticle(*newParticle,1,false)));
     cit->first->progenitor(sp);
     currentTree()->incomingLines()[cit->first]=sp;
     cit->first->perturbative(!emission);
     // and the emitted particle if needed
     if(emission) {
       ShowerParticlePtr newOut = mit->second->parent()->children()[1]->branchingParticle();
       if(newOut->colourLine()) {
 	ColinePtr ctemp = newOut->    colourLine();
 	ctemp->removeColoured(newOut);
 	assert(cmap.find(ctemp)!=cmap.end());
 	cmap[ctemp]->addColoured    (newOut);
       }
       if(newOut->antiColourLine()) {
 	ColinePtr ctemp = newOut->antiColourLine();
 	ctemp->removeAntiColoured(newOut);
 	assert(cmap.find(ctemp)!=cmap.end());
 	cmap[ctemp]->addAntiColoured(newOut);
       }
       ShowerParticlePtr sout=new_ptr(ShowerParticle(*newOut,1,true));
       ShowerProgenitorPtr out=new_ptr(ShowerProgenitor(cit->first->original(),newOut,sout));
       out->perturbative(false);
       currentTree()->outgoingLines().insert(make_pair(out,sout));
     }
     if(hard) {
       // sort out the value of x
       if(mit->second->beam()->momentum().z()>ZERO) {
 	sp->x(newParticle->momentum(). plus()/mit->second->beam()->momentum(). plus());
       }
       else {
 	sp->x(newParticle->momentum().minus()/mit->second->beam()->momentum().minus());
       }
     }
   }
   // outgoing particles
   for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator 
 	cit=currentTree()->outgoingLines().begin();cit!=currentTree()->outgoingLines().end();++cit) {
     map<tShowerTreePtr,pair<tShowerProgenitorPtr,
 			    tShowerParticlePtr> >::const_iterator tit;
     for(tit  = currentTree()->treelinks().begin();
 	tit != currentTree()->treelinks().end();++tit) {
       if(tit->second.first && tit->second.second==cit->first->progenitor())
 	break;
     }
     map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator 
       mit = hardTree()->particles().find(cit->first->progenitor());
     if(mit==hardTree()->particles().end()) continue;
     // put the colour lines in the map
     ShowerParticlePtr oldParticle = cit->first->progenitor();
     ShowerParticlePtr newParticle = mit->second->branchingParticle();
     ShowerParticlePtr newOut;
     ColinePtr cLine = oldParticle->    colourLine();
     ColinePtr aLine = oldParticle->antiColourLine();
     if(newParticle->colourLine() &&
        cmap.find(newParticle->    colourLine())==cmap.end())
       cmap[newParticle->    colourLine()] = cLine;
     if(newParticle->antiColourLine() &&
        cmap.find(newParticle->antiColourLine())==cmap.end())
       cmap[newParticle->antiColourLine()] = aLine;
     // check whether or not particle emits
     bool emission = !mit->second->children().empty();
     if(emission) {
       if(newParticle->colourLine()) {
 	ColinePtr ctemp = newParticle->    colourLine();
 	ctemp->removeColoured(newParticle);
       }
       if(newParticle->antiColourLine()) {
 	ColinePtr ctemp = newParticle->antiColourLine();
 	ctemp->removeAntiColoured(newParticle);
       }
       newParticle = mit->second->children()[0]->branchingParticle();
       newOut      = mit->second->children()[1]->branchingParticle();
       if(newParticle->id()!=oldParticle->id()&&newParticle->id()==newOut->id())
 	swap(newParticle,newOut);
     }
     // get the new colour lines
     ColinePtr newCLine,newALine;
     // sort out colour lines
     if(newParticle->colourLine()) {
       ColinePtr ctemp = newParticle->    colourLine();
       ctemp->removeColoured(newParticle);
       if(cmap.find(ctemp)!=cmap.end()) {
 	newCLine = cmap[ctemp];
       }
       else {
 	newCLine = new_ptr(ColourLine());
 	cmap[ctemp] = newCLine;
       }
     }
     // and anticolour lines
     if(newParticle->antiColourLine()) {
       ColinePtr ctemp = newParticle->antiColourLine();
       ctemp->removeAntiColoured(newParticle);
       if(cmap.find(ctemp)!=cmap.end()) {
 	newALine = cmap[ctemp];
       }
       else {
 	newALine = new_ptr(ColourLine());
 	cmap[ctemp] = newALine;
       }
     }
     // remove colour lines from old particle
     if(aLine) {
       aLine->removeAntiColoured(cit->first->copy());
       aLine->removeAntiColoured(cit->first->progenitor());
     }
     if(cLine) {
       cLine->removeColoured(cit->first->copy());
       cLine->removeColoured(cit->first->progenitor());
     }
     // special for unstable particles
     if(newParticle->id()==oldParticle->id() &&
        (tit!=currentTree()->treelinks().end()||!oldParticle->dataPtr()->stable())) {
       Lorentz5Momentum oldMomentum = oldParticle->momentum();
       Lorentz5Momentum newMomentum = newParticle->momentum();
       LorentzRotation boost( oldMomentum.findBoostToCM(),oldMomentum.e()/oldMomentum.mass());
       if(tit!=currentTree()->treelinks().end()) tit->first->transform(boost,false);
       oldParticle->transform(boost);
       boost = LorentzRotation(-newMomentum.findBoostToCM(),newMomentum.e()/newMomentum.mass());
       oldParticle->transform(boost);
       if(tit!=currentTree()->treelinks().end()) tit->first->transform(boost,false);
       newParticle=oldParticle;
     }
     // add particle to colour lines
     if(newCLine) newCLine->addColoured    (newParticle);
     if(newALine) newALine->addAntiColoured(newParticle);
     // insert new particles
     cit->first->copy(newParticle);
     ShowerParticlePtr sp(new_ptr(ShowerParticle(*newParticle,1,true)));
     cit->first->progenitor(sp);
     currentTree()->outgoingLines()[cit->first]=sp;
     cit->first->perturbative(!emission);
     // and the emitted particle if needed
     if(emission) {
       if(newOut->colourLine()) {
 	ColinePtr ctemp = newOut->    colourLine();
 	ctemp->removeColoured(newOut);
 	assert(cmap.find(ctemp)!=cmap.end());
 	cmap[ctemp]->addColoured    (newOut);
       }
       if(newOut->antiColourLine()) {
 	ColinePtr ctemp = newOut->antiColourLine();
 	ctemp->removeAntiColoured(newOut);
 	assert(cmap.find(ctemp)!=cmap.end());
 	cmap[ctemp]->addAntiColoured(newOut);
       }
       ShowerParticlePtr sout=new_ptr(ShowerParticle(*newOut,1,true));
       ShowerProgenitorPtr out=new_ptr(ShowerProgenitor(cit->first->original(),newOut,sout));
       out->perturbative(false);
       currentTree()->outgoingLines().insert(make_pair(out,sout));
     }
     // update any decay products
     if(tit!=currentTree()->treelinks().end())
       currentTree()->updateLink(tit->first,make_pair(cit->first,sp));
   }
   // reset the tree
   currentTree()->resetShowerProducts();
   // reextract the particles and set the colour partners
   vector<ShowerParticlePtr> particles = 
     currentTree()->extractProgenitorParticles();
   // clear the partners
   for(unsigned int ix=0;ix<particles.size();++ix) {
     particles[ix]->partner(ShowerParticlePtr());
     particles[ix]->clearPartners();
   }
   // clear the tree
   hardTree(HardTreePtr());
   // Set the initial evolution scales
   showerModel()->partnerFinder()->
     setInitialEvolutionScales(particles,!hard,type,!_hardtree);
 }
 
 Branching Evolver::selectTimeLikeBranching(tShowerParticlePtr particle,
 					   ShowerInteraction::Type type,
 					   HardBranchingPtr branch) {
   Branching fb;
   unsigned int iout=0;
   tcPDPtr pdata[2];
   while (true) {
     // break if doing truncated shower and no truncated shower needed
     if(branch && (!isTruncatedShowerON()||hardOnly())) break;
     fb=_splittingGenerator->chooseForwardBranching(*particle,_finalenhance,type);
     // no emission break
     if(!fb.kinematics) break;
     // special for truncated shower
     if(branch) {
       // check haven't evolved too far
       if(fb.kinematics->scale() < branch->scale()) {
 	fb=Branching();
 	break;
       }
       // get the particle data objects
       for(unsigned int ix=0;ix<2;++ix) pdata[ix]=getParticleData(fb.ids[ix+1]);
       if(particle->id()!=fb.ids[0]) {
     	for(unsigned int ix=0;ix<2;++ix) {
     	  tPDPtr cc(pdata[ix]->CC());
     	  if(cc) pdata[ix]=cc;
     	}
       }
       // find the truncated line
       iout=0;
       if(pdata[0]->id()!=pdata[1]->id()) {
 	if(pdata[0]->id()==particle->id())       iout=1;
 	else if (pdata[1]->id()==particle->id()) iout=2;
       }
       else if(pdata[0]->id()==particle->id()) {
 	if(fb.kinematics->z()>0.5) iout=1;
 	else                       iout=2;
       }
       // apply the vetos for the truncated shower
       // no flavour changing branchings
       if(iout==0) {
 	particle->vetoEmission(fb.type,fb.kinematics->scale());
 	continue;
       }
       double zsplit = iout==1 ? fb.kinematics->z() : 1-fb.kinematics->z();
       // only if same interaction for forced branching
       ShowerInteraction::Type type2 = fb.type==ShowerPartnerType::QED ?
 	ShowerInteraction::QED : ShowerInteraction::QCD;
       // and evolution
       if(type2==branch->sudakov()->interactionType()) {
 	if(zsplit < 0.5 || // hardest line veto
 	   fb.kinematics->scale()*zsplit < branch->scale() ) { // angular ordering veto
 	  particle->vetoEmission(fb.type,fb.kinematics->scale());
 	  continue;
 	}
       }
       // pt veto
       if(fb.kinematics->pT() > progenitor()->maximumpT(type2)) {
 	particle->vetoEmission(fb.type,fb.kinematics->scale());
 	continue;
       }
     }
     // standard vetos for all emissions
     if(timeLikeVetoed(fb,particle)) {
       particle->vetoEmission(fb.type,fb.kinematics->scale());
       if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
       continue;
     }
     break;
   }
   // normal case
   if(!branch) {
     if(fb.kinematics) fb.hard = false;
     return fb;
   }
   // truncated emission
   if(fb.kinematics) {
     fb.hard = false;
     fb.iout = iout;
     return fb;
   }
   // otherwise need to return the hard emission
   // construct the kinematics for the hard emission
   ShoKinPtr showerKin=
     branch->sudakov()->createFinalStateBranching(branch->scale(),
 	                                         branch->children()[0]->z(),
 	                                         branch->phi(),
 						 branch->children()[0]->pT());
   showerKin->initialize( *particle,PPtr() );
   IdList idlist(3);
   idlist[0] = particle->id();
   idlist[1] = branch->children()[0]->branchingParticle()->id();
   idlist[2] = branch->children()[1]->branchingParticle()->id();
   fb = Branching( showerKin, idlist, branch->sudakov(),branch->type() );
   fb.hard = true;
   fb.iout=0;
   // return it
   return fb;
 }
 
 Branching Evolver::selectSpaceLikeDecayBranching(tShowerParticlePtr particle,
 						 const ShowerParticle::EvolutionScales & maxScales,
 						 Energy minmass,ShowerInteraction::Type type,
 						 HardBranchingPtr branch) {
   Branching fb;
   unsigned int iout=0;
   tcPDPtr pdata[2];
   while (true) {
     // break if doing truncated shower and no truncated shower needed
     if(branch && (!isTruncatedShowerON()||hardOnly())) break;
     // select branching
     fb=_splittingGenerator->chooseDecayBranching(*particle,maxScales,minmass,
 						 _initialenhance,type);
     // return if no radiation
     if(!fb.kinematics) break;
     // special for truncated shower
     if(branch) {
       // check haven't evolved too far
       if(fb.kinematics->scale() < branch->scale()) {
 	fb=Branching();
 	break;
       }
       // get the particle data objects
       for(unsigned int ix=0;ix<2;++ix) pdata[ix]=getParticleData(fb.ids[ix+1]);
       if(particle->id()!=fb.ids[0]) {
 	for(unsigned int ix=0;ix<2;++ix) {
 	  tPDPtr cc(pdata[ix]->CC());
 	  if(cc) pdata[ix]=cc;
 	}
       }
       // find the truncated line
       iout=0;
       if(pdata[0]->id()!=pdata[1]->id()) {
 	if(pdata[0]->id()==particle->id())       iout=1;
 	else if (pdata[1]->id()==particle->id()) iout=2;
       }
       else if(pdata[0]->id()==particle->id()) {
 	if(fb.kinematics->z()>0.5) iout=1;
 	else                       iout=2;
       }
       // apply the vetos for the truncated shower
       // no flavour changing branchings
       if(iout==0) {
 	particle->vetoEmission(fb.type,fb.kinematics->scale());
 	continue;
       }
       ShowerInteraction::Type type2 = fb.type==ShowerPartnerType::QED ?
 	ShowerInteraction::QED : ShowerInteraction::QCD;
       double zsplit = iout==1 ? fb.kinematics->z() : 1-fb.kinematics->z();
       if(type2==branch->sudakov()->interactionType()) {
 	if(zsplit < 0.5 || // hardest line veto
 	   fb.kinematics->scale()*zsplit < branch->scale() ) { // angular ordering veto
 	  particle->vetoEmission(fb.type,fb.kinematics->scale());
 	  continue;
 	}
       }
       // pt veto
       if(fb.kinematics->pT() > progenitor()->maximumpT(type2)) {
 	particle->vetoEmission(fb.type,fb.kinematics->scale());
 	continue;
       }
     }
     // if not vetoed break
     if(spaceLikeDecayVetoed(fb,particle)) {
       // otherwise reset scale and continue
       particle->vetoEmission(fb.type,fb.kinematics->scale());
       continue;
     }
     break;
   }
   // normal case
   if(!branch) {
     if(fb.kinematics) fb.hard = false;
     return fb;
   }
   // truncated emission
   if(fb.kinematics) {
     fb.hard = false;
     fb.iout = iout;
     return fb;
   }
   // otherwise need to return the hard emission
   // construct the kinematics for the hard emission
   ShoKinPtr showerKin=
     branch->sudakov()->createDecayBranching(branch->scale(),
 					    branch->children()[0]->z(),
 					    branch->phi(),
 					    branch->children()[0]->pT());
    showerKin->initialize( *particle,PPtr() );
    IdList idlist(3);
    idlist[0] = particle->id();
    idlist[1] = branch->children()[0]->branchingParticle()->id();
    idlist[2] = branch->children()[1]->branchingParticle()->id();
    // create the branching
    fb = Branching( showerKin, idlist, branch->sudakov(),ShowerPartnerType::QCDColourLine  );
    fb.hard=true;
    fb.iout=0;
    // return it
   return fb;
 }
diff --git a/Shower/Base/Evolver.h b/Shower/Base/Evolver.h
--- a/Shower/Base/Evolver.h
+++ b/Shower/Base/Evolver.h
@@ -1,951 +1,969 @@
 // -*- C++ -*-
 //
 // Evolver.h is a part of Herwig - A multi-purpose Monte Carlo event generator
 // Copyright (C) 2002-2011 The Herwig Collaboration
 //
 // Herwig is licenced under version 2 of the GPL, see COPYING for details.
 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
 //
 #ifndef HERWIG_Evolver_H
 #define HERWIG_Evolver_H
 //
 // This is the declaration of the Evolver class.
 //
 
 #include "ThePEG/Interface/Interfaced.h"
 #include "Herwig/Shower/SplittingFunctions/SplittingGenerator.h"
 #include "ShowerModel.h"
 #include "ThePEG/PDF/BeamParticleData.h"
 #include "ShowerTree.h"
 #include "ShowerProgenitor.fh"
 #include "Herwig/Shower/ShowerHandler.fh"
 #include "Branching.h"
 #include "ShowerVeto.h"
+#include "FullShowerVeto.h"
 #include "HardTree.h"
 #include "ThePEG/Handlers/XComb.h"
 #include "Evolver.fh"
 #include "Herwig/MatrixElement/HwMEBase.h"
 #include "Herwig/Decay/HwDecayerBase.h"
 #include "Herwig/MatrixElement/Matchbox/Matching/ShowerApproximation.h"
+#include "Herwig/Utilities/Statistic.h"
 
 namespace Herwig {
 
 using namespace ThePEG;
 
 /**\ingroup Shower
  * Exception class
  * used to communicate failure of QED shower
  */
 struct InteractionVeto {};
 
 /** \ingroup Shower
  * The Evolver class class performs the sohwer evolution of hard scattering 
  * and decay processes in Herwig.
  *
  * @see \ref EvolverInterfaces "The interfaces"
  * defined for Evolver.
  */
 class Evolver: public Interfaced {
 
 /**
  *  The ShowerHandler is a friend to set some parameters at initialisation
  */
 friend class ShowerHandler;
 
 public:
   
   /**
    *  Pointer to an XComb object
    */
   typedef Ptr<XComb>::pointer XCPtr;
 
 public:
 
   /**
    *  Default Constructor
    */
   Evolver() : _maxtry(100), _meCorrMode(1), _hardVetoMode(1),
 	      _hardVetoRead(0), _reconOpt(0),
 	      _hardVetoReadOption(false),
 	      _iptrms(ZERO), _beta(0.), _gamma(ZERO), _iptmax(),
 	      _limitEmissions(0), _initialenhance(1.), _finalenhance(1.),
+	      _nReWeight(100), _reWeight(false),
 	       interaction_(1), _trunc_Mode(true), _hardEmissionMode(0),
 	      _spinOpt(1), _softOpt(2), _hardPOWHEG(false),
 	      theFactorizationScaleFactor(1.0), 
 	      theRenormalizationScaleFactor(1.0), muPt(ZERO),
 	      _maxTryFSR(100000),_maxFailFSR(100),_fracFSR(0.001),
               _nFSR(0), _nFailedFSR(0)
   {}
 
   /**
    *  Members to perform the shower
    */
   //@{
   /**
    * Perform the shower of the hard process
    */
   virtual void showerHardProcess(ShowerTreePtr,XCPtr);
 
   /**
    * Perform the shower of a decay
    */
   virtual void showerDecay(ShowerTreePtr);
   //@}
 
   /**
    *  Access to the flags and shower variables
    */
   //@{
   /**
    *  Is there any showering switched on
    */
   bool showeringON() const { return isISRadiationON() || isFSRadiationON(); }
 
   /**
    * It returns true/false if the initial-state radiation is on/off.
    */
   bool isISRadiationON() const { return _splittingGenerator->isISRadiationON(); }
 
   /**
    * It returns true/false if the final-state radiation is on/off.
    */
   bool isFSRadiationON() const { return _splittingGenerator->isFSRadiationON(); }
 
   /**
    *  Get the ShowerModel
    */ 
   ShowerModelPtr showerModel() const {return _model;}
 
   /**
    *  Get the SplittingGenerator
    */
   tSplittingGeneratorPtr splittingGenerator() const { return _splittingGenerator; }
 
   /**
    * Mode for hard emissions
    */
   int hardEmissionMode() const {return _hardEmissionMode;}
 
   /**
    * Switch on or off hard vetoes
    */
   void restrictPhasespace(bool yes) {
     if ( yes )
       _hardVetoMode = 1;
     else
       _hardVetoMode = 0;
   }
 
   /**
    * Switch on or off hard veto scale from muF
    */
   void hardScaleIsMuF(bool yes) {
     if ( yes )
       _hardVetoRead = 1;
     else
       _hardVetoRead = 0;
   }
   //@}
 
   /**
    *  Connect the Hard and Shower trees
    */
   virtual void connectTrees(ShowerTreePtr showerTree, HardTreePtr hardTree, bool hard );
 
   /**
    *   Access to switches for spin correlations
    */
   //@{
   /**
    *   Spin Correlations
    */
   unsigned int spinCorrelations() const {
     return _spinOpt;
   }
 
   /**
    *  Soft correlations
    */
   unsigned int softCorrelations() const {
     return _softOpt;
   }
 
   /**
    *  Any correlations
    */
   bool correlations() const {
     return _spinOpt!=0||_softOpt!=0;
   }
   //@}
 
 
   /**
    * Set the factorization scale factor
    */
   void factorizationScaleFactor(double f) { 
     if ( f == theFactorizationScaleFactor )
       return;
     theFactorizationScaleFactor = f;
     splittingGenerator()->factorizationScaleFactor(f);
   }
 
   /**
    * Set the renormalization scale factor
    */
   void renormalizationScaleFactor(double f) {
     if ( f == theRenormalizationScaleFactor )
       return;
     theRenormalizationScaleFactor = f;
     splittingGenerator()->renormalizationScaleFactor(f);
   }
 
 public:
 
   /** @name Functions used by the persistent I/O system. */
   //@{
   /**
    * Function used to write out object persistently.
    * @param os the persistent output stream written to.
    */
   void persistentOutput(PersistentOStream & os) const;
 
   /**
    * Function used to read in object persistently.
    * @param is the persistent input stream read from.
    * @param version the version number of the object when written.
    */
   void persistentInput(PersistentIStream & is, int version);
   //@}
 
   /**
    * The standard Init function used to initialize the interfaces.
    * Called exactly once for each class by the class description system
    * before the main function starts or
    * when this class is dynamically loaded.
    */
   static void Init();
 
 protected:
 
   /**
    *   Perform the shower
    */
   void doShowering(bool hard,XCPtr);
 
   /**
    *  Generate the hard matrix element correction
    */
   virtual void hardMatrixElementCorrection(bool);
 
   /**
    *  Generate the hardest emission
    */
   virtual void hardestEmission(bool hard);
 
   /**
    * Extract the particles to be showered, set the evolution scales
    * and apply the hard matrix element correction
    * @param hard Whether this is a hard process or decay
    * @return The particles to be showered
    */
   virtual vector<ShowerProgenitorPtr> setupShower(bool hard);
 
   /**
    *  set the colour partners
    */
   virtual void setEvolutionPartners(bool hard,ShowerInteraction::Type,
 				    bool clear);
 
   /**
    *  Methods to perform the evolution of an individual particle, including
    *  recursive calling on the products
    */
   //@{
   /**
    * It does the forward evolution of the time-like input particle
    * (and recursively for all its radiation products).
    * accepting only emissions which conforms to the showerVariables
    * and soft matrix element correction.
    * If at least one emission has occurred then the method returns true.
    * @param particle The particle to be showered
    */
   virtual bool timeLikeShower(tShowerParticlePtr particle, ShowerInteraction::Type,
 			      Branching fb, bool first);
 
   /**
    * It does the backward evolution of the space-like input particle 
    * (and recursively for all its time-like radiation products).
    * accepting only emissions which conforms to the showerVariables.
    * If at least one emission has occurred then the method returns true
    * @param particle The particle to be showered
    * @param beam The beam particle
    */
   virtual bool spaceLikeShower(tShowerParticlePtr particle,PPtr beam,
 			       ShowerInteraction::Type); 
 
   /**
    * If does the forward evolution of the input on-shell particle
    * involved in a decay 
    * (and recursively for all its time-like radiation products).
    * accepting only emissions which conforms to the showerVariables.
    * @param particle    The particle to be showered
    * @param maxscale    The maximum scale for the shower.
    * @param minimumMass The minimum mass of the final-state system
    */
   virtual bool 
   spaceLikeDecayShower(tShowerParticlePtr particle,
 		       const ShowerParticle::EvolutionScales & maxScales,
 		       Energy minimumMass,ShowerInteraction::Type,
 		       Branching fb);
 
   /**
    * Truncated shower from a time-like particle
    */
   virtual bool truncatedTimeLikeShower(tShowerParticlePtr particle,
 				       HardBranchingPtr branch,
 				       ShowerInteraction::Type type,
 				       Branching fb, bool first);
  
   /**
    * Truncated shower from a space-like particle
    */
   virtual bool truncatedSpaceLikeShower(tShowerParticlePtr particle,PPtr beam,
 					HardBranchingPtr branch,
 					ShowerInteraction::Type type);
 
   /**
    * Truncated shower from a time-like particle
    */
   virtual bool truncatedSpaceLikeDecayShower(tShowerParticlePtr particle,
 					     const ShowerParticle::EvolutionScales & maxScales,
 					     Energy minimumMass, HardBranchingPtr branch,
 					     ShowerInteraction::Type type, Branching fb);
   //@}
 
   /**
    *  Switches for matrix element corrections
    */
   //@{
   /**
    * Any ME correction?   
    */
   bool MECOn(bool hard) const {
     return ( _hardEmissionMode == 0 ||
 	     (!hard && _hardEmissionMode ==-1) ) &&
       _meCorrMode > 0;
   }
 
   /**
    * Any hard ME correction? 
    */
   bool hardMEC(bool hard) const {
     return ( _hardEmissionMode == 0 ||
 	     (!hard && _hardEmissionMode ==-1) ) &&
       (_meCorrMode == 1 || _meCorrMode == 2);
   }
 
   /**
    * Any soft ME correction? 
    */
   bool softMEC() const {
     return ( _hardEmissionMode == 0 ||
 	     (_currenttree->isDecay() && _hardEmissionMode ==-1) ) &&
       (_meCorrMode == 1 || _meCorrMode > 2);
   }
   //@}
 
   /**
    * Is the truncated shower on?
    */
   bool isTruncatedShowerON() const {return _trunc_Mode;}
 
   /**
    *  Switch for intrinsic pT
    */
   //@{
   /**
    * Any intrinsic pT?
    */
   bool ipTon() const {
     return _iptrms != ZERO || ( _beta == 1.0 && _gamma != ZERO && _iptmax !=ZERO );
   }
    //@}  
 
   /**@name Additional shower vetoes */
   //@{
   /**
    * Insert a veto.
    */
   void addVeto (ShowerVetoPtr v) { _vetoes.push_back(v); }
 
   /**
    * Remove a veto.
    */
   void removeVeto (ShowerVetoPtr v) { 
     vector<ShowerVetoPtr>::iterator vit = find(_vetoes.begin(),_vetoes.end(),v);
     if (vit != _vetoes.end())
       _vetoes.erase(vit);
   }
 
   //@}
 
   /**
    *  Switches for vetoing hard emissions
    */
   //@{
   /**
    * Vetos on? 
    */
   bool hardVetoOn() const { return _hardVetoMode > 0; }
 
   /**
    * veto hard emissions in IS shower?
    */
   bool hardVetoIS() const { return _hardVetoMode == 1 || _hardVetoMode == 2; }
 
   /**
    * veto hard emissions in FS shower?
    */
   bool hardVetoFS() const { return _hardVetoMode == 1 || _hardVetoMode > 2; }
 
   /**
    * veto hard emissions according to lastScale from XComb? 
    */
   bool hardVetoXComb() const {return (_hardVetoRead == 1);}
 
   /**
    * Returns true if the hard veto read-in is to be applied to only
    * the primary collision and false otherwise.
    */
   bool hardVetoReadOption() const {return _hardVetoReadOption;}
   //@}
 
   /**
    *  Enhancement factors for radiation needed to generate the soft matrix
    *  element correction.
    */
   //@{
   /**
    *  Access the enhancement factor for initial-state radiation
    */
   double initialStateRadiationEnhancementFactor() const { return _initialenhance; }
 
   /**
    *  Access the enhancement factor for final-state radiation
    */
   double finalStateRadiationEnhancementFactor() const { return _finalenhance; }
 
   /**
    *  Set the enhancement factor for initial-state radiation
    */
   void initialStateRadiationEnhancementFactor(double in) { _initialenhance=in; }
 
   /**
    *  Set the enhancement factor for final-state radiation
    */
   void finalStateRadiationEnhancementFactor(double in) { _finalenhance=in; }
   //@}
 
   /**
    *  Access to set/get the HardTree currently beinging showered
    */
   //@{
   /**
    *  The HardTree currently being showered
    */
   tHardTreePtr hardTree() {return _hardtree;}
 
   /**
    *  The HardTree currently being showered
    */
   void hardTree(tHardTreePtr in) {_hardtree = in;}
   //@}
 
   /**
    * Access/set the beam particle for the current initial-state shower
    */
   //@{
   /**
    *  Get the beam particle data
    */
   Ptr<BeamParticleData>::const_pointer beamParticle() const { return _beam; }
 
   /**
    *  Set the beam particle data
    */
   void setBeamParticle(Ptr<BeamParticleData>::const_pointer in) { _beam=in; }
   //@}
 
   /**
    * Set/Get the current tree being evolverd for inheriting classes
    */
   //@{
   /**
    * Get the tree
    */
   tShowerTreePtr currentTree() { return _currenttree; }
 
   /**
    * Set the tree
    */
   void currentTree(tShowerTreePtr tree) { _currenttree=tree; }
 
   //@}
 
   /**
    *  Access the maximum number of attempts to generate the shower
    */
   unsigned int maximumTries() const { return _maxtry; }
 
   /**
    * Set/Get the ShowerProgenitor for the current shower
    */
   //@{
   /**
    *  Access the progenitor
    */
   ShowerProgenitorPtr progenitor() { return _progenitor; }
 
   /**
    *  Set the progenitor
    */
   void progenitor(ShowerProgenitorPtr in) { _progenitor=in; }
   //@}
 
   /**
    *  Calculate the intrinsic \f$p_T\f$.
    */
   virtual void generateIntrinsicpT(vector<ShowerProgenitorPtr>);
 
   /**
    *  Access to the intrinsic \f$p_T\f$ for inheriting classes
    */
   map<tShowerProgenitorPtr,pair<Energy,double> > & intrinsicpT() { return _intrinsic; }
 
   /**
    *  find the maximally allowed pt acc to the hard process. 
    */
   void setupMaximumScales(const vector<ShowerProgenitorPtr> &,XCPtr);
 
   /**
    *  find the relevant hard scales for profile scales. 
    */
   void setupHardScales(const vector<ShowerProgenitorPtr> &,XCPtr);
 
   /**
    * Return the relevant hard scale to be used in the profile scales
    */
   Energy hardScale() const {
     return muPt;
   }
 
   /**
    *  Convert the HardTree into an extra shower emission 
    */
   void convertHardTree(bool hard,ShowerInteraction::Type type);
 
 protected:
 
   /**
    *  Start the shower of a timelike particle
    */
   virtual bool startTimeLikeShower(ShowerInteraction::Type);
 
   /**
    *  Update of the time-like stuff
    */
   void updateHistory(tShowerParticlePtr particle);
 
   /**
    *  Start the shower of a spacelike particle
    */
   virtual bool startSpaceLikeShower(PPtr,ShowerInteraction::Type);
 
   /**
    *  Start the shower of a spacelike particle
    */
   virtual bool 
   startSpaceLikeDecayShower(const ShowerParticle::EvolutionScales & maxScales,
 			    Energy minimumMass,ShowerInteraction::Type);
 
   /**
    * Select the branching for the next time-like emission
    */
   Branching selectTimeLikeBranching(tShowerParticlePtr particle,
 				    ShowerInteraction::Type type,
 				    HardBranchingPtr branch);
 
   /**
    * Select the branching for the next space-like emission in a decay
    */
   Branching selectSpaceLikeDecayBranching(tShowerParticlePtr particle,
 					  const ShowerParticle::EvolutionScales & maxScales,
 					  Energy minmass,ShowerInteraction::Type type,
 					  HardBranchingPtr branch);
   /**
    *  Create the timelike child of a branching
    */
   ShowerParticleVector createTimeLikeChildren(tShowerParticlePtr particle,
 					      IdList ids);
 
   /**
    *  Vetos for the timelike shower
    */
   virtual bool timeLikeVetoed(const Branching &,ShowerParticlePtr);
 
   /**
    *  Vetos for the spacelike shower
    */
   virtual bool spaceLikeVetoed(const Branching &,ShowerParticlePtr);
 
   /**
    *  Vetos for the spacelike shower
    */
   virtual bool spaceLikeDecayVetoed(const Branching &,ShowerParticlePtr);
 
   /**
    *  Only generate the hard emission, for testing only.
    */
   bool hardOnly() const {return _limitEmissions==3;}
 
   /**
    *  Members to construct the HardTree from the shower if needed
    */
   //@{
   /**
    *  Construct the tree for a scattering process
    */
   bool constructHardTree(vector<ShowerProgenitorPtr> & particlesToShower,
 			 ShowerInteraction::Type inter);
 
   /**
    *  Construct the tree for a decay process
    */  
   bool constructDecayTree(vector<ShowerProgenitorPtr> & particlesToShower,
 			  ShowerInteraction::Type inter);
 
   /**
    *  Construct a time-like line
    */
   void constructTimeLikeLine(tHardBranchingPtr branch,tShowerParticlePtr particle);
 
   /**
    *  Construct a space-like line
    */
   void constructSpaceLikeLine(tShowerParticlePtr particle,
 			      HardBranchingPtr & first, HardBranchingPtr & last,
 			      SudakovPtr sud,PPtr beam);
   //@}
 
 public:
 
   /** @name MC@NLO diagnostics */
   //@{
 
   /**
    * True, if Matchbox MC@NLO S-event
    */
   bool wasMCatNLOSEvent() const { return isMCatNLOSEvent; }
 
   /**
    * True, if matchbox MC@NLO H-event
    */
   bool wasMCatNLOHEvent() const { return isMCatNLOHEvent; }
 
   //@}
 
 protected:
 
   /** @name Clone Methods. */
   //@{
   /**
    * Make a simple clone of this object.
    * @return a pointer to the new object.
    */
   virtual IBPtr clone() const;
 
   /** Make a clone of this object, possibly modifying the cloned object
    * to make it sane.
    * @return a pointer to the new object.
    */
   virtual IBPtr fullclone() const;
   //@} 
 
 protected:
   
   /** @name Standard Interfaced functions. */
   //@{
   /**
    * Initialize this object after the setup phase before saving an
    * EventGenerator to disk.
    * @throws InitException if object could not be initialized properly.
    */
   virtual void doinit();
   //@}
 
 private:
 
   /**
    * The assignment operator is private and must never be called.
    * In fact, it should not even be implemented.
    */
   Evolver & operator=(const Evolver &);
 
 private:
 
   /**
    *  Pointer to the model for the shower evolution model
    */
   ShowerModelPtr _model;
 
   /**
    * Pointer to the splitting generator
    */
   SplittingGeneratorPtr _splittingGenerator;
 
   /**
    *  Maximum number of tries to generate the shower of a particular tree
    */
   unsigned int _maxtry;
 
   /**
    * Matrix element correction switch
    */
   unsigned int _meCorrMode; 
 
   /**
    * Hard emission veto switch
    */
   unsigned int _hardVetoMode; 
 
   /**
    * Hard veto to be read switch
    */
   unsigned int _hardVetoRead; 
 
   /**
    *  Control of the reconstruction option
    */
   unsigned int _reconOpt;
 
   /**
    * If hard veto pT scale is being read-in this determines
    * whether the read-in value is applied to primary and 
    * secondary (MPI) scatters or just the primary one, with
    * the usual computation of the veto being performed for
    * the secondary (MPI) scatters.
    */
   bool _hardVetoReadOption; 
 
   /**
    * rms intrinsic pT of Gaussian distribution
    */
   Energy _iptrms;
 
    /**
    * Proportion of inverse quadratic intrinsic pT distribution
    */
   double _beta;
 
   /**
    * Parameter for inverse quadratic: 2*Beta*Gamma/(sqr(Gamma)+sqr(intrinsicpT))
    */
   Energy _gamma;
 
   /**
    * Upper bound on intrinsic pT for inverse quadratic
    */
   Energy _iptmax;
 
   /**
    *  Limit the number of emissions for testing
    */
   unsigned int _limitEmissions;
   
   /**
    *  The progenitor of the current shower
    */
   ShowerProgenitorPtr _progenitor;
 
   /**
    *  Matrix element
    */
   HwMEBasePtr _hardme;
 
   /**
    *  Decayer
    */
   HwDecayerBasePtr _decayme;
 
   /**
    * The ShowerTree currently being showered
    */
   ShowerTreePtr _currenttree;
 
   /**
    *  The HardTree currently being showered
    */
   HardTreePtr _hardtree;
 
   /**
    *  Radiation enhancement factors for use with the veto algorithm
    *  if needed by the soft matrix element correction 
    */
   //@{
   /**
    *  Enhancement factor for initial-state radiation
    */
   double _initialenhance;
 
   /**
    *  Enhancement factor for final-state radiation
    */
   double _finalenhance;
   //@}
 
   /**
    *  The beam particle data for the current initial-state shower
    */
   Ptr<BeamParticleData>::const_pointer _beam;
 
   /**
    *  Storage of the intrinsic \f$p_t\f$ of the particles
    */
   map<tShowerProgenitorPtr,pair<Energy,double> > _intrinsic;
 
   /**
    * Vetoes
    */
   vector<ShowerVetoPtr> _vetoes;
 
   /**
+   *  Full Shower Vetoes
+   */
+  vector<FullShowerVetoPtr> _fullShowerVetoes;
+
+  /**
+   *  Number of iterations for reweighting
+   */
+  unsigned int _nReWeight;
+
+  /**
+   *  Whether or not we are reweighting
+   */
+  bool _reWeight;
+
+  /**
    *  number of IS emissions
    */
   unsigned int _nis;
 
   /**
    *  Number of FS emissions
    */
   unsigned int _nfs;
 
   /**
    *  The option for wqhich interactions to use
    */
   unsigned int interaction_;
 
   /**
    *  Interactions allowed in the shower
    */
   vector<ShowerInteraction::Type> interactions_;
 
  /**
    *  Truncated shower switch
    */
   bool _trunc_Mode;
   
   /**
    *  Count of the number of truncated emissions
    */
   unsigned int _truncEmissions;
 
   /**
    *  Mode for the hard emissions
    */
   int _hardEmissionMode;
 
   /**
    *  Option to include spin correlations
    */
   unsigned int _spinOpt;
 
   /**
    *  Option for the kernal for soft correlations
    */
   unsigned int _softOpt;
 
   /**
    *  Option for hard radiation in POWHEG events
    */
   bool _hardPOWHEG;
 
   /**
    * True, if Matchbox MC@NLO S-event
    */
   bool isMCatNLOSEvent;
 
   /**
    * True, if matchbox MC@NLO H-event
    */
   bool isMCatNLOHEvent;
 
   /**
    * True, if Matchbox Powheg S-event
    */
   bool isPowhegSEvent;
 
   /**
    * True, if matchbox Powheg H-event
    */
   bool isPowhegHEvent;
 
   /**
    * The shower approximation to provide the hard scale profile
    */
   Ptr<ShowerApproximation>::tptr theShowerApproximation;
 
   /**
    * The factorization scale factor.
    */
   double theFactorizationScaleFactor;
 
   /**
    * The renormalization scale factor.
    */
   double theRenormalizationScaleFactor;
 
   /**
    * True if no warnings about incorrect hard emission
    * mode setting have been issued yet
    */
   static bool _hardEmissionModeWarn;
 
   /**
    * True if no warnings about missing truncated shower 
    * have been issued yet
    */
   static bool _missingTruncWarn;
 
   /**
    * The relevant hard scale to be used in the profile scales
    */
   Energy muPt;
 
   /**
    *  Maximum number of emission attempts for FSR
    */
   unsigned int _maxTryFSR;
 
   /**
    *  Maximum number of failures for FSR generation
    */
   unsigned int _maxFailFSR;
 
   /**
    *  Failure fraction for FSR generation
    */
   double _fracFSR;
 
   /**
    *  Counter for number of FSR emissions
    */
   unsigned int _nFSR;
 
   /**
    *  Counter for the number of failed events due to FSR emissions
    */
   unsigned int _nFailedFSR;
 };
 
 }
 
 #endif /* HERWIG_Evolver_H */
diff --git a/Shower/Base/FullShowerVeto.cc b/Shower/Base/FullShowerVeto.cc
new file mode 100644
--- /dev/null
+++ b/Shower/Base/FullShowerVeto.cc
@@ -0,0 +1,158 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the FullShowerVeto class.
+//
+
+#include "FullShowerVeto.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Interface/Switch.h"
+#include "ThePEG/EventRecord/Particle.h"
+#include "ThePEG/Repository/UseRandom.h"
+#include "ThePEG/Repository/EventGenerator.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "Herwig/Shower/ShowerHandler.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+void FullShowerVeto::persistentOutput(PersistentOStream & os) const {
+  os << type_ << behaviour_;
+}
+
+void FullShowerVeto::persistentInput(PersistentIStream & is, int) {
+  is >> type_ >> behaviour_;
+}
+
+void FullShowerVeto::doinit() {
+  Interfaced::doinit();
+  // check reweighting
+  if(behaviour_==1&&type_!=2)
+    throw Exception() << "Reweighting in the FullShowerVeto is only"
+		      << " supported for the primary hard process\n"
+		      << Exception::runerror;
+}
+
+DescribeAbstractClass<FullShowerVeto,Interfaced>
+describeHerwigFullShowerVeto("Herwig::FullShowerVeto", "HwShower.so");
+
+void FullShowerVeto::Init() {
+
+  static ClassDocumentation<FullShowerVeto> documentation
+    ("The FullShowerVeto class allows the parton shower generated from a configuration to be vetoed.");
+
+  static Switch<FullShowerVeto,unsigned int> interfaceType
+    ("Type",
+     "Which type of processes to consider",
+     &FullShowerVeto::type_, 1, false, false);
+  static SwitchOption interfaceTypeAll
+    (interfaceType,
+     "All",
+     "All Processes",
+     0);
+  static SwitchOption interfaceTypeScattering
+    (interfaceType,
+     "Scattering",
+     "Only apply to scattering processes and not decays",
+     1);
+  static SwitchOption interfaceTypePrimary
+    (interfaceType,
+     "Primary",
+     "Only apply to the primary scattering process",
+     2);
+  static SwitchOption interfaceTypeDecay
+    (interfaceType,
+     "Decay",
+     "Only apply to decays",
+     3);
+
+  static Switch<FullShowerVeto,unsigned int> interfaceBehaviour
+    ("Behaviour",
+     "What to do if the shower if vetoed",
+     &FullShowerVeto::behaviour_, 0, false, false);
+  static SwitchOption interfaceBehaviourShower
+    (interfaceBehaviour,
+     "Shower",
+     "Veto the shower and try showering the process again",
+     0);
+  static SwitchOption interfaceBehaviourShowerReweight
+    (interfaceBehaviour,
+     "ShowerReweight",
+     "Veto the shower and reweight the event to take this into account, only supported for the primary process",
+     1);
+  static SwitchOption interfaceBehaviourEvent
+    (interfaceBehaviour,
+     "Event",
+     "Veto the event, cross section automatically reweigted",
+     2);
+
+}
+
+int FullShowerVeto::applyVeto(ShowerTreePtr tree) {
+  // return if veto should not be calculated
+  // decay process and only doing hard processes
+  // or vice versa
+  if(((type_ == 1 || type_ ==2 ) && tree->isDecay() ) ||
+     ( type_ == 3                && tree->isHard()))
+    return -1;
+  // not primary process and only doing those
+  if( type_ == 2 && !ShowerHandler::currentHandler()->firstInteraction() )
+     return -1;
+  // extract the incoming and outgoing particles from the ShowerTree
+  finalState_.clear();
+  incoming_.clear();
+  outgoing_.clear();
+  // incoming
+  for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator it=tree->incomingLines().begin();
+      it!=tree->incomingLines().end();++it) {
+    incoming_.push_back(it->first->progenitor());
+  }
+  // outgoing
+  for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator it=tree->outgoingLines().begin();
+      it!=tree->outgoingLines().end();++it) {
+    outgoing_.push_back(it->first->progenitor());
+  }
+  // call function in inheriting class to decide what to do
+  bool vetoed = vetoShower();
+  // clear storage
+  finalState_.clear();
+  incoming_.clear();
+  outgoing_.clear();
+  // return the answer
+  return vetoed ? behaviour_ : -1;
+}
+
+namespace {
+
+void addFinal(vector<tPPtr> & finalState, tPPtr particle) {
+  if(particle->children().empty()) {
+    finalState.push_back(particle);
+    return;
+  }
+  for(unsigned int ix=0;ix<particle->children().size();++ix) {
+    addFinal(finalState,particle->children()[ix]);
+  }
+}
+}
+
+
+// extract the incoming and outgoing particles
+const vector<tPPtr> & FullShowerVeto::finalState() {
+  if(!finalState_.empty()) return finalState_;
+  // incoming
+  for(unsigned int ix=0;ix<incoming_.size();++ix) {
+    if(incoming_[ix]->parents().empty()) continue;
+    tPPtr parent = incoming_[ix]->parents()[0];
+    while (parent) {
+      addFinal(finalState_,parent->children()[1]);
+      if(parent->parents().empty()) break;
+      parent = parent->parents()[0];
+    }
+  }
+  // outgoing
+  for(unsigned int ix=0;ix<outgoing_.size();++ix) {
+    addFinal(finalState_,outgoing_[ix]);
+  } 
+  return finalState_;
+}
diff --git a/Shower/Base/FullShowerVeto.fh b/Shower/Base/FullShowerVeto.fh
new file mode 100644
--- /dev/null
+++ b/Shower/Base/FullShowerVeto.fh
@@ -0,0 +1,21 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the FullShowerVeto class.
+//
+#ifndef Herwig_FullShowerVeto_FH
+#define Herwig_FullShowerVeto_FH
+
+#include "ThePEG/Config/ThePEG.h"
+
+namespace Herwig {
+
+class FullShowerVeto;
+
+}
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::FullShowerVeto,FullShowerVetoPtr);
+
+}
+
+#endif
diff --git a/Shower/Base/FullShowerVeto.h b/Shower/Base/FullShowerVeto.h
new file mode 100644
--- /dev/null
+++ b/Shower/Base/FullShowerVeto.h
@@ -0,0 +1,155 @@
+// -*- C++ -*-
+#ifndef Herwig_FullShowerVeto_H
+#define Herwig_FullShowerVeto_H
+//
+// This is the declaration of the FullShowerVeto class.
+//
+
+#include "ThePEG/Interface/Interfaced.h"
+#include "FullShowerVeto.fh"
+#include "ShowerTree.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * Here is the documentation of the FullShowerVeto class.
+ *
+ * @see \ref FullShowerVetoInterfaces "The interfaces"
+ * defined for FullShowerVeto.
+ */
+class FullShowerVeto: public Interfaced {
+
+public:
+
+  /**
+   * The default constructor.
+   */
+  FullShowerVeto() : type_(1), behaviour_(0) {}
+
+  /**
+   *   Apply the veto
+   */
+  int applyVeto(ShowerTreePtr); 
+
+  /**
+   *  Which type of processes to consider
+   */
+  unsigned int type() const {return type_;}
+
+  /**
+   *  What to do if the event is vetoed
+   */
+  unsigned int behaviour() const {return behaviour_;}
+
+protected:
+
+  /**
+   *  Determine whether to not to veto the shower, to be implemented in inheriting classes
+   */
+  virtual bool vetoShower() = 0;
+
+  /**
+   *  Incoming particles to the hard process
+   */
+  const vector<tPPtr> & incoming() {return incoming_;}
+
+  /**
+   *  Outgoing particles from the hard process
+   */
+  const vector<tPPtr> & outgoing() {return outgoing_;}
+
+  /**
+   *  The final-state particles at the end of the shower
+   */
+  const vector<tPPtr> & finalState();
+
+
+public:
+
+  /** @name Functions used by the persistent I/O system. */
+  //@{
+  /**
+   * Function used to write out object persistently.
+   * @param os the persistent output stream written to.
+   */
+  void persistentOutput(PersistentOStream & os) const;
+
+  /**
+   * Function used to read in object persistently.
+   * @param is the persistent input stream read from.
+   * @param version the version number of the object when written.
+   */
+  void persistentInput(PersistentIStream & is, int version);
+  //@}
+
+  /**
+   * The standard Init function used to initialize the interfaces.
+   * Called exactly once for each class by the class description system
+   * before the main function starts or
+   * when this class is dynamically loaded.
+   */
+  static void Init();
+
+protected:
+
+  /** @name Standard Interfaced functions. */
+  //@{
+  /**
+   * Initialize this object after the setup phase before saving an
+   * EventGenerator to disk.
+   * @throws InitException if object could not be initialized properly.
+   */
+  virtual void doinit();
+  //@}
+
+private:
+
+  /**
+   * The assignment operator is private and must never be called.
+   * In fact, it should not even be implemented.
+   */
+  FullShowerVeto & operator=(const FullShowerVeto &);
+
+private:
+
+  /**
+   *  Switches
+   */
+  //@{
+  /**
+   *  Which type of processes to consider
+   */
+  unsigned int type_;
+
+  /**
+   *  What to do if the event is vetoed
+   */
+  unsigned int behaviour_;
+  //}
+
+  /**
+   *  Temporary storage
+   */
+  //@{
+  /**
+   *  Incoming to hard process
+   */
+  vector<tPPtr> incoming_;
+
+  /**
+   *  Outgoing from the hard process
+   */
+  vector<tPPtr> outgoing_;
+
+  /**
+   *  Final State particles
+   */
+  vector<tPPtr> finalState_;
+  //@}
+};
+
+}
+
+#endif /* Herwig_FullShowerVeto_H */
diff --git a/Shower/Default/QTildeSudakov.cc b/Shower/Default/QTildeSudakov.cc
--- a/Shower/Default/QTildeSudakov.cc
+++ b/Shower/Default/QTildeSudakov.cc
@@ -1,1123 +1,1123 @@
 // -*- C++ -*-
 //
 // QTildeSudakov.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
 // Copyright (C) 2002-2011 The Herwig Collaboration
 //
 // Herwig is licenced under version 2 of the GPL, see COPYING for details.
 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
 //
 //
 // This is the implementation of the non-inlined, non-templated member
 // functions of the QTildeSudakov class.
 //
 
 #include "QTildeSudakov.h"
 #include "ThePEG/Interface/ClassDocumentation.h"
 #include "ThePEG/Interface/Parameter.h"
 #include "ThePEG/Interface/Switch.h"
 #include "ThePEG/PDT/ParticleData.h"
 #include "ThePEG/EventRecord/Event.h"
 #include "ThePEG/Repository/EventGenerator.h"
 #include "ThePEG/Repository/CurrentGenerator.h"
 #include "ThePEG/PDT/EnumParticles.h"
 #include "Herwig/Shower/Default/FS_QTildeShowerKinematics1to2.h"
 #include "Herwig/Shower/Default/IS_QTildeShowerKinematics1to2.h"
 #include "Herwig/Shower/Default/Decay_QTildeShowerKinematics1to2.h"
 #include "ThePEG/Utilities/DescribeClass.h"
 #include "Herwig/Shower/Base/ShowerVertex.h"
 #include "Herwig/Shower/Base/ShowerParticle.h"
 #include "Herwig/Shower/ShowerHandler.h"
 #include "Herwig/Shower/Base/Evolver.h"
 #include "Herwig/Shower/Base/PartnerFinder.h"
 #include "Herwig/Shower/Base/ShowerModel.h"
 #include "Herwig/Shower/Base/KinematicsReconstructor.h"
 
 using namespace Herwig;
 
 DescribeNoPIOClass<QTildeSudakov,Herwig::SudakovFormFactor>
 describeQTildeSudakov ("Herwig::QTildeSudakov","HwShower.so");
 
 void QTildeSudakov::Init() {
 
   static ClassDocumentation<QTildeSudakov> documentation
     ("The QTildeSudakov class implements the Sudakov form factor for ordering it"
      " qtilde");
 }
 
 bool QTildeSudakov::guessTimeLike(Energy2 &t,Energy2 tmin,double enhance,
 				  const double & detune) {
   Energy2 told = t;
   // calculate limits on z and if lower>upper return
   if(!computeTimeLikeLimits(t)) return false;
   // guess values of t and z
   t = guesst(told,0,ids_,enhance,ids_[1]==ids_[2],detune);
   z(guessz(0,ids_)); 
   // actual values for z-limits
   if(!computeTimeLikeLimits(t)) return false;
   if(t<tmin) {
     t=-1.0*GeV2;
     return false;
   }
   else
     return true; 
 } 
 
 bool QTildeSudakov::guessSpaceLike(Energy2 &t, Energy2 tmin, const double x,
 				   double enhance,
 				   const double & detune) {
   Energy2 told = t;
   // calculate limits on z if lower>upper return
   if(!computeSpaceLikeLimits(t,x)) return false;
   // guess values of t and z
   t = guesst(told,1,ids_,enhance,ids_[1]==ids_[2],detune); 
   z(guessz(1,ids_)); 
   // actual values for z-limits
   if(!computeSpaceLikeLimits(t,x)) return false;
   if(t<tmin) {
     t=-1.0*GeV2;
     return false;
   }
   else
     return true; 
 } 
 
 bool QTildeSudakov::PSVeto(const Energy2 t,
 			   const Energy2 maxQ2) {
   // still inside PS, return true if outside
   // check vs overestimated limits
   if(z() < zLimits().first || z() > zLimits().second) return true;
   Energy2 q2 = z()*(1.-z())*t;
   if(ids_[0]!=ParticleID::g &&
      ids_[0]!=ParticleID::gamma ) q2 += masssquared_[0];
   if(q2>maxQ2) return true;
   // compute the pts
   Energy2 pt2 = z()*(1.-z())*q2 - masssquared_[1]*(1.-z()) - masssquared_[2]*z();
   // if pt2<0 veto
   if(pt2<pT2min()) return true;
   // otherwise calculate pt and return
   pT(sqrt(pt2));
   return false;
 }
 
 
  
 ShoKinPtr QTildeSudakov::generateNextTimeBranching(const Energy startingScale,
 						   const IdList &ids,const bool cc,
 						   double enhance,
 						   double detuning,
                					   Energy2 maxQ2) {
   // First reset the internal kinematics variables that can
   // have been eventually set in the previous call to the method.
   q_ = ZERO;
   z(0.);
   phi(0.); 
   // perform initialization
   Energy2 tmax(sqr(startingScale)),tmin;
   initialize(ids,tmin,cc);
   // check max > min
   if(tmax<=tmin) return ShoKinPtr();
   // calculate next value of t using veto algorithm
   Energy2 t(tmax);
 
   bool calcVariations=!ShowerHandler::currentHandler()->showerVariations().empty();
 
   if(!calcVariations){
     // Without variations do the usual Veto algorithm
     // No need for more if-statements in this loop.
     do {
       if(!guessTimeLike(t,tmin,enhance,detuning)) break;
     }
     while(PSVeto(t,maxQ2) ||
         SplittingFnVeto(z()*(1.-z())*t,ids,true,detuning) || 
         alphaSVeto(splittingFn()->angularOrdered() ? sqr(z()*(1.-z()))*t : z()*(1.-z())*t));
   }else{
     bool alphaRew(true),PSRew(true),SplitRew(true);
     do {
       if(!guessTimeLike(t,tmin,enhance,detuning)) break;
       PSRew=PSVeto(t,maxQ2);
       if (PSRew) continue;
       SplitRew=SplittingFnVeto(z()*(1.-z())*t,ids,true,detuning);
       alphaRew=alphaSVeto(splittingFn()->angularOrdered() ? sqr(z()*(1.-z()))*t : z()*(1.-z())*t);
       double factor=alphaSVetoRatio(splittingFn()->angularOrdered() ? sqr(z()*(1.-z()))*t : z()*(1.-z())*t,1.)*
                     SplittingFnVetoRatio(z()*(1.-z())*t,ids,true,detuning);
 
       ShowerHandlerPtr ch = ShowerHandler::currentHandler();
 
       if( !(SplitRew || alphaRew) ) {
         //Emission
         q_ = t > ZERO ? Energy(sqrt(t)) : -1.*MeV;
         if (q_ <= ZERO) break;
       }
 
         for ( map<string,ShowerHandler::ShowerVariation>::const_iterator var =
 	          ch->showerVariations().begin();
 	          var != ch->showerVariations().end(); ++var ) {
           if ( ( ch->firstInteraction() && var->second.firstInteraction ) ||
 	           ( !ch->firstInteraction() && var->second.secondaryInteractions ) ) {
 
                 double newfactor = alphaSVetoRatio(splittingFn()->angularOrdered() ?
                                         sqr(z()*(1.-z()))*t :
                                         z()*(1.-z())*t,var->second.renormalizationScaleFactor)
 		  * SplittingFnVetoRatio(z()*(1.-z())*t,ids,true,detuning);
 
                 double varied;
                 if ( SplitRew || alphaRew ) {
                   // No Emission
                   varied = (1. - newfactor) / (1. - factor);
                 } else {
                   // Emission
                   varied = newfactor / factor;
                 }
 
                 map<string,double>::iterator wi = ch->currentWeights().find(var->first);
 	        if ( wi != ch->currentWeights().end() )
 	          wi->second *= varied;
 	        else {
                   assert(false);
                   //ch->currentWeights()[var->first] = varied;
                 }
 	  }
         }
       
     }
     while(PSRew || SplitRew || alphaRew);
   }
 
   
   q_ = t > ZERO ? Energy(sqrt(t)) : -1.*MeV;
   if(q_ < ZERO) return ShoKinPtr();
   
   // return the ShowerKinematics object
   return createFinalStateBranching(q_,z(),phi(),pT()); 
 }
 
 ShoKinPtr QTildeSudakov::
 generateNextSpaceBranching(const Energy startingQ,
 			   const IdList &ids,
 			   double x,bool cc,
 			   double enhance,
 			   Ptr<BeamParticleData>::transient_const_pointer beam,
 			   double detuning) {
   // First reset the internal kinematics variables that can
   // have been eventually set in the previous call to the method.
   q_ = ZERO;
   z(0.);
   phi(0.);
   // perform the initialization
   Energy2 tmax(sqr(startingQ)),tmin;
   initialize(ids,tmin,cc);
   // check max > min
   if(tmax<=tmin) return ShoKinPtr();
   // extract the partons which are needed for the PDF veto
   // Different order, incoming parton is id =  1, outgoing are id=0,2
   tcPDPtr parton0 = getParticleData(ids[0]);
   tcPDPtr parton1 = getParticleData(ids[1]);
   if(cc) {
     if(parton0->CC()) parton0 = parton0->CC();
     if(parton1->CC()) parton1 = parton1->CC();
   } 
   // calculate next value of t using veto algorithm
   Energy2 t(tmax),pt2(ZERO);
 
 
 
 
 
   bool calcVariations=!ShowerHandler::currentHandler()->showerVariations().empty();
 
   if(!calcVariations){
     // Without variations do the usual Veto algorithm
     // No need for more if-statements in this loop.
     do {
       if(!guessSpaceLike(t,tmin,x,enhance,detuning)) break;
       pt2=sqr(1.-z())*t-z()*masssquared_[2];
     }
     while(pt2 < pT2min()||
         z() > zLimits().second||
-	  SplittingFnVeto((1.-z())*t/z(),ids,true,detuning)||
+	  SplittingFnVeto((1.-z())*t/z(),ids,false,detuning)||
         alphaSVeto(splittingFn()->angularOrdered() ? sqr(1.-z())*t : (1.-z())*t)||
         PDFVeto(t,x,parton0,parton1,beam));
   }else{
     bool alphaRew(true),PDFRew(true),ptRew(true),zRew(true),SplitRew(true);
     do {
       if(!guessSpaceLike(t,tmin,x,enhance,detuning)) break;
       pt2=sqr(1.-z())*t-z()*masssquared_[2];
       ptRew=pt2 < pT2min();
       zRew=z() > zLimits().second;
       if (ptRew||zRew) continue;
-      SplitRew=SplittingFnVeto((1.-z())*t/z(),ids,true,detuning);
+      SplitRew=SplittingFnVeto((1.-z())*t/z(),ids,false,detuning);
       alphaRew=alphaSVeto(splittingFn()->angularOrdered() ? sqr(1.-z())*t : (1.-z())*t);
       PDFRew=PDFVeto(t,x,parton0,parton1,beam);
       double factor=PDFVetoRatio(t,x,parton0,parton1,beam,1.)*
                     alphaSVetoRatio(splittingFn()->angularOrdered() ? sqr(1.-z())*t : (1.-z())*t,1.)*
-	SplittingFnVetoRatio((1.-z())*t/z(),ids,true,detuning);
+	SplittingFnVetoRatio((1.-z())*t/z(),ids,false,detuning);
 
       ShowerHandlerPtr ch = ShowerHandler::currentHandler();
 
       if( !(PDFRew || SplitRew || alphaRew) ) {
         //Emission
         q_ = t > ZERO ? Energy(sqrt(t)) : -1.*MeV;
         if (q_ <= ZERO) break;
       }
 
         for ( map<string,ShowerHandler::ShowerVariation>::const_iterator var =
 	          ch->showerVariations().begin();
 	          var != ch->showerVariations().end(); ++var ) {
           if ( ( ch->firstInteraction() && var->second.firstInteraction ) ||
 	           ( !ch->firstInteraction() && var->second.secondaryInteractions ) ) {
 
 
 
             double newfactor = PDFVetoRatio(t,x,parton0,parton1,beam,var->second.factorizationScaleFactor)*
                            alphaSVetoRatio(splittingFn()->angularOrdered() ?
                            sqr(1.-z())*t : (1.-z())*t,var->second.renormalizationScaleFactor)
-	      *SplittingFnVetoRatio((1.-z())*t/z(),ids,true,detuning);
+	      *SplittingFnVetoRatio((1.-z())*t/z(),ids,false,detuning);
 
             double varied;
             if( PDFRew || SplitRew || alphaRew) {
                 // No Emission
                 varied = (1. - newfactor) / (1. - factor);
             } else {
                 // Emission
                 varied = newfactor / factor;
             }
 
 
             map<string,double>::iterator wi = ch->currentWeights().find(var->first);
             if ( wi != ch->currentWeights().end() )
 	          wi->second *= varied;
 	    else {
 	      assert(false);
 	      //ch->currentWeights()[var->first] = varied;
             }
 	  }
         }
       
     }
     while( PDFRew || SplitRew || alphaRew);
   }
   
   if(t > ZERO && zLimits().first < zLimits().second)  q_ = sqrt(t);
   else return ShoKinPtr();
   
   pT(sqrt(pt2));
   // create the ShowerKinematics and return it
   return createInitialStateBranching(q_,z(),phi(),pT());
 }
 
 void QTildeSudakov::initialize(const IdList & ids, Energy2 & tmin,const bool cc) {
   ids_=ids;
   if(cc) {
     for(unsigned int ix=0;ix<ids.size();++ix) {
       if(getParticleData(ids[ix])->CC()) ids_[ix]*=-1;
     }
   }
   tmin = cutOffOption() != 2 ? ZERO : 4.*pT2min();
   masses_ = virtualMasses(ids);
   masssquared_.clear();
   for(unsigned int ix=0;ix<masses_.size();++ix) {
     masssquared_.push_back(sqr(masses_[ix]));
     if(ix>0) tmin=max(masssquared_[ix],tmin);
   }
 }
 
 ShoKinPtr QTildeSudakov::generateNextDecayBranching(const Energy startingScale,
 						    const Energy stoppingScale,
 						    const Energy minmass,
 						    const IdList &ids,
 						    const bool cc, 
 						    double enhance,
 						    double detuning) {
   // First reset the internal kinematics variables that can
   // have been eventually set in the previous call to this method.
   q_ = Constants::MaxEnergy;
   z(0.);
   phi(0.); 
   // perform initialisation
   Energy2 tmax(sqr(stoppingScale)),tmin;
   initialize(ids,tmin,cc);
   tmin=sqr(startingScale);
   // check some branching possible
   if(tmax<=tmin) return ShoKinPtr();
   // perform the evolution
   Energy2 t(tmin),pt2(-MeV2);
   do {
     if(!guessDecay(t,tmax,minmass,enhance,detuning)) break;
     pt2 = sqr(1.-z())*(t-masssquared_[0])-z()*masssquared_[2];
   }
   while(SplittingFnVeto((1.-z())*t/z(),ids,true,detuning)|| 
 	alphaSVeto(splittingFn()->angularOrdered() ? sqr(1.-z())*t : (1.-z())*t ) ||
 	pt2<pT2min() ||
 	t*(1.-z())>masssquared_[0]-sqr(minmass));
   if(t > ZERO) {
     q_ = sqrt(t);
     pT(sqrt(pt2));
   }
   else return ShoKinPtr();
   phi(0.);
   // create the ShowerKinematics object
   return createDecayBranching(q_,z(),phi(),pT());
 }
 
 bool QTildeSudakov::guessDecay(Energy2 &t,Energy2 tmax, Energy minmass,
 			       double enhance, const double & detune) {
   // previous scale
   Energy2 told = t;
   // overestimated limits on z
   if(tmax<masssquared_[0]) {
     t=-1.0*GeV2;
     return false;
   }
   Energy2 tm2 = tmax-masssquared_[0];
   Energy tm  = sqrt(tm2); 
   pair<double,double> limits=make_pair(sqr(minmass/masses_[0]),
 				       1.-sqrt(masssquared_[2]+pT2min()+
 					       0.25*sqr(masssquared_[2])/tm2)/tm
 				       +0.5*masssquared_[2]/tm2);
   zLimits(limits);
   if(zLimits().second<zLimits().first) {
     t=-1.0*GeV2;
     return false;
   }
   // guess values of t and z
   t = guesst(told,2,ids_,enhance,ids_[1]==ids_[2],detune);
   z(guessz(2,ids_)); 
   // actual values for z-limits
   if(t<masssquared_[0])  {
     t=-1.0*GeV2;
     return false;
   }
   tm2 = t-masssquared_[0];
   tm  = sqrt(tm2); 
   limits=make_pair(sqr(minmass/masses_[0]),
 		   1.-sqrt(masssquared_[2]+pT2min()+
 			   0.25*sqr(masssquared_[2])/tm2)/tm
 		   +0.5*masssquared_[2]/tm2);
   zLimits(limits);
   if(t>tmax||zLimits().second<zLimits().first) {
     t=-1.0*GeV2;
     return false;
   }
   else
     return true; 
 } 
 
 bool QTildeSudakov::computeTimeLikeLimits(Energy2 & t) {
   if (t < 1e-20 * GeV2) {
     t=-1.*GeV2;
     return false;
   }
   // special case for gluon radiating
   pair<double,double> limits;
   if(ids_[0]==ParticleID::g||ids_[0]==ParticleID::gamma) {
     // no emission possible
     if(t<16.*(masssquared_[1]+pT2min())) {
       t=-1.*GeV2;
       return false;
     }
     // overestimate of the limits
     limits.first  = 0.5*(1.-sqrt(1.-4.*sqrt((masssquared_[1]+pT2min())/t)));
     limits.second = 1.-limits.first;
   }
   // special case for radiated particle is gluon 
   else if(ids_[2]==ParticleID::g||ids_[2]==ParticleID::gamma) {
     limits.first  =    sqrt((masssquared_[1]+pT2min())/t);
     limits.second = 1.-sqrt((masssquared_[2]+pT2min())/t);
   }
   else if(ids_[1]==ParticleID::g||ids_[1]==ParticleID::gamma) {
     limits.second  =    sqrt((masssquared_[2]+pT2min())/t);
     limits.first   = 1.-sqrt((masssquared_[1]+pT2min())/t);
   }
   else {
     limits.first  =    (masssquared_[1]+pT2min())/t;
     limits.second = 1.-(masssquared_[2]+pT2min())/t; 
   }
   if(limits.first>=limits.second) {
     t=-1.*GeV2;
     return false;
   }
   zLimits(limits);
   return true;
 }
 
 bool QTildeSudakov::computeSpaceLikeLimits(Energy2 & t, double x) {
   if (t < 1e-20 * GeV2) {
     t=-1.*GeV2;
     return false;
   }
   pair<double,double> limits;
   // compute the limits
   limits.first = x;
   double yy = 1.+0.5*masssquared_[2]/t;
   limits.second = yy - sqrt(sqr(yy)-1.+pT2min()/t); 
   // return false if lower>upper
   zLimits(limits);
   if(limits.second<limits.first) {
     t=-1.*GeV2;
     return false;
   }
   else
     return true;
 }
 
 namespace {
 
 tShowerParticlePtr findCorrelationPartner(ShowerParticle & particle,
 					  bool forward,
 					  ShowerInteraction::Type inter) {
   tPPtr child = &particle;
   tShowerParticlePtr mother;
   if(forward) {
     mother = !particle.parents().empty() ? 
       dynamic_ptr_cast<tShowerParticlePtr>(particle.parents()[0]) : tShowerParticlePtr();
   }
   else {
     mother = particle.children().size()==2 ?
       dynamic_ptr_cast<tShowerParticlePtr>(&particle) : tShowerParticlePtr();
   }
   tShowerParticlePtr partner;
   while(mother) {
     tPPtr otherChild;
     if(forward) {
       for (unsigned int ix=0;ix<mother->children().size();++ix) {
 	if(mother->children()[ix]!=child) {
 	  otherChild = mother->children()[ix];
 	  break;
 	}
       }
     }
     else {
       otherChild = mother->children()[1];
     }
     tShowerParticlePtr other = dynamic_ptr_cast<tShowerParticlePtr>(otherChild);
     if((inter==ShowerInteraction::QCD && otherChild->dataPtr()->coloured()) ||
        (inter==ShowerInteraction::QED && otherChild->dataPtr()->charged())) {
       partner = other;
       break;
     }
     if(forward && !other->isFinalState()) {
       partner = dynamic_ptr_cast<tShowerParticlePtr>(mother);
       break;
     }
     child = mother;
     if(forward) {
       mother = ! mother->parents().empty() ?
 	dynamic_ptr_cast<tShowerParticlePtr>(mother->parents()[0]) : tShowerParticlePtr();
     }
     else {
       if(mother->children()[0]->children().size()!=2)
 	break;
       tShowerParticlePtr mtemp = 
 	dynamic_ptr_cast<tShowerParticlePtr>(mother->children()[0]);
       if(!mtemp)
 	break;
       else
 	mother=mtemp;
     }
   }
   if(!partner) {
     if(forward) {
       partner = dynamic_ptr_cast<tShowerParticlePtr>( child)->partner();
     }
     else {
       if(mother) {
 	tShowerParticlePtr parent;
 	if(!mother->children().empty()) {
 	  parent = dynamic_ptr_cast<tShowerParticlePtr>(mother->children()[0]);
 	}
 	if(!parent) {
 	  parent = dynamic_ptr_cast<tShowerParticlePtr>(mother);
 	}
 	partner = parent->partner();
       }
       else {
 	partner = dynamic_ptr_cast<tShowerParticlePtr>(&particle)->partner();
       }
     }
   }
   return partner;
 }
 
 pair<double,double> softPhiMin(double phi0, double phi1, double A, double B, double C, double D) {
   double c01 = cos(phi0 - phi1);
   double s01 = sin(phi0 - phi1);
   double s012(sqr(s01)), c012(sqr(c01));
   double A2(A*A), B2(B*B), C2(C*C), D2(D*D);
   if(abs(B/A)<1e-10 && abs(D/C)<1e-10) return make_pair(phi0,phi0+Constants::pi);
   double root = sqr(B2)*C2*D2*sqr(s012) + 2.*A*B2*B*C2*C*D*c01*s012 + 2.*A*B2*B*C*D2*D*c01*s012
 		     + 4.*A2*B2*C2*D2*c012 - A2*B2*C2*D2*s012 - A2*B2*sqr(D2)*s012 - sqr(B2)*sqr(C2)*s012 
 		     - sqr(B2)*C2*D2*s012 - 4.*A2*A*B*C*D2*D*c01 - 4.*A*B2*B*C2*C*D*c01 + sqr(A2)*sqr(D2)
 		     + 2.*A2*B2*C2*D2 + sqr(B2)*sqr(C2);
   if(root<0.) return make_pair(phi0,phi0+Constants::pi);
   root = sqrt(root);
   double denom  = (-2.*A*B*C*D*c01 + A2*D2 + B2*C2);
   double denom2 = (-B*C*c01 + A*D);
   double num    = B2*C*D*s012;
   return make_pair(atan2(B*s01*(-C*(num + root) / denom + D) / denom2, -(num + root ) / denom) + phi0,
 		   atan2(B*s01*(-C*(num - root) / denom + D) / denom2, -(num - root ) / denom) + phi0);
 }
 
 }
 
 double QTildeSudakov::generatePhiForward(ShowerParticle & particle,
 					 const IdList & ids,
 					 ShoKinPtr kinematics) {
   // no correlations, return flat phi
   if(! ShowerHandler::currentHandler()->evolver()->correlations())
     return Constants::twopi*UseRandom::rnd();
   // get the kinematic variables
   double  z = kinematics->z();
   Energy2 t = z*(1.-z)*sqr(kinematics->scale());
   Energy pT = kinematics->pT();
   // if soft correlations
   Energy2 pipj,pik;
   bool canBeSoft[2] = {ids[1]==ParticleID::g || ids[1]==ParticleID::gamma,
 		       ids[2]==ParticleID::g || ids[2]==ParticleID::gamma };
   vector<Energy2> pjk(3,ZERO);
   vector<Energy> Ek(3,ZERO);
   Energy Ei,Ej;
   Energy2 m12(ZERO),m22(ZERO);
   InvEnergy2 aziMax(ZERO);
   bool softAllowed = ShowerHandler::currentHandler()->evolver()->softCorrelations()&&
     (canBeSoft[0] || canBeSoft[1]);
   if(softAllowed) {
     // find the partner for the soft correlations
     tShowerParticlePtr partner=findCorrelationPartner(particle,true,splittingFn()->interactionType());
     // remember we want the softer gluon 
     bool swapOrder = !canBeSoft[1] || (canBeSoft[0] && canBeSoft[1] && z < 0.5);
     double zFact = !swapOrder ? (1.-z) : z;
     // compute the transforms to the shower reference frame
     // first the boost
     vector<Lorentz5Momentum> basis = kinematics->getBasis();
     Lorentz5Momentum pVect = basis[0], nVect = basis[1];
     Boost beta_bb;
     if(kinematics->frame()==ShowerKinematics::BackToBack) {
       beta_bb = -(pVect + nVect).boostVector();
     }
     else if(kinematics->frame()==ShowerKinematics::Rest) {
       beta_bb = -pVect.boostVector();
     }
     else
       assert(false);
     pVect.boost(beta_bb);
     nVect.boost(beta_bb);
     Axis axis;
     if(kinematics->frame()==ShowerKinematics::BackToBack) {
       axis = pVect.vect().unit();
     }
     else if(kinematics->frame()==ShowerKinematics::Rest) {
       axis = nVect.vect().unit();
     }
     else
       assert(false);
     // and then the rotation
     LorentzRotation rot;
     if(axis.perp2()>0.) {
       double sinth(sqrt(sqr(axis.x())+sqr(axis.y())));
       rot.rotate(acos(axis.z()),Axis(-axis.y()/sinth,axis.x()/sinth,0.));
     }
     else if(axis.z()<0.) {
       rot.rotate(Constants::pi,Axis(1.,0.,0.));
     }
     rot.invert();
     pVect *= rot;
     nVect *= rot;
     // shower parameters
     Energy2 pn = pVect*nVect, m2 = pVect.m2();
     double alpha0 = particle.showerParameters().alpha;
     double  beta0 = 0.5/alpha0/pn*
       (sqr(particle.dataPtr()->mass())-sqr(alpha0)*m2+sqr(particle.showerParameters().pt));
     Lorentz5Momentum qperp0(particle.showerParameters().ptx,
 			    particle.showerParameters().pty,ZERO,ZERO);
     assert(partner);
     Lorentz5Momentum pj = partner->momentum();
     pj.boost(beta_bb);
     pj *= rot;
     // compute the two phi independent dot products
     pik = 0.5*zFact*(sqr(alpha0)*m2 - sqr(particle.showerParameters().pt) + 2.*alpha0*beta0*pn )
       +0.5*sqr(pT)/zFact;
     Energy2 dot1 = pj*pVect;
     Energy2 dot2 = pj*nVect;
     Energy2 dot3 = pj*qperp0;
     pipj = alpha0*dot1+beta0*dot2+dot3;
     // compute the constants for the phi dependent dot product
     pjk[0] = zFact*(alpha0*dot1+dot3-0.5*dot2/pn*(alpha0*m2-sqr(particle.showerParameters().pt)/alpha0))
       +0.5*sqr(pT)*dot2/pn/zFact/alpha0;
     pjk[1] = (pj.x() - dot2/alpha0/pn*qperp0.x())*pT;
     pjk[2] = (pj.y() - dot2/alpha0/pn*qperp0.y())*pT;
     m12 = sqr(particle.dataPtr()->mass());
     m22 = sqr(partner->dataPtr()->mass());
     if(swapOrder) {
       pjk[1] *= -1.;
       pjk[2] *= -1.;
     }
     Ek[0] = zFact*(alpha0*pVect.t()-0.5*nVect.t()/pn*(alpha0*m2-sqr(particle.showerParameters().pt)/alpha0))
       +0.5*sqr(pT)*nVect.t()/pn/zFact/alpha0;
     Ek[1] = -nVect.t()/alpha0/pn*qperp0.x()*pT;
     Ek[2] = -nVect.t()/alpha0/pn*qperp0.y()*pT;
     if(swapOrder) {
       Ek[1] *= -1.;
       Ek[2] *= -1.;
     }
     Energy mag2=sqrt(sqr(Ek[1])+sqr(Ek[2]));
     Ei = alpha0*pVect.t()+beta0*nVect.t();
     Ej = pj.t();
     double phi0 = atan2(-pjk[2],-pjk[1]);
     if(phi0<0.) phi0 += Constants::twopi;
     double phi1 = atan2(-Ek[2],-Ek[1]);
     if(phi1<0.) phi1 += Constants::twopi;
     double xi_min = pik/Ei/(Ek[0]+mag2), xi_max = pik/Ei/(Ek[0]-mag2), xi_ij = pipj/Ei/Ej;
     if(xi_min>xi_max) swap(xi_min,xi_max);
     if(xi_min>xi_ij) softAllowed = false;
     Energy2 mag = sqrt(sqr(pjk[1])+sqr(pjk[2]));
     if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==1) {
       aziMax = -m12/sqr(pik) -m22/sqr(pjk[0]+mag) +2.*pipj/pik/(pjk[0]-mag);
     }
     else if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==2) {
       double A = (pipj*Ek[0]- Ej*pik)/Ej/sqr(Ej);
       double B = -sqrt(sqr(pipj)*(sqr(Ek[1])+sqr(Ek[2])))/Ej/sqr(Ej);
       double C = pjk[0]/sqr(Ej);
       double D = -sqrt(sqr(pjk[1])+sqr(pjk[2]))/sqr(Ej);
       pair<double,double> minima = softPhiMin(phi0,phi1,A,B,C,D);
       aziMax = 0.5/pik/(Ek[0]-mag2)*(Ei-m12*(Ek[0]-mag2)/pik  + max(Ej*(A+B*cos(minima.first -phi1))/(C+D*cos(minima.first -phi0)),
 								    Ej*(A+B*cos(minima.second-phi1))/(C+D*cos(minima.second-phi0))));
     }
     else
       assert(false);
   }
   // if spin correlations
   vector<pair<int,Complex> > wgts;     
   if(ShowerHandler::currentHandler()->evolver()->spinCorrelations()) {
     // get the spin density matrix and the mapping
     RhoDMatrix mapping;
     SpinPtr inspin;
     bool needMapping = getMapping(inspin,mapping,particle,kinematics);
     // set the decayed flag
     inspin->decay();
     // get the spin density matrix
     RhoDMatrix rho=inspin->rhoMatrix();
     // map to the shower basis if needed
     if(needMapping) {
       RhoDMatrix rhop(rho.iSpin(),false);
       for(int ixa=0;ixa<rho.iSpin();++ixa) {
 	for(int ixb=0;ixb<rho.iSpin();++ixb) {
 	  for(int iya=0;iya<rho.iSpin();++iya) {
 	    for(int iyb=0;iyb<rho.iSpin();++iyb) {
 	      rhop(ixa,ixb) += rho(iya,iyb)*mapping(iya,ixa)*conj(mapping(iyb,ixb));
 	    }
 	  }
 	}
       }
       rhop.normalize();
       rho = rhop;
     }
     // calculate the weights
     wgts = splittingFn()->generatePhiForward(z,t,ids,rho);
   }
   else {
     wgts = vector<pair<int,Complex> >(1,make_pair(0,1.));
   }
   // generate the azimuthal angle
   double phi,wgt;
   static const Complex ii(0.,1.);
   unsigned int ntry(0);
   double phiMax(0.),wgtMax(0.);
   do {
     phi = Constants::twopi*UseRandom::rnd();
     // first the spin correlations bit (gives 1 if correlations off)
     Complex spinWgt = 0.;
     for(unsigned int ix=0;ix<wgts.size();++ix) {
       if(wgts[ix].first==0)
   	spinWgt += wgts[ix].second;
       else
   	spinWgt += exp(double(wgts[ix].first)*ii*phi)*wgts[ix].second;
     }
     wgt = spinWgt.real();
     if(wgt-1.>1e-10) {
       generator()->log() << "Forward spin weight problem " << wgt << " " << wgt-1. 
   	   << " " << ids[0] << " " << ids[1] << " " << ids[2] << " " << " " << phi << "\n";
       generator()->log() << "Weights \n";
       for(unsigned int ix=0;ix<wgts.size();++ix)
 	generator()->log() << wgts[ix].first << " " << wgts[ix].second << "\n";
     }
     // soft correlations bit
     double aziWgt = 1.;
     if(softAllowed) {
       Energy2 dot = pjk[0]+pjk[1]*cos(phi)+pjk[2]*sin(phi);
       Energy  Eg  = Ek[0]+Ek[1]*cos(phi)+Ek[2]*sin(phi);
       if(pipj*Eg>pik*Ej) {
 	if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==1) {
 	  aziWgt = (-m12/sqr(pik) -m22/sqr(dot) +2.*pipj/pik/dot)/aziMax;
 	}
 	else if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==2) {
 	  aziWgt = max(ZERO,0.5/pik/Eg*(Ei-m12*Eg/pik  + (pipj*Eg - Ej*pik)/dot)/aziMax);
 	}
 	if(aziWgt-1.>1e-10||aziWgt<-1e-10) {
 	  generator()->log() << "Forward soft weight problem " << aziWgt << " " << aziWgt-1. 
 			     << " " << ids[0] << " " << ids[1] << " " << ids[2] << " " << " " << phi << "\n";
 	}
       }
       else {
 	aziWgt = 0.;
       }
     }
     wgt *= aziWgt;
     if(wgt>wgtMax) {
       phiMax = phi;
       wgtMax = wgt;
     }
     ++ntry;
   }
   while(wgt<UseRandom::rnd()&&ntry<10000);
   if(ntry==10000) {
     generator()->log() << "Too many tries to generate phi in forward evolution\n";
     phi = phiMax;
   }
   // return the azimuthal angle
   return phi;
 }
 
 double QTildeSudakov::generatePhiBackward(ShowerParticle & particle,
 					  const IdList & ids,
 					  ShoKinPtr kinematics) {
   // no correlations, return flat phi
   if(! ShowerHandler::currentHandler()->evolver()->correlations())
     return Constants::twopi*UseRandom::rnd();
   // get the kinematic variables
   double z = kinematics->z();
   Energy2 t = (1.-z)*sqr(kinematics->scale())/z;
   Energy pT = kinematics->pT();
   // if soft correlations 
   bool softAllowed = ShowerHandler::currentHandler()->evolver()->softCorrelations() &&
     (ids[2]==ParticleID::g || ids[2]==ParticleID::gamma);
   Energy2 pipj,pik,m12(ZERO),m22(ZERO);
   vector<Energy2> pjk(3,ZERO);
   Energy Ei,Ej,Ek;
   InvEnergy2 aziMax(ZERO);
   if(softAllowed) {
     // find the partner for the soft correlations
     tShowerParticlePtr partner=findCorrelationPartner(particle,false,splittingFn()->interactionType());
     double zFact = (1.-z);
     // compute the transforms to the shower reference frame
     // first the boost
     vector<Lorentz5Momentum> basis = kinematics->getBasis();
     Lorentz5Momentum pVect = basis[0];
     Lorentz5Momentum nVect = basis[1];
     assert(kinematics->frame()==ShowerKinematics::BackToBack);
     Boost beta_bb = -(pVect + nVect).boostVector();
     pVect.boost(beta_bb);
     nVect.boost(beta_bb);
     Axis axis = pVect.vect().unit();
     // and then the rotation
     LorentzRotation rot;
     if(axis.perp2()>0.) {
       double sinth(sqrt(sqr(axis.x())+sqr(axis.y())));
       rot.rotate(acos(axis.z()),Axis(-axis.y()/sinth,axis.x()/sinth,0.));
     }
     else if(axis.z()<0.) {
       rot.rotate(Constants::pi,Axis(1.,0.,0.));
     }
     rot.invert();
     pVect *= rot;
     nVect *= rot;
     // shower parameters
     Energy2 pn = pVect*nVect;
     Energy2 m2 = pVect.m2();
     double alpha0 = particle.x();
     double  beta0 = -0.5/alpha0/pn*sqr(alpha0)*m2;
     Lorentz5Momentum pj = partner->momentum();
     pj.boost(beta_bb);
     pj *= rot;
     double beta2 = 0.5*(1.-zFact)*(sqr(alpha0*zFact/(1.-zFact))*m2+sqr(pT))/alpha0/zFact/pn; 
     // compute the two phi independent dot products
     Energy2 dot1 = pj*pVect;
     Energy2 dot2 = pj*nVect;
     pipj = alpha0*dot1+beta0*dot2;
     pik  = alpha0*(alpha0*zFact/(1.-zFact)*m2+pn*(beta2+zFact/(1.-zFact)*beta0));
     // compute the constants for the phi dependent dot product
     pjk[0] = alpha0*zFact/(1.-zFact)*dot1+beta2*dot2;
     pjk[1] = pj.x()*pT;
     pjk[2] = pj.y()*pT;
     m12 = ZERO;
     m22 = sqr(partner->dataPtr()->mass());
     Energy2 mag = sqrt(sqr(pjk[1])+sqr(pjk[2]));
     if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==1) {
       aziMax = -m12/sqr(pik) -m22/sqr(pjk[0]+mag) +2.*pipj/pik/(pjk[0]-mag);
     }
     else if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==2) {
       Ek = alpha0*zFact/(1.-zFact)*pVect.t()+beta2*nVect.t();
       Ei = alpha0*pVect.t()+beta0*nVect.t();
       Ej = pj.t();
       if(pipj*Ek> Ej*pik) {
 	aziMax = 0.5/pik/Ek*(Ei-m12*Ek/pik  + (pipj*Ek- Ej*pik)/(pjk[0]-mag));
       }
       else {
 	aziMax = 0.5/pik/Ek*(Ei-m12*Ek/pik);
       }
     }
     else {
       assert(ShowerHandler::currentHandler()->evolver()->softCorrelations()==0);
     }
   }
   // if spin correlations
   vector<pair<int,Complex> > wgts;
   if(ShowerHandler::currentHandler()->evolver()->spinCorrelations()) {
     // get the spin density matrix and the mapping
     RhoDMatrix mapping;
     SpinPtr inspin;
     bool needMapping = getMapping(inspin,mapping,particle,kinematics);
     // set the decayed flag (counterintuitive but going backward)
     inspin->decay();
     // get the spin density matrix
     RhoDMatrix rho=inspin->DMatrix();
     // map to the shower basis if needed
     if(needMapping) {
       RhoDMatrix rhop(rho.iSpin(),false);
       for(int ixa=0;ixa<rho.iSpin();++ixa) {
 	for(int ixb=0;ixb<rho.iSpin();++ixb) {
 	  for(int iya=0;iya<rho.iSpin();++iya) {
 	    for(int iyb=0;iyb<rho.iSpin();++iyb) {
 	      rhop(ixa,ixb) += rho(iya,iyb)*mapping(iya,ixa)*conj(mapping(iyb,ixb));
 	    }
 	  }
 	}
       }
       rhop.normalize();
       rho = rhop;
     }
     wgts = splittingFn()->generatePhiBackward(z,t,ids,rho);
   }
   else {
     wgts = vector<pair<int,Complex> >(1,make_pair(0,1.));
   }
   // generate the azimuthal angle
   double phi,wgt;
   static const Complex ii(0.,1.);
   unsigned int ntry(0);
   double phiMax(0.),wgtMax(0.);
   do {
     phi = Constants::twopi*UseRandom::rnd();
     Complex spinWgt = 0.;
     for(unsigned int ix=0;ix<wgts.size();++ix) {
       if(wgts[ix].first==0)
   	spinWgt += wgts[ix].second;
       else
   	spinWgt += exp(double(wgts[ix].first)*ii*phi)*wgts[ix].second;
     }
     wgt = spinWgt.real();
     if(wgt-1.>1e-10) {
       generator()->log() << "Backward weight problem " << wgt << " " << wgt-1. 
   	   << " " << ids[0] << " " << ids[1] << " " << ids[2] << " " << " " << z << " " << phi << "\n";
       generator()->log() << "Weights \n";
       for(unsigned int ix=0;ix<wgts.size();++ix)
   	generator()->log() << wgts[ix].first << " " << wgts[ix].second << "\n";
     }
     // soft correlations bit
     double aziWgt = 1.;
     if(softAllowed) {
       Energy2 dot = pjk[0]+pjk[1]*cos(phi)+pjk[2]*sin(phi);
       if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==1) {
 	aziWgt = (-m12/sqr(pik) -m22/sqr(dot) +2.*pipj/pik/dot)/aziMax;
       }
       else if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==2) {
 	aziWgt = max(ZERO,0.5/pik/Ek*(Ei-m12*Ek/pik  + pipj*Ek/dot - Ej*pik/dot)/aziMax);
       }
       if(aziWgt-1.>1e-10||aziWgt<-1e-10) {
  	generator()->log() << "Backward soft weight problem " << aziWgt << " " << aziWgt-1. 
  			   << " " << ids[0] << " " << ids[1] << " " << ids[2] << " " << " " << phi << "\n";
       }
     }
     wgt *= aziWgt;
     if(wgt>wgtMax) {
       phiMax = phi;
       wgtMax = wgt;
     }
     ++ntry;
   }
   while(wgt<UseRandom::rnd()&&ntry<10000);
   if(ntry==10000) {
     generator()->log() << "Too many tries to generate phi in backward evolution\n";
     phi = phiMax;
   }
   // return the azimuthal angle
   return phi;
 }
 
 double QTildeSudakov::generatePhiDecay(ShowerParticle & particle,
 				       const IdList & ids,
 				       ShoKinPtr kinematics) {
   // only soft correlations in this case
   // no correlations, return flat phi
   if( !(ShowerHandler::currentHandler()->evolver()->softCorrelations() &&
 	(ids[2]==ParticleID::g || ids[2]==ParticleID::gamma )))
     return Constants::twopi*UseRandom::rnd();
   // get the kinematic variables
   double  z = kinematics->z();
   Energy pT = kinematics->pT();
   // if soft correlations
   // find the partner for the soft correlations
   tShowerParticlePtr partner = findCorrelationPartner(particle,true,splittingFn()->interactionType());
   double zFact(1.-z);
   vector<Lorentz5Momentum> basis = kinematics->getBasis();
   // compute the transforms to the shower reference frame
   // first the boost
   Lorentz5Momentum pVect = basis[0];
   Lorentz5Momentum nVect = basis[1];
   assert(kinematics->frame()==ShowerKinematics::Rest);
   Boost beta_bb = -pVect.boostVector();
   pVect.boost(beta_bb);
   nVect.boost(beta_bb);
   Axis axis = nVect.vect().unit();
   // and then the rotation
   LorentzRotation rot;
   if(axis.perp2()>0.) {
     double sinth(sqrt(sqr(axis.x())+sqr(axis.y())));
     rot.rotate(acos(axis.z()),Axis(-axis.y()/sinth,axis.x()/sinth,0.));
   }
   else if(axis.z()<0.) {
     rot.rotate(Constants::pi,Axis(1.,0.,0.));
   }
   rot.invert();
   pVect *= rot;
   nVect *= rot;
   // shower parameters
   Energy2 pn = pVect*nVect;
   Energy2 m2 = pVect.m2();
   double alpha0 = particle.showerParameters().alpha;
   double  beta0 = 0.5/alpha0/pn*
     (sqr(particle.dataPtr()->mass())-sqr(alpha0)*m2+sqr(particle.showerParameters().pt));
   Lorentz5Momentum qperp0(particle.showerParameters().ptx,
 			  particle.showerParameters().pty,ZERO,ZERO);
   Lorentz5Momentum pj = partner->momentum();
   pj.boost(beta_bb);
   pj *= rot;
   // compute the two phi independent dot products
   Energy2 pik = 0.5*zFact*(sqr(alpha0)*m2 - sqr(particle.showerParameters().pt) + 2.*alpha0*beta0*pn )
     +0.5*sqr(pT)/zFact;
   Energy2 dot1 = pj*pVect;
   Energy2 dot2 = pj*nVect;
   Energy2 dot3 = pj*qperp0;
   Energy2 pipj = alpha0*dot1+beta0*dot2+dot3;
   // compute the constants for the phi dependent dot product
   vector<Energy2> pjk(3,ZERO);
   pjk[0] = zFact*(alpha0*dot1+dot3-0.5*dot2/pn*(alpha0*m2-sqr(particle.showerParameters().pt)/alpha0))
     +0.5*sqr(pT)*dot2/pn/zFact/alpha0;
   pjk[1] = (pj.x() - dot2/alpha0/pn*qperp0.x())*pT;
   pjk[2] = (pj.y() - dot2/alpha0/pn*qperp0.y())*pT;
   Energy2 m12 = sqr(particle.dataPtr()->mass());
   Energy2 m22 = sqr(partner->dataPtr()->mass());
   Energy2 mag = sqrt(sqr(pjk[1])+sqr(pjk[2]));
   InvEnergy2 aziMax;
   vector<Energy> Ek(3,ZERO);
   Energy Ei,Ej;
   if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==1) {
     aziMax = -m12/sqr(pik) -m22/sqr(pjk[0]+mag) +2.*pipj/pik/(pjk[0]-mag);
   }
   else if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==2) {
     Ek[0] = zFact*(alpha0*pVect.t()+-0.5*nVect.t()/pn*(alpha0*m2-sqr(particle.showerParameters().pt)/alpha0))
       +0.5*sqr(pT)*nVect.t()/pn/zFact/alpha0;
     Ek[1] = -nVect.t()/alpha0/pn*qperp0.x()*pT;
     Ek[2] = -nVect.t()/alpha0/pn*qperp0.y()*pT;
     Energy mag2=sqrt(sqr(Ek[1])+sqr(Ek[2]));
     Ei = alpha0*pVect.t()+beta0*nVect.t();
     Ej = pj.t();
     aziMax = 0.5/pik/(Ek[0]-mag2)*(Ei-m12*(Ek[0]-mag2)/pik  + pipj*(Ek[0]+mag2)/(pjk[0]-mag) - Ej*pik/(pjk[0]-mag) );
   }
   else
     assert(ShowerHandler::currentHandler()->evolver()->softCorrelations()==0);
   // generate the azimuthal angle
   double phi,wgt(0.);
   unsigned int ntry(0);
   double phiMax(0.),wgtMax(0.);
   do {
     phi = Constants::twopi*UseRandom::rnd();
     Energy2 dot = pjk[0]+pjk[1]*cos(phi)+pjk[2]*sin(phi);
     if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==1) {
       wgt = (-m12/sqr(pik) -m22/sqr(dot) +2.*pipj/pik/dot)/aziMax;
     }
     else if(ShowerHandler::currentHandler()->evolver()->softCorrelations()==2) {
       if(qperp0.m2()==ZERO) {
 	wgt = 1.;
       }
       else {
 	Energy Eg = Ek[0]+Ek[1]*cos(phi)+Ek[2]*sin(phi);
 	wgt = max(ZERO,0.5/pik/Eg*(Ei-m12*Eg/pik  + (pipj*Eg - Ej*pik)/dot)/aziMax);
       }	
     }
     if(wgt-1.>1e-10||wgt<-1e-10) {
       generator()->log() << "Decay soft weight problem " << wgt << " " << wgt-1. 
 			 << " " << ids[0] << " " << ids[1] << " " << ids[2] << " " << " " << phi << "\n";
     }
     if(wgt>wgtMax) {
       phiMax = phi;
       wgtMax = wgt;
     }
     ++ntry;
   }
   while(wgt<UseRandom::rnd()&&ntry<10000);
   if(ntry==10000) {
     phi = phiMax;
     generator()->log() << "Too many tries to generate phi\n";
   }
   // return the azimuthal angle
   return phi;
 }
 
 
 Energy QTildeSudakov::calculateScale(double zin, Energy pt, IdList ids,
 				     unsigned int iopt) {
   Energy2 tmin;
   initialize(ids,tmin,false);
   // final-state branching
   if(iopt==0) {
     Energy2 scale=(sqr(pt)+masssquared_[1]*(1.-zin)+masssquared_[2]*zin);
     if(ids[0]!=ParticleID::g) scale -= zin*(1.-zin)*masssquared_[0];
     scale /= sqr(zin*(1-zin));
     return scale<=ZERO ? sqrt(tmin) : sqrt(scale);
   }
   else if(iopt==1) {
     Energy2 scale=(sqr(pt)+zin*masssquared_[2])/sqr(1.-zin);
     return scale<=ZERO ? sqrt(tmin) : sqrt(scale);
   }
   else if(iopt==2) {
     Energy2 scale = (sqr(pt)+zin*masssquared_[2])/sqr(1.-zin)+masssquared_[0];
     return scale<=ZERO ? sqrt(tmin) : sqrt(scale);
   }
   else {
     throw Exception() << "Unknown option in QTildeSudakov::calculateScale() "
 		      << "iopt = " << iopt << Exception::runerror;
   }
 }
 
 ShoKinPtr QTildeSudakov::createFinalStateBranching(Energy scale,double z,
 						   double phi, Energy pt) {
   ShoKinPtr showerKin = new_ptr(FS_QTildeShowerKinematics1to2());
   showerKin->scale(scale);
   showerKin->z(z);
   showerKin->phi(phi);
   showerKin->pT(pt);
   showerKin->SudakovFormFactor(this);
   return showerKin;
 }
 
 ShoKinPtr QTildeSudakov::createInitialStateBranching(Energy scale,double z,
 						     double phi, Energy pt) {
   ShoKinPtr showerKin = new_ptr(IS_QTildeShowerKinematics1to2());
   showerKin->scale(scale);
   showerKin->z(z);
   showerKin->phi(phi);
   showerKin->pT(pt);
   showerKin->SudakovFormFactor(this);
   return showerKin;
 }
 
 ShoKinPtr QTildeSudakov::createDecayBranching(Energy scale,double z,
 					      double phi, Energy pt) {
   ShoKinPtr  showerKin = new_ptr(Decay_QTildeShowerKinematics1to2());
   showerKin->scale(scale);
   showerKin->z(z);
   showerKin->phi(phi);
   showerKin->pT(pt);
   showerKin->SudakovFormFactor(this);
   return showerKin;
 }
diff --git a/Shower/Makefile.am b/Shower/Makefile.am
--- a/Shower/Makefile.am
+++ b/Shower/Makefile.am
@@ -1,50 +1,51 @@
 SUBDIRS = Matching .
 pkglib_LTLIBRARIES = HwShower.la
-HwShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 21:0:0
+HwShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 22:0:0
 HwShower_la_LIBADD = \
 $(top_builddir)/PDF/libHwRemDecayer.la \
 $(top_builddir)/PDF/libHwMPIPDF.la
 HwShower_la_SOURCES =  \
 UEBase.h UEBase.cc UEBase.fh \
 Couplings/ShowerAlphaQCD.h Couplings/ShowerAlphaQCD.cc \
 Couplings/ShowerAlphaQED.h Couplings/ShowerAlphaQED.cc\
 ShowerHandler.h ShowerHandler.fh ShowerHandler.cc \
 SplittingFunctions/HalfHalfOneSplitFn.h SplittingFunctions/HalfHalfOneSplitFn.cc\
 SplittingFunctions/OneOneOneSplitFn.h SplittingFunctions/OneOneOneSplitFn.cc\
 SplittingFunctions/ZeroZeroOneSplitFn.h SplittingFunctions/ZeroZeroOneSplitFn.cc\
 SplittingFunctions/OneHalfHalfSplitFn.h SplittingFunctions/OneHalfHalfSplitFn.cc\
 SplittingFunctions/HalfOneHalfSplitFn.h SplittingFunctions/HalfOneHalfSplitFn.cc\
 Default/QTildeSudakov.cc Default/QTildeSudakov.h\
 Default/QTildeModel.cc Default/QTildeModel.h\
 Default/Decay_QTildeShowerKinematics1to2.cc \
 Default/Decay_QTildeShowerKinematics1to2.h  \
 Default/IS_QTildeShowerKinematics1to2.cc    Default/IS_QTildeShowerKinematics1to2.h  \
 Default/FS_QTildeShowerKinematics1to2.cc    Default/FS_QTildeShowerKinematics1to2.h  \
 Default/QTildeShowerKinematics1to2.cc Default/QTildeShowerKinematics1to2.fh\
 Default/QTildeShowerKinematics1to2.h  \
 Default/QTildeFinder.cc Default/QTildeFinder.h\
 Default/QTildeReconstructor.cc Default/QTildeReconstructor.h Default/QTildeReconstructor.tcc \
 Base/KinematicsReconstructor.cc \
 Base/KinematicsReconstructor.h \
 Base/KinematicsReconstructor.fh \
 Base/ShowerModel.cc Base/ShowerModel.h Base/ShowerModel.fh \
 Base/PartnerFinder.h Base/PartnerFinder.fh Base/PartnerFinder.cc \
 Base/Evolver.h Base/Evolver.fh Base/Evolver.cc \
-Base/ShowerVeto.h Base/ShowerVeto.fh Base/ShowerVeto.cc
+Base/ShowerVeto.h Base/ShowerVeto.fh Base/ShowerVeto.cc \
+Base/FullShowerVeto.h Base/FullShowerVeto.fh Base/FullShowerVeto.cc
 
 noinst_LTLIBRARIES = libHwShower.la
 libHwShower_la_SOURCES = ShowerConfig.h \
 Base/Branching.h \
 Base/ShowerParticle.cc  Base/ShowerParticle.fh  Base/ShowerParticle.h \
 Base/ShowerKinematics.fh  Base/ShowerKinematics.h Base/ShowerKinematics.cc \
 Base/ShowerTree.h Base/ShowerTree.fh Base/ShowerTree.cc \
 Base/ShowerProgenitor.fh Base/ShowerProgenitor.h \
 Base/HardTree.h Base/HardTree.fh Base/HardTree.cc\
 Base/SudakovFormFactor.cc Base/SudakovFormFactor.h Base/SudakovFormFactor.fh \
 Base/HardBranching.h Base/HardBranching.fh Base/HardBranching.cc\
 Couplings/ShowerAlpha.h Couplings/ShowerAlpha.cc Couplings/ShowerAlpha.fh\
 SplittingFunctions/SplittingGenerator.cc SplittingFunctions/SplittingGenerator.h\
 SplittingFunctions/SplittingGenerator.fh \
 SplittingFunctions/SplittingFunction.h SplittingFunctions/SplittingFunction.fh \
 SplittingFunctions/SplittingFunction.cc  \
 Base/ShowerVertex.cc Base/ShowerVertex.fh Base/ShowerVertex.h
diff --git a/lib/Makefile.am b/lib/Makefile.am
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,49 +1,49 @@
 pkglib_LTLIBRARIES = Herwig.la
 Herwig_la_SOURCES =
 Herwig_la_LIBTOOLFLAGS = --tag=CXX
-Herwig_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 18:0:0
+Herwig_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 19:0:0
 Herwig_la_LDFLAGS += $(THEPEGLDFLAGS) $(BOOST_SYSTEM_LDFLAGS) $(BOOST_FILESYSTEM_LDFLAGS) $(FCLIBS)
 Herwig_la_LIBADD = \
 $(top_builddir)/Hadronization/libHwHadronization.la \
 $(top_builddir)/Models/StandardModel/libHwStandardModel.la \
 $(top_builddir)/Decay/libHwDecay.la \
 $(top_builddir)/Decay/FormFactors/libHwFormFactor.la \
 $(top_builddir)/Decay/Radiation/libHwDecRad.la \
 $(top_builddir)/Utilities/libHwUtils.la \
 $(top_builddir)/Models/General/libHwModelGenerator.la \
 $(top_builddir)/Decay/General/libHwGeneralDecay.la \
 $(top_builddir)/MatrixElement/General/libHwGeneralME.la \
 $(top_builddir)/MatrixElement/libHwME.la \
 $(top_builddir)/MatrixElement/Reweighters/libHwReweighters.la \
 $(top_builddir)/MatrixElement/Matchbox/libHwMatchbox.la \
 $(top_builddir)/Decay/WeakCurrents/libHwWeakCurrent.la \
 $(top_builddir)/Looptools/libHwLooptools.la \
 $(top_builddir)/Shower/libHwShower.la \
 $(THEPEGLIB) $(BOOST_SYSTEM_LIBS) $(BOOST_FILESYSTEM_LIBS) -ldl
 
 dist_noinst_SCRIPTS = fix-osx-path
 
 
 POSTPROCESSING = done-all-links
 
 if NEED_APPLE_FIXES
 POSTPROCESSING += apple-fixes
 endif
 
 
 
 all-local: $(POSTPROCESSING)
 
 done-all-links: Herwig.la
 	find $(top_builddir) \( -name '*.so.*' -or -name '*.so' \) \
   -not -name 'lib*' -not -path '$(top_builddir)/lib/*' \
   -not -path '$(top_builddir)/.hg/*' -exec $(LN_S) -f \{\} \;
 	$(LN_S) -f .libs/Herwig*so* .
 	echo "stamp" > $@
 
 apple-fixes: fix-osx-path done-all-links
 	./$<
 	echo "stamp" > $@
 
 clean-local:
 	rm -f *.so *.so.* done-all-links apple-fixes
diff --git a/m4/ax_compiler_vendor.m4 b/m4/ax_compiler_vendor.m4
--- a/m4/ax_compiler_vendor.m4
+++ b/m4/ax_compiler_vendor.m4
@@ -1,63 +1,87 @@
 # ===========================================================================
 #    http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html
 # ===========================================================================
 #
 # SYNOPSIS
 #
 #   AX_COMPILER_VENDOR
 #
 # DESCRIPTION
 #
 #   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
 #   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
 #   watcom, etc. The vendor is returned in the cache variable
 #   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
 #
 # LICENSE
 #
 #   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
 #   Copyright (c) 2008 Matteo Frigo
 #
 #   This program is free software: you can redistribute it and/or modify it
 #   under the terms of the GNU General Public License as published by the
 #   Free Software Foundation, either version 3 of the License, or (at your
 #   option) any later version.
 #
 #   This program is distributed in the hope that it will be useful, but
 #   WITHOUT ANY WARRANTY; without even the implied warranty of
 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 #   Public License for more details.
 #
 #   You should have received a copy of the GNU General Public License along
 #   with this program. If not, see <http://www.gnu.org/licenses/>.
 #
 #   As a special exception, the respective Autoconf Macro's copyright owner
 #   gives unlimited permission to copy, distribute and modify the configure
 #   scripts that are the output of Autoconf when processing the Macro. You
 #   need not follow the terms of the GNU General Public License when using
 #   or distributing such scripts, even though portions of the text of the
 #   Macro appear in them. The GNU General Public License (GPL) does govern
 #   all other use of the material that constitutes the Autoconf Macro.
 #
 #   This special exception to the GPL applies to versions of the Autoconf
 #   Macro released by the Autoconf Archive. When you make and distribute a
 #   modified version of the Autoconf Macro, you may extend this special
 #   exception to the GPL to apply to your modified version as well.
 
-#serial 9
+#serial 15
 
 AC_DEFUN([AX_COMPILER_VENDOR],
-[
-AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
- [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
+[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
+  dnl Please add if possible support to ax_compiler_version.m4
+  [# note: don't check for gcc first since some other compilers define __GNUC__
+  vendors="intel:     __ICC,__ECC,__INTEL_COMPILER
+           ibm:       __xlc__,__xlC__,__IBMC__,__IBMCPP__
+           pathscale: __PATHCC__,__PATHSCALE__
+           clang:     __clang__
+           cray:      _CRAYC
+           fujitsu:   __FUJITSU
+           gnu:       __GNUC__
+           sun:       __SUNPRO_C,__SUNPRO_CC
+           hp:        __HP_cc,__HP_aCC
+           dec:       __DECC,__DECCXX,__DECC_VER,__DECCXX_VER
+           borland:   __BORLANDC__,__CODEGEARC__,__TURBOC__
+           comeau:    __COMO__
+           kai:       __KCC
+           lcc:       __LCC__
+           sgi:       __sgi,sgi
+           microsoft: _MSC_VER
+           metrowerks: __MWERKS__
+           watcom:    __WATCOMC__
+           portland:  __PGI
+	   tcc:       __TINYC__
+           unknown:   UNKNOWN"
+  for ventest in $vendors; do
+    case $ventest in
+      *:) vendor=$ventest; continue ;;
+      *)  vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;;
+    esac
     AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
-#if !($vencpp)
-      thisisanerror;
-#endif
-])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
+      #if !($vencpp)
+        thisisanerror;
+      #endif
+    ])], [break])
   done
+  ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1`
  ])
 ])
diff --git a/m4/boost.m4 b/m4/boost.m4
--- a/m4/boost.m4
+++ b/m4/boost.m4
@@ -1,1562 +1,1572 @@
 # boost.m4: Locate Boost headers and libraries for autoconf-based projects.
 # Copyright (C) 2007-2011, 2014  Benoit Sigoure <tsuna@lrde.epita.fr>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # Additional permission under section 7 of the GNU General Public
 # License, version 3 ("GPLv3"):
 #
 # If you convey this file as part of a work that contains a
 # configuration script generated by Autoconf, you may do so under
 # terms of your choice.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 m4_define([_BOOST_SERIAL], [m4_translit([
-# serial 25
+# serial 26
 ], [#
 ], [])])
 
 # Original sources can be found at http://github.com/tsuna/boost.m4
 # You can fetch the latest version of the script by doing:
 #   wget http://github.com/tsuna/boost.m4/raw/master/build-aux/boost.m4
 
 # ------ #
 # README #
 # ------ #
 
 # This file provides several macros to use the various Boost libraries.
 # The first macro is BOOST_REQUIRE.  It will simply check if it's possible to
 # find the Boost headers of a given (optional) minimum version and it will
 # define BOOST_CPPFLAGS accordingly.  It will add an option --with-boost to
 # your configure so that users can specify non standard locations.
 # If the user's environment contains BOOST_ROOT and --with-boost was not
 # specified, --with-boost=$BOOST_ROOT is implicitly used.
 # For more README and documentation, go to http://github.com/tsuna/boost.m4
 # Note: THESE MACROS ASSUME THAT YOU USE LIBTOOL.  If you don't, don't worry,
 # simply read the README, it will show you what to do step by step.
 
 m4_pattern_forbid([^_?(BOOST|Boost)_])
 
 
 # _BOOST_SED_CPP(SED-PROGRAM, PROGRAM,
 #                [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
 # --------------------------------------------------------
 # Same as AC_EGREP_CPP, but leave the result in conftest.i.
 #
 # SED-PROGRAM is *not* overquoted, as in AC_EGREP_CPP.  It is expanded
 # in double-quotes, so escape your double quotes.
 #
 # It could be useful to turn this into a macro which extracts the
 # value of any macro.
 m4_define([_BOOST_SED_CPP],
 [AC_LANG_PUSH([C++])dnl
 AC_LANG_PREPROC_REQUIRE()dnl
 AC_REQUIRE([AC_PROG_SED])dnl
 AC_LANG_CONFTEST([AC_LANG_SOURCE([[$2]])])
 AS_IF([dnl eval is necessary to expand ac_cpp.
 dnl Ultrix and Pyramid sh refuse to redirect output of eval, so use subshell.
 dnl Beware of Windows end-of-lines, for instance if we are running
 dnl some Windows programs under Wine.  In that case, boost/version.hpp
 dnl is certainly using "\r\n", but the regular Unix shell will only
 dnl strip `\n' with backquotes, not the `\r'.  This results in
 dnl boost_cv_lib_version='1_37\r' for instance, which breaks
 dnl everything else.
 dnl Cannot use 'dnl' after [$4] because a trailing dnl may break AC_CACHE_CHECK
 dnl
 dnl Beware that GCC 5, when expanding macros, may embed # line directives
 dnl a within single line:
 dnl
 dnl # 1 "conftest.cc"
 dnl # 1 "<built-in>"
 dnl # 1 "<command-line>"
 dnl # 1 "conftest.cc"
 dnl # 1 "/opt/local/include/boost/version.hpp" 1 3
 dnl # 2 "conftest.cc" 2
 dnl boost-lib-version =
 dnl # 2 "conftest.cc" 3
 dnl                    "1_56"
 dnl
-dnl So get rid of the # lines, and glue the remaining ones together.
+dnl So get rid of the # and empty lines, and glue the remaining ones together.
 (eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
   grep -v '#' |
+  grep -v '^[[[:space:]]]*$' |
   tr -d '\r' |
   tr -s '\n' ' ' |
   $SED -n -e "$1" >conftest.i 2>&1],
   [$3],
   [$4])
 rm -rf conftest*
 AC_LANG_POP([C++])dnl
 ])# _BOOST_SED_CPP
 
 
 
 # BOOST_REQUIRE([VERSION], [ACTION-IF-NOT-FOUND])
 # -----------------------------------------------
 # Look for Boost.  If version is given, it must either be a literal of the form
 # "X.Y.Z" where X, Y and Z are integers (the ".Z" part being optional) or a
 # variable "$var".
 # Defines the value BOOST_CPPFLAGS.  This macro only checks for headers with
 # the required version, it does not check for any of the Boost libraries.
 # On # success, defines HAVE_BOOST.  On failure, calls the optional
 # ACTION-IF-NOT-FOUND action if one was supplied.
 # Otherwise aborts with an error message.
 AC_DEFUN_ONCE([BOOST_REQUIRE],
 [AC_REQUIRE([AC_PROG_CXX])dnl
 AC_REQUIRE([AC_PROG_GREP])dnl
 echo "$as_me: this is boost.m4[]_BOOST_SERIAL" >&AS_MESSAGE_LOG_FD
 boost_save_IFS=$IFS
 boost_version_req=$1
 IFS=.
 set x $boost_version_req 0 0 0
 IFS=$boost_save_IFS
 shift
 boost_version_req=`expr "$[1]" '*' 100000 + "$[2]" '*' 100 + "$[3]"`
 boost_version_req_string=$[1].$[2].$[3]
 AC_ARG_WITH([boost],
    [AS_HELP_STRING([--with-boost=DIR],
                    [prefix of Boost $1 @<:@guess@:>@])])dnl
 AC_ARG_VAR([BOOST_ROOT],[Location of Boost installation])dnl
 # If BOOST_ROOT is set and the user has not provided a value to
 # --with-boost, then treat BOOST_ROOT as if it the user supplied it.
 if test x"$BOOST_ROOT" != x; then
   if test x"$with_boost" = x; then
     AC_MSG_NOTICE([Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT])
     with_boost=$BOOST_ROOT
   else
     AC_MSG_NOTICE([Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost])
   fi
 fi
 dnl AC_SUBST([DISTCHECK_CONFIGURE_FLAGS],
 dnl          ["$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'"])dnl
 boost_save_CPPFLAGS=$CPPFLAGS
   AC_CACHE_CHECK([for Boost headers version >= $boost_version_req_string],
     [boost_cv_inc_path],
     [boost_cv_inc_path=no
 AC_LANG_PUSH([C++])dnl
 m4_pattern_allow([^BOOST_VERSION$])dnl
     AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include <boost/version.hpp>
 #if !defined BOOST_VERSION
 # error BOOST_VERSION is not defined
 #elif BOOST_VERSION < $boost_version_req
 # error Boost headers version < $boost_version_req
 #endif
 ]])])
     # If the user provided a value to --with-boost, use it and only it.
     case $with_boost in #(
       ''|yes) set x '' /opt/local/include /usr/local/include /opt/include \
                  /usr/include C:/Boost/include;; #(
       *)      set x "$with_boost/include" "$with_boost";;
     esac
     shift
     for boost_dir
     do
     # Without --layout=system, Boost (or at least some versions) installs
     # itself in <prefix>/include/boost-<version>.  This inner loop helps to
     # find headers in such directories.
     #
     # Any ${boost_dir}/boost-x_xx directories are searched in reverse version
     # order followed by ${boost_dir}.  The final '.' is a sentinel for
     # searching $boost_dir" itself.  Entries are whitespace separated.
     #
     # I didn't indent this loop on purpose (to avoid over-indented code)
     boost_layout_system_search_list=`cd "$boost_dir" 2>/dev/null \
         && ls -1 | "${GREP}" '^boost-' | sort -rn -t- -k2 \
         && echo .`
     for boost_inc in $boost_layout_system_search_list
     do
       if test x"$boost_inc" != x.; then
         boost_inc="$boost_dir/$boost_inc"
       else
         boost_inc="$boost_dir" # Uses sentinel in boost_layout_system_search_list
       fi
       if test x"$boost_inc" != x; then
         # We are going to check whether the version of Boost installed
         # in $boost_inc is usable by running a compilation that
         # #includes it.  But if we pass a -I/some/path in which Boost
         # is not installed, the compiler will just skip this -I and
         # use other locations (either from CPPFLAGS, or from its list
         # of system include directories).  As a result we would use
         # header installed on the machine instead of the /some/path
         # specified by the user.  So in that precise case (trying
         # $boost_inc), make sure the version.hpp exists.
         #
         # Use test -e as there can be symlinks.
         test -e "$boost_inc/boost/version.hpp" || continue
         CPPFLAGS="$CPPFLAGS -I$boost_inc"
       fi
       AC_COMPILE_IFELSE([], [boost_cv_inc_path=yes], [boost_cv_version=no])
       if test x"$boost_cv_inc_path" = xyes; then
         if test x"$boost_inc" != x; then
           boost_cv_inc_path=$boost_inc
         fi
         break 2
       fi
     done
     done
 AC_LANG_POP([C++])dnl
     ])
     case $boost_cv_inc_path in #(
       no)
         boost_errmsg="cannot find Boost headers version >= $boost_version_req_string"
         m4_if([$2], [],  [AC_MSG_ERROR([$boost_errmsg])],
                         [AC_MSG_NOTICE([$boost_errmsg])])
         $2
         ;;#(
       yes)
         BOOST_CPPFLAGS=
         ;;#(
       *)
         AC_SUBST([BOOST_CPPFLAGS], ["-I$boost_cv_inc_path"])dnl
         ;;
     esac
   if test x"$boost_cv_inc_path" != xno; then
   AC_DEFINE([HAVE_BOOST], [1],
             [Defined if the requested minimum BOOST version is satisfied])
   AC_CACHE_CHECK([for Boost's header version],
     [boost_cv_lib_version],
     [m4_pattern_allow([^BOOST_LIB_VERSION$])dnl
      _BOOST_SED_CPP([[/^boost-lib-version = /{s///;s/[\" ]//g;p;q;}]],
                     [#include <boost/version.hpp>
 boost-lib-version = BOOST_LIB_VERSION],
     [boost_cv_lib_version=`cat conftest.i`])])
     # e.g. "134" for 1_34_1 or "135" for 1_35
     boost_major_version=`echo "$boost_cv_lib_version" | sed 's/_//;s/_.*//'`
     case $boost_major_version in #(
       '' | *[[!0-9]]*)
         AC_MSG_ERROR([invalid value: boost_major_version='$boost_major_version'])
         ;;
     esac
 fi
 CPPFLAGS=$boost_save_CPPFLAGS
 ])# BOOST_REQUIRE
 
 
 # BOOST_STATIC()
 # --------------
 # Add the "--enable-static-boost" configure argument. If this argument is given
 # on the command line, static versions of the libraries will be looked up.
 AC_DEFUN([BOOST_STATIC],
   [AC_ARG_ENABLE([static-boost],
      [AS_HELP_STRING([--enable-static-boost],
                [Prefer the static boost libraries over the shared ones [no]])],
      [enable_static_boost=yes],
      [enable_static_boost=no])])# BOOST_STATIC
 
 
 # BOOST_FIND_HEADER([HEADER-NAME], [ACTION-IF-NOT-FOUND], [ACTION-IF-FOUND])
 # --------------------------------------------------------------------------
 # Wrapper around AC_CHECK_HEADER for Boost headers.  Useful to check for
 # some parts of the Boost library which are only made of headers and don't
 # require linking (such as Boost.Foreach).
 #
 # Default ACTION-IF-NOT-FOUND: Fail with a fatal error unless Boost couldn't be
 # found in the first place, in which case by default a notice is issued to the
 # user.  Presumably if we haven't died already it's because it's OK to not have
 # Boost, which is why only a notice is issued instead of a hard error.
 #
 # Default ACTION-IF-FOUND: define the preprocessor symbol HAVE_<HEADER-NAME> in
 # case of success # (where HEADER-NAME is written LIKE_THIS, e.g.,
 # HAVE_BOOST_FOREACH_HPP).
 AC_DEFUN([BOOST_FIND_HEADER],
 [AC_REQUIRE([BOOST_REQUIRE])dnl
 if test x"$boost_cv_inc_path" = xno; then
   m4_default([$2], [AC_MSG_NOTICE([Boost not available, not searching for $1])])
 else
 AC_LANG_PUSH([C++])dnl
 boost_save_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
 AC_CHECK_HEADER([$1],
   [m4_default([$3], [AC_DEFINE(AS_TR_CPP([HAVE_$1]), [1],
                                [Define to 1 if you have <$1>])])],
   [m4_default([$2], [AC_MSG_ERROR([cannot find $1])])])
 CPPFLAGS=$boost_save_CPPFLAGS
 AC_LANG_POP([C++])dnl
 fi
 ])# BOOST_FIND_HEADER
 
 
 # BOOST_FIND_LIBS([COMPONENT-NAME], [CANDIDATE-LIB-NAMES],
 #                 [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST],
 #                 [CXX-PROLOGUE])
 # --------------------------------------------------------------
 # Look for the Boost library COMPONENT-NAME (e.g., `thread', for
 # libboost_thread) under the possible CANDIDATE-LIB-NAMES (e.g.,
 # "thread_win32 thread").  Check that HEADER-NAME works and check that
 # libboost_LIB-NAME can link with the code CXX-TEST.  The optional
 # argument CXX-PROLOGUE can be used to include some C++ code before
 # the `main' function.
 #
 # Invokes BOOST_FIND_HEADER([HEADER-NAME]) (see above).
 #
 # Boost libraries typically come compiled with several flavors (with different
 # runtime options) so PREFERRED-RT-OPT is the preferred suffix.  A suffix is one
 # or more of the following letters: sgdpn (in that order).  s = static
 # runtime, d = debug build, g = debug/diagnostic runtime, p = STLPort build,
 # n = (unsure) STLPort build without iostreams from STLPort (it looks like `n'
 # must always be used along with `p').  Additionally, PREFERRED-RT-OPT can
 # start with `mt-' to indicate that there is a preference for multi-thread
 # builds.  Some sample values for PREFERRED-RT-OPT: (nothing), mt, d, mt-d, gdp
 # ...  If you want to make sure you have a specific version of Boost
 # (eg, >= 1.33) you *must* invoke BOOST_REQUIRE before this macro.
 AC_DEFUN([BOOST_FIND_LIBS],
 [AC_REQUIRE([BOOST_REQUIRE])dnl
 AC_REQUIRE([_BOOST_FIND_COMPILER_TAG])dnl
 AC_REQUIRE([BOOST_STATIC])dnl
 AC_REQUIRE([_BOOST_GUESS_WHETHER_TO_USE_MT])dnl
 if test x"$boost_cv_inc_path" = xno; then
   AC_MSG_NOTICE([Boost not available, not searching for the Boost $1 library])
 else
 dnl The else branch is huge and wasn't intended on purpose.
 AC_LANG_PUSH([C++])dnl
 AS_VAR_PUSHDEF([Boost_lib], [boost_cv_lib_$1])dnl
 AS_VAR_PUSHDEF([Boost_lib_LDFLAGS], [boost_cv_lib_$1_LDFLAGS])dnl
 AS_VAR_PUSHDEF([Boost_lib_LDPATH], [boost_cv_lib_$1_LDPATH])dnl
 AS_VAR_PUSHDEF([Boost_lib_LIBS], [boost_cv_lib_$1_LIBS])dnl
 BOOST_FIND_HEADER([$4])
 boost_save_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
 AC_CACHE_CHECK([for the Boost $1 library], [Boost_lib],
                [_BOOST_FIND_LIBS($@)])
 case $Boost_lib in #(
   (no) _AC_MSG_LOG_CONFTEST
     AC_MSG_ERROR([cannot find the flags to link with Boost $1])
     ;;
 esac
 AC_SUBST(AS_TR_CPP([BOOST_$1_LDFLAGS]), [$Boost_lib_LDFLAGS])dnl
 AC_SUBST(AS_TR_CPP([BOOST_$1_LDPATH]), [$Boost_lib_LDPATH])dnl
 AC_SUBST([BOOST_LDPATH], [$Boost_lib_LDPATH])dnl
 AC_SUBST(AS_TR_CPP([BOOST_$1_LIBS]), [$Boost_lib_LIBS])dnl
 CPPFLAGS=$boost_save_CPPFLAGS
 AS_VAR_POPDEF([Boost_lib])dnl
 AS_VAR_POPDEF([Boost_lib_LDFLAGS])dnl
 AS_VAR_POPDEF([Boost_lib_LDPATH])dnl
 AS_VAR_POPDEF([Boost_lib_LIBS])dnl
 AC_LANG_POP([C++])dnl
 fi
 ])
 
 
 # BOOST_FIND_LIB([LIB-NAME],
 #                [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST],
 #                [CXX-PROLOGUE])
 # --------------------------------------------------------------
 # Backward compatibility wrapper for BOOST_FIND_LIBS.
 AC_DEFUN([BOOST_FIND_LIB],
 [BOOST_FIND_LIBS([$1], $@)])
 
 
 # _BOOST_FIND_LIBS([LIB-NAME], [CANDIDATE-LIB-NAMES],
 #                 [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST],
 #                 [CXX-PROLOGUE])
 # --------------------------------------------------------------
 # Real implementation of BOOST_FIND_LIBS: rely on these local macros:
 # Boost_lib, Boost_lib_LDFLAGS, Boost_lib_LDPATH, Boost_lib_LIBS
 #
 # The algorithm is as follows: first look for a given library name
 # according to the user's PREFERRED-RT-OPT.  For each library name, we
 # prefer to use the ones that carry the tag (toolset name).  Each
 # library is searched through the various standard paths were Boost is
 # usually installed.  If we can't find the standard variants, we try
 # to enforce -mt (for instance on MacOSX, libboost_thread.dylib
 # doesn't exist but there's -obviously- libboost_thread-mt.dylib).
 AC_DEFUN([_BOOST_FIND_LIBS],
 [Boost_lib=no
   case "$3" in #(
     (mt | mt-) boost_mt=-mt; boost_rtopt=;; #(
     (mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X$3" : 'Xmt-*\(.*\)'`;; #(
     (*) boost_mt=; boost_rtopt=$3;;
   esac
   if test $enable_static_boost = yes; then
     boost_rtopt="s$boost_rtopt"
   fi
   # Find the proper debug variant depending on what we've been asked to find.
   case $boost_rtopt in #(
     (*d*) boost_rt_d=$boost_rtopt;; #(
     (*[[sgpn]]*) # Insert the `d' at the right place (in between `sg' and `pn')
       boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #(
     (*) boost_rt_d='-d';;
   esac
   # If the PREFERRED-RT-OPT are not empty, prepend a `-'.
   test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt"
   $boost_guess_use_mt && boost_mt=-mt
   # Look for the abs path the static archive.
   # $libext is computed by Libtool but let's make sure it's non empty.
   test -z "$libext" &&
     AC_MSG_ERROR([the libext variable is empty, did you invoke Libtool?])
   boost_save_ac_objext=$ac_objext
   # Generate the test file.
   AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include <$4>
 $6], [$5])])
 dnl Optimization hacks: compiling C++ is slow, especially with Boost.  What
 dnl we're trying to do here is guess the right combination of link flags
 dnl (LIBS / LDFLAGS) to use a given library.  This can take several
 dnl iterations before it succeeds and is thus *very* slow.  So what we do
 dnl instead is that we compile the code first (and thus get an object file,
 dnl typically conftest.o).  Then we try various combinations of link flags
 dnl until we succeed to link conftest.o in an executable.  The problem is
 dnl that the various TRY_LINK / COMPILE_IFELSE macros of Autoconf always
 dnl remove all the temporary files including conftest.o.  So the trick here
 dnl is to temporarily change the value of ac_objext so that conftest.o is
 dnl preserved accross tests.  This is obviously fragile and I will burn in
 dnl hell for not respecting Autoconf's documented interfaces, but in the
 dnl mean time, it optimizes the macro by a factor of 5 to 30.
 dnl Another small optimization: the first argument of AC_COMPILE_IFELSE left
 dnl empty because the test file is generated only once above (before we
 dnl start the for loops).
   AC_COMPILE_IFELSE([],
     [ac_objext=do_not_rm_me_plz],
     [AC_MSG_ERROR([cannot compile a test that uses Boost $1])])
   ac_objext=$boost_save_ac_objext
   boost_failed_libs=
 # Don't bother to ident the following nested for loops, only the 2
 # innermost ones matter.
 for boost_lib_ in $2; do
 for boost_tag_ in -$boost_cv_lib_tag ''; do
 for boost_ver_ in -$boost_cv_lib_version ''; do
 for boost_mt_ in $boost_mt -mt ''; do
 for boost_rtopt_ in $boost_rtopt '' -d; do
   for boost_lib in \
     boost_$boost_lib_$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \
     boost_$boost_lib_$boost_tag_$boost_rtopt_$boost_ver_ \
     boost_$boost_lib_$boost_tag_$boost_mt_$boost_ver_ \
     boost_$boost_lib_$boost_tag_$boost_ver_
   do
     # Avoid testing twice the same lib
     case $boost_failed_libs in #(
       (*@$boost_lib@*) continue;;
     esac
     # If with_boost is empty, we'll search in /lib first, which is not quite
     # right so instead we'll try to a location based on where the headers are.
     boost_tmp_lib=$with_boost
     test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include}
     for boost_ldpath in "$boost_tmp_lib/lib" '' \
              /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \
              "$with_boost" C:/Boost/lib /lib*
     do
       # Don't waste time with directories that don't exist.
       if test x"$boost_ldpath" != x && test ! -e "$boost_ldpath"; then
         continue
       fi
       boost_save_LDFLAGS=$LDFLAGS
       # Are we looking for a static library?
       case $boost_ldpath:$boost_rtopt_ in #(
         (*?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt)
           Boost_lib_LIBS="$boost_ldpath/lib$boost_lib.$libext"
           test -e "$Boost_lib_LIBS" || continue;; #(
         (*) # No: use -lboost_foo to find the shared library.
           Boost_lib_LIBS="-l$boost_lib";;
       esac
       boost_save_LIBS=$LIBS
       LIBS="$Boost_lib_LIBS $LIBS"
       test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath"
 dnl First argument of AC_LINK_IFELSE left empty because the test file is
 dnl generated only once above (before we start the for loops).
       _BOOST_AC_LINK_IFELSE([],
                             [Boost_lib=yes], [Boost_lib=no])
       ac_objext=$boost_save_ac_objext
       LDFLAGS=$boost_save_LDFLAGS
       LIBS=$boost_save_LIBS
       if test x"$Boost_lib" = xyes; then
         # Check or used cached result of whether or not using -R or
         # -rpath makes sense.  Some implementations of ld, such as for
         # Mac OSX, require -rpath but -R is the flag known to work on
         # other systems.  https://github.com/tsuna/boost.m4/issues/19
         AC_CACHE_VAL([boost_cv_rpath_link_ldflag],
           [case $boost_ldpath in
            '') # Nothing to do.
              boost_cv_rpath_link_ldflag=
              boost_rpath_link_ldflag_found=yes;;
            *)
             for boost_cv_rpath_link_ldflag in -Wl,-R, -Wl,-rpath,; do
               LDFLAGS="$boost_save_LDFLAGS -L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
               LIBS="$boost_save_LIBS $Boost_lib_LIBS"
               _BOOST_AC_LINK_IFELSE([],
                 [boost_rpath_link_ldflag_found=yes
                 break],
                 [boost_rpath_link_ldflag_found=no])
             done
             ;;
           esac
           AS_IF([test "x$boost_rpath_link_ldflag_found" != "xyes"],
             [AC_MSG_ERROR([Unable to determine whether to use -R or -rpath])])
           LDFLAGS=$boost_save_LDFLAGS
           LIBS=$boost_save_LIBS
           ])
         test x"$boost_ldpath" != x &&
           Boost_lib_LDFLAGS="-L$boost_ldpath $boost_cv_rpath_link_ldflag$boost_ldpath"
         Boost_lib_LDPATH="$boost_ldpath"
         break 7
       else
         boost_failed_libs="$boost_failed_libs@$boost_lib@"
       fi
     done
   done
 done
 done
 done
 done
 done # boost_lib_
 rm -f conftest.$ac_objext
 ])
 
 
 
 # --------------------------------------- #
 # Checks for the various Boost libraries. #
 # --------------------------------------- #
 
 # List of boost libraries: http://www.boost.org/libs/libraries.htm
 # The page http://beta.boost.org/doc/libs is useful: it gives the first release
 # version of each library (among other things).
 
 # BOOST_DEFUN(LIBRARY, CODE)
 # --------------------------
 # Define BOOST_<LIBRARY-UPPERCASE> as a macro that runs CODE.
 #
 # Use indir to avoid the warning on underquoted macro name given to AC_DEFUN.
 m4_define([BOOST_DEFUN],
 [m4_indir([AC_DEFUN],
           m4_toupper([BOOST_$1]),
 [m4_pushdef([BOOST_Library], [$1])dnl
 $2
 m4_popdef([BOOST_Library])dnl
 ])
 ])
 
 # BOOST_ARRAY()
 # -------------
 # Look for Boost.Array
 BOOST_DEFUN([Array],
 [BOOST_FIND_HEADER([boost/array.hpp])])
 
 
 # BOOST_ASIO()
 # ------------
 # Look for Boost.Asio (new in Boost 1.35).
 BOOST_DEFUN([Asio],
 [AC_REQUIRE([BOOST_SYSTEM])dnl
 BOOST_FIND_HEADER([boost/asio.hpp])])
 
 
+# BOOST_ASSIGN()
+# -------------
+# Look for Boost.Assign
+BOOST_DEFUN([Assign],
+[BOOST_FIND_HEADER([boost/assign.hpp])])
+
+
 # BOOST_BIND()
 # ------------
 # Look for Boost.Bind.
 BOOST_DEFUN([Bind],
 [BOOST_FIND_HEADER([boost/bind.hpp])])
 
 
 # BOOST_CHRONO()
 # --------------
 # Look for Boost.Chrono.
 BOOST_DEFUN([Chrono],
 [# Do we have to check for Boost.System?  This link-time dependency was
 # added as of 1.35.0.  If we have a version <1.35, we must not attempt to
 # find Boost.System as it didn't exist by then.
 if test $boost_major_version -ge 135; then
   BOOST_SYSTEM([$1])
 fi # end of the Boost.System check.
 boost_filesystem_save_LIBS=$LIBS
 boost_filesystem_save_LDFLAGS=$LDFLAGS
 m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
 LIBS="$LIBS $BOOST_SYSTEM_LIBS"
 LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
 BOOST_FIND_LIB([chrono], [$1],
                 [boost/chrono.hpp],
                 [boost::chrono::thread_clock d;])
 if test $enable_static_boost = yes && test $boost_major_version -ge 135; then
   BOOST_CHRONO_LIBS="$BOOST_CHRONO_LIBS $BOOST_SYSTEM_LIBS"
 fi
 LIBS=$boost_filesystem_save_LIBS
 LDFLAGS=$boost_filesystem_save_LDFLAGS
 ])# BOOST_CHRONO
 
 
 # BOOST_CONTEXT([PREFERRED-RT-OPT])
 # -----------------------------------
 # Look for Boost.Context.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 #
 # * This library was introduced in Boost 1.51.0
 # * The signatures of make_fcontext() and jump_fcontext were changed in 1.56.0
 # * A dependency on boost_thread appears in 1.57.0
 BOOST_DEFUN([Context],
 [boost_context_save_LIBS=$LIBS
  boost_context_save_LDFLAGS=$LDFLAGS
 if test $boost_major_version -ge 157; then
   BOOST_THREAD([$1])
   m4_pattern_allow([^BOOST_THREAD_(LIBS|LDFLAGS)$])dnl
   LIBS="$LIBS $BOOST_THREAD_LIBS"
   LDFLAGS="$LDFLAGS $BOOST_THREAD_LDFLAGS"
 fi
 BOOST_FIND_LIB([context], [$1],
                 [boost/context/all.hpp],[[
 
 // creates a stack
 void * stack_pointer = new void*[4096];
 std::size_t const size = sizeof(void*[4096]);
 
 #if BOOST_VERSION <= 105100
 ctx::make_fcontext(&fc, f);
 return ctx::jump_fcontext(&fcm, &fc, 3) == 6;
 
 #else
 
 fc = ctx::make_fcontext(stack_pointer, size, f);
 return ctx::jump_fcontext(&fcm, fc, 3) == 6;
 
 #endif
 
 
 ]],[dnl
 
 #include <boost/version.hpp>
 #if BOOST_VERSION <= 105100
 
 namespace ctx = boost::ctx;
 
 static ctx::fcontext_t fcm, fc;
 
 static void f(intptr_t i) {
     ctx::jump_fcontext(&fc, &fcm, i * 2);
 }
 
 #elif BOOST_VERSION <= 105500
 
 namespace ctx = boost::context;
 
 // context
 static ctx::fcontext_t fcm, *fc;
 
 // context-function
 static void f(intptr_t i) {
     ctx::jump_fcontext(fc, &fcm, i * 2);
 }
 
 #else
 
 namespace ctx = boost::context;
 
 // context
 static ctx::fcontext_t fcm, fc;
 
 // context-function
 static void f(intptr_t i) {
     ctx::jump_fcontext(&fc, fcm, i * 2);
 }
 #endif
 ])
 LIBS=$boost_context_save_LIBS
 LDFLAGS=$boost_context_save_LDFLAGS
 ])# BOOST_CONTEXT
 
 
 # BOOST_CONVERSION()
 # ------------------
 # Look for Boost.Conversion (cast / lexical_cast)
 BOOST_DEFUN([Conversion],
 [BOOST_FIND_HEADER([boost/cast.hpp])
 BOOST_FIND_HEADER([boost/lexical_cast.hpp])
 ])# BOOST_CONVERSION
 
 
 # BOOST_COROUTINE([PREFERRED-RT-OPT])
 # -----------------------------------
 # Look for Boost.Coroutine.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.  This library was introduced in Boost
 # 1.53.0
 BOOST_DEFUN([Coroutine],
 [
 boost_coroutine_save_LIBS=$LIBS
 boost_coroutine_save_LDFLAGS=$LDFLAGS
 # Link-time dependency from coroutine to context
 BOOST_CONTEXT([$1])
 # Starting from Boost 1.55 a dependency on Boost.System is added
 if test $boost_major_version -ge 155; then
   BOOST_SYSTEM([$1])
 fi
 m4_pattern_allow([^BOOST_(CONTEXT|SYSTEM)_(LIBS|LDFLAGS)])
 LIBS="$LIBS $BOOST_CONTEXT_LIBS $BOOST_SYSTEM_LIBS"
 LDFLAGS="$LDFLAGS $BOOST_CONTEXT_LDFLAGS"
 
 # in 1.53 coroutine was a header only library
 if test $boost_major_version -eq 153; then
   BOOST_FIND_HEADER([boost/coroutine/coroutine.hpp])
 else
   BOOST_FIND_LIB([coroutine], [$1],
 		  [boost/coroutine/coroutine.hpp],
 		  [
   #include <boost/version.hpp>
   #if   BOOST_VERSION <= 105500
   boost::coroutines::coroutine<int(int)> coro; coro.get();
   #else
   boost::coroutines::asymmetric_coroutine<int>::pull_type coro; coro.get();
   #endif
   ])
 fi
 # Link-time dependency from coroutine to context, existed only in 1.53, in 1.54
 # coroutine doesn't use context from its headers but from its library.
 if test $boost_major_version -eq 153 || test $enable_static_boost = yes && test $boost_major_version -ge 154; then
   BOOST_COROUTINE_LIBS="$BOOST_COROUTINE_LIBS $BOOST_CONTEXT_LIBS"
   BOOST_COROUTINE_LDFLAGS="$BOOST_COROUTINE_LDFLAGS $BOOST_CONTEXT_LDFLAGS"
 fi
 if test $enable_static_boost = yes && test $boost_major_version -ge 155; then
   BOOST_COROUTINE_LIBS="$BOOST_COROUTINE_LIBS $BOOST_SYSTEM_LIBS"
   BOOST_COROUTINE_LDFLAGS="$BOOST_COROUTINE_LDFLAGS $BOOST_SYSTEM_LDFLAGS"
 fi
 LIBS=$boost_coroutine_save_LIBS
 LDFLAGS=$boost_coroutine_save_LDFLAGS
 ])# BOOST_COROUTINE
 
 
 # BOOST_CRC()
 # -----------
 # Look for Boost.CRC
 BOOST_DEFUN([CRC],
 [BOOST_FIND_HEADER([boost/crc.hpp])
 ])# BOOST_CRC
 
 
 # BOOST_DATE_TIME([PREFERRED-RT-OPT])
 # -----------------------------------
 # Look for Boost.Date_Time.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Date_Time],
 [BOOST_FIND_LIB([date_time], [$1],
                 [boost/date_time/posix_time/posix_time.hpp],
                 [boost::posix_time::ptime t;])
 ])# BOOST_DATE_TIME
 
 
 # BOOST_FILESYSTEM([PREFERRED-RT-OPT])
 # ------------------------------------
 # Look for Boost.Filesystem.  For the documentation of PREFERRED-RT-OPT, see
 # the documentation of BOOST_FIND_LIB above.
 # Do not check for boost/filesystem.hpp because this file was introduced in
 # 1.34.
 BOOST_DEFUN([Filesystem],
 [# Do we have to check for Boost.System?  This link-time dependency was
 # added as of 1.35.0.  If we have a version <1.35, we must not attempt to
 # find Boost.System as it didn't exist by then.
 if test $boost_major_version -ge 135; then
   BOOST_SYSTEM([$1])
 fi # end of the Boost.System check.
 boost_filesystem_save_LIBS=$LIBS
 boost_filesystem_save_LDFLAGS=$LDFLAGS
 m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
 LIBS="$LIBS $BOOST_SYSTEM_LIBS"
 LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
 BOOST_FIND_LIB([filesystem], [$1],
                 [boost/filesystem/path.hpp], [boost::filesystem::path p;])
 if test $enable_static_boost = yes && test $boost_major_version -ge 135; then
   BOOST_FILESYSTEM_LIBS="$BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS"
 fi
 LIBS=$boost_filesystem_save_LIBS
 LDFLAGS=$boost_filesystem_save_LDFLAGS
 ])# BOOST_FILESYSTEM
 
 
 # BOOST_FLYWEIGHT()
 # -----------------
 # Look for Boost.Flyweight.
 BOOST_DEFUN([Flyweight],
 [dnl There's a hidden dependency on pthreads.
 AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl
 BOOST_FIND_HEADER([boost/flyweight.hpp])
 AC_SUBST([BOOST_FLYWEIGHT_LIBS], [$boost_cv_pthread_flag])
 ])
 
 
 # BOOST_FOREACH()
 # ---------------
 # Look for Boost.Foreach.
 BOOST_DEFUN([Foreach],
 [BOOST_FIND_HEADER([boost/foreach.hpp])])
 
 
 # BOOST_FORMAT()
 # --------------
 # Look for Boost.Format.
 # Note: we can't check for boost/format/format_fwd.hpp because the header isn't
 # standalone.  It can't be compiled because it triggers the following error:
 # boost/format/detail/config_macros.hpp:88: error: 'locale' in namespace 'std'
 #                                                  does not name a type
 BOOST_DEFUN([Format],
 [BOOST_FIND_HEADER([boost/format.hpp])])
 
 
 # BOOST_FUNCTION()
 # ----------------
 # Look for Boost.Function
 BOOST_DEFUN([Function],
 [BOOST_FIND_HEADER([boost/function.hpp])])
 
 
 # BOOST_GEOMETRY()
 # ----------------
 # Look for Boost.Geometry (new since 1.47.0).
 BOOST_DEFUN([Geometry],
 [BOOST_FIND_HEADER([boost/geometry.hpp])
 ])# BOOST_GEOMETRY
 
 
 # BOOST_GRAPH([PREFERRED-RT-OPT])
 # -------------------------------
 # Look for Boost.Graphs.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Graph],
 [boost_graph_save_LIBS=$LIBS
 boost_graph_save_LDFLAGS=$LDFLAGS
 # Link-time dependency from graph to regex was added as of 1.40.0.
 if test $boost_major_version -ge 140; then
   BOOST_REGEX([$1])
   m4_pattern_allow([^BOOST_REGEX_(LIBS|LDFLAGS)$])dnl
   LIBS="$LIBS $BOOST_REGEX_LIBS"
   LDFLAGS="$LDFLAGS $BOOST_REGEX_LDFLAGS"
 fi
 BOOST_FIND_LIB([graph], [$1],
                 [boost/graph/adjacency_list.hpp], [boost::adjacency_list<> g;])
 LIBS=$boost_graph_save_LIBS
 LDFLAGS=$boost_graph_save_LDFLAGS
 ])# BOOST_GRAPH
 
 
 # BOOST_IOSTREAMS([PREFERRED-RT-OPT])
 # -----------------------------------
 # Look for Boost.IOStreams.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([IOStreams],
 [BOOST_FIND_LIB([iostreams], [$1],
                 [boost/iostreams/device/file_descriptor.hpp],
                 [boost::iostreams::file_descriptor fd; fd.close();])
 ])# BOOST_IOSTREAMS
 
 
 # BOOST_HASH()
 # ------------
 # Look for Boost.Functional/Hash
 BOOST_DEFUN([Hash],
 [BOOST_FIND_HEADER([boost/functional/hash.hpp])])
 
 
 # BOOST_LAMBDA()
 # --------------
 # Look for Boost.Lambda
 BOOST_DEFUN([Lambda],
 [BOOST_FIND_HEADER([boost/lambda/lambda.hpp])])
 
 
 # BOOST_LOCALE()
 # --------------
 # Look for Boost.Locale
 BOOST_DEFUN([Locale],
 [
 boost_locale_save_LIBS=$LIBS
 boost_locale_save_LDFLAGS=$LDFLAGS
 # require SYSTEM for boost-1.50.0 and up
 if test $boost_major_version -ge 150; then
   BOOST_SYSTEM([$1])
   m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
   LIBS="$LIBS $BOOST_SYSTEM_LIBS"
   LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
 fi # end of the Boost.System check.
 BOOST_FIND_LIB([locale], [$1],
     [boost/locale.hpp],
     [[boost::locale::generator gen; std::locale::global(gen(""));]])
 LIBS=$boost_locale_save_LIBS
 LDFLAGS=$boost_locale_save_LDFLAGS
 ])# BOOST_LOCALE
 
 # BOOST_LOG([PREFERRED-RT-OPT])
 # -----------------------------
 # Look for Boost.Log.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Log],
 [boost_log_save_LIBS=$LIBS
 boost_log_save_LDFLAGS=$LDFLAGS
 BOOST_SYSTEM([$1])
 BOOST_FILESYSTEM([$1])
 BOOST_DATE_TIME([$1])
 m4_pattern_allow([^BOOST_(SYSTEM|FILESYSTEM|DATE_TIME)_(LIBS|LDFLAGS)$])dnl
 LIBS="$LIBS $BOOST_DATE_TIME_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS"
 LDFLAGS="$LDFLAGS $BOOST_DATE_TIME_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS $BOOST_SYSTEM_LDFLAGS"
 BOOST_FIND_LIB([log], [$1],
     [boost/log/core/core.hpp],
     [boost::log::attribute a; a.get_value();])
 LIBS=$boost_log_save_LIBS
 LDFLAGS=$boost_log_save_LDFLAGS
 ])# BOOST_LOG
 
 
 # BOOST_LOG_SETUP([PREFERRED-RT-OPT])
 # -----------------------------------
 # Look for Boost.Log.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Log_Setup],
 [boost_log_setup_save_LIBS=$LIBS
 boost_log_setup_save_LDFLAGS=$LDFLAGS
 BOOST_LOG([$1])
 m4_pattern_allow([^BOOST_LOG_(LIBS|LDFLAGS)$])dnl
 LIBS="$LIBS $BOOST_LOG_LIBS"
 LDFLAGS="$LDFLAGS $BOOST_LOG_LDFLAGS"
 BOOST_FIND_LIB([log_setup], [$1],
     [boost/log/utility/setup/from_settings.hpp],
     [boost::log::basic_settings<char> bs; bs.empty();])
 LIBS=$boost_log_setup_save_LIBS
 LDFLAGS=$boost_log_setup_save_LDFLAGS
 ])# BOOST_LOG_SETUP
 
 
 # BOOST_MATH()
 # ------------
 # Look for Boost.Math
 # TODO: This library isn't header-only but it comes in multiple different
 # flavors that don't play well with BOOST_FIND_LIB (e.g, libboost_math_c99,
 # libboost_math_c99f, libboost_math_c99l, libboost_math_tr1,
 # libboost_math_tr1f, libboost_math_tr1l).  This macro must be fixed to do the
 # right thing anyway.
 BOOST_DEFUN([Math],
 [BOOST_FIND_HEADER([boost/math/special_functions.hpp])])
 
 
 # BOOST_MPI([PREFERRED-RT-OPT])
 # -------------------------------
 # Look for Boost MPI.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.  Uses MPICXX variable if it is
 # set, otherwise tries CXX
 #
 BOOST_DEFUN([MPI],
 [boost_save_CXX=${CXX}
 boost_save_CXXCPP=${CXXCPP}
 if test x"${MPICXX}" != x; then
   CXX=${MPICXX}
   CXXCPP="${MPICXX} -E"
 fi
 BOOST_FIND_LIB([mpi], [$1],
                [boost/mpi.hpp],
                [int argc = 0;
                 char **argv = 0;
                 boost::mpi::environment env(argc,argv);])
 CXX=${boost_save_CXX}
 CXXCPP=${boost_save_CXXCPP}
 ])# BOOST_MPI
 
 
 # BOOST_MULTIARRAY()
 # ------------------
 # Look for Boost.MultiArray
 BOOST_DEFUN([MultiArray],
 [BOOST_FIND_HEADER([boost/multi_array.hpp])])
 
 
 # BOOST_NUMERIC_UBLAS()
 # --------------------------
 # Look for Boost.NumericUblas (Basic Linear Algebra)
 BOOST_DEFUN([Numeric_Ublas],
 [BOOST_FIND_HEADER([boost/numeric/ublas/vector.hpp])
 ])# BOOST_NUMERIC_UBLAS
 
 
 # BOOST_NUMERIC_CONVERSION()
 # --------------------------
 # Look for Boost.NumericConversion (policy-based numeric conversion)
 BOOST_DEFUN([Numeric_Conversion],
 [BOOST_FIND_HEADER([boost/numeric/conversion/converter.hpp])
 ])# BOOST_NUMERIC_CONVERSION
 
 
 # BOOST_OPTIONAL()
 # ----------------
 # Look for Boost.Optional
 BOOST_DEFUN([Optional],
 [BOOST_FIND_HEADER([boost/optional.hpp])])
 
 
 # BOOST_PREPROCESSOR()
 # --------------------
 # Look for Boost.Preprocessor
 BOOST_DEFUN([Preprocessor],
 [BOOST_FIND_HEADER([boost/preprocessor/repeat.hpp])])
 
 
 # BOOST_RANGE()
 # --------------------
 # Look for Boost.Range
 BOOST_DEFUN([Range],
 [BOOST_FIND_HEADER([boost/range/adaptors.hpp])])
 
 # BOOST_UNORDERED()
 # -----------------
 # Look for Boost.Unordered
 BOOST_DEFUN([Unordered],
 [BOOST_FIND_HEADER([boost/unordered_map.hpp])])
 
 
 # BOOST_UUID()
 # ------------
 # Look for Boost.Uuid
 BOOST_DEFUN([Uuid],
 [BOOST_FIND_HEADER([boost/uuid/uuid.hpp])])
 
 
 # BOOST_PROGRAM_OPTIONS([PREFERRED-RT-OPT])
 # -----------------------------------------
 # Look for Boost.Program_options.  For the documentation of PREFERRED-RT-OPT,
 # see the documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Program_Options],
 [BOOST_FIND_LIB([program_options], [$1],
                 [boost/program_options.hpp],
                 [boost::program_options::options_description d("test");])
 ])# BOOST_PROGRAM_OPTIONS
 
 
 
 # _BOOST_PYTHON_CONFIG(VARIABLE, FLAG)
 # ------------------------------------
 # Save VARIABLE, and define it via `python-config --FLAG`.
 # Substitute BOOST_PYTHON_VARIABLE.
 m4_define([_BOOST_PYTHON_CONFIG],
 [AC_SUBST([BOOST_PYTHON_$1],
           [`python-config --$2 2>/dev/null`])dnl
 boost_python_save_$1=$$1
 $1="$$1 $BOOST_PYTHON_$1"])
 
 
 # BOOST_PYTHON([PREFERRED-RT-OPT])
 # --------------------------------
 # Look for Boost.Python.  For the documentation of PREFERRED-RT-OPT,
 # see the documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Python],
 [_BOOST_PYTHON_CONFIG([CPPFLAGS], [includes])
 _BOOST_PYTHON_CONFIG([LDFLAGS],   [ldflags])
 _BOOST_PYTHON_CONFIG([LIBS],      [libs])
 m4_pattern_allow([^BOOST_PYTHON_MODULE$])dnl
 BOOST_FIND_LIBS([python], [python python3], [$1],
                 [boost/python.hpp],
                 [], [BOOST_PYTHON_MODULE(empty) {}])
 CPPFLAGS=$boost_python_save_CPPFLAGS
 LDFLAGS=$boost_python_save_LDFLAGS
 LIBS=$boost_python_save_LIBS
 ])# BOOST_PYTHON
 
 
 # BOOST_REF()
 # -----------
 # Look for Boost.Ref
 BOOST_DEFUN([Ref],
 [BOOST_FIND_HEADER([boost/ref.hpp])])
 
 
 # BOOST_REGEX([PREFERRED-RT-OPT])
 # -------------------------------
 # Look for Boost.Regex.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Regex],
 [BOOST_FIND_LIB([regex], [$1],
                 [boost/regex.hpp],
                 [boost::regex exp("*"); boost::regex_match("foo", exp);])
 ])# BOOST_REGEX
 
 
 # BOOST_SERIALIZATION([PREFERRED-RT-OPT])
 # ---------------------------------------
 # Look for Boost.Serialization.  For the documentation of PREFERRED-RT-OPT, see
 # the documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Serialization],
 [BOOST_FIND_LIB([serialization], [$1],
                 [boost/archive/text_oarchive.hpp],
                 [std::ostream* o = 0; // Cheap way to get an ostream...
                 boost::archive::text_oarchive t(*o);])
 ])# BOOST_SERIALIZATION
 
 
 # BOOST_SIGNALS([PREFERRED-RT-OPT])
 # ---------------------------------
 # Look for Boost.Signals.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Signals],
 [BOOST_FIND_LIB([signals], [$1],
                 [boost/signal.hpp],
                 [boost::signal<void ()> s;])
 ])# BOOST_SIGNALS
 
 
 # BOOST_SIGNALS2()
 # ----------------
 # Look for Boost.Signals2 (new since 1.39.0).
 BOOST_DEFUN([Signals2],
 [BOOST_FIND_HEADER([boost/signals2.hpp])
 ])# BOOST_SIGNALS2
 
 
 # BOOST_SMART_PTR()
 # -----------------
 # Look for Boost.SmartPtr
 BOOST_DEFUN([Smart_Ptr],
 [BOOST_FIND_HEADER([boost/scoped_ptr.hpp])
 BOOST_FIND_HEADER([boost/shared_ptr.hpp])
 ])
 
 
 # BOOST_STATICASSERT()
 # --------------------
 # Look for Boost.StaticAssert
 BOOST_DEFUN([StaticAssert],
 [BOOST_FIND_HEADER([boost/static_assert.hpp])])
 
 
 # BOOST_STRING_ALGO()
 # -------------------
 # Look for Boost.StringAlgo
 BOOST_DEFUN([String_Algo],
 [BOOST_FIND_HEADER([boost/algorithm/string.hpp])
 ])
 
 
 # BOOST_SYSTEM([PREFERRED-RT-OPT])
 # --------------------------------
 # Look for Boost.System.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.  This library was introduced in Boost
 # 1.35.0.
 BOOST_DEFUN([System],
 [BOOST_FIND_LIB([system], [$1],
                 [boost/system/error_code.hpp],
                 [boost::system::error_code e; e.clear();])
 ])# BOOST_SYSTEM
 
 
 # BOOST_TEST([PREFERRED-RT-OPT])
 # ------------------------------
 # Look for Boost.Test.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Test],
 [m4_pattern_allow([^BOOST_CHECK$])dnl
 BOOST_FIND_LIB([unit_test_framework], [$1],
                [boost/test/unit_test.hpp], [BOOST_CHECK(2 == 2);],
                [using boost::unit_test::test_suite;
                test_suite* init_unit_test_suite(int argc, char ** argv)
                { return NULL; }])
 ])# BOOST_TEST
 
 
 # BOOST_THREAD([PREFERRED-RT-OPT])
 # ---------------------------------
 # Look for Boost.Thread.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Thread],
 [dnl Having the pthread flag is required at least on GCC3 where
 dnl boost/thread.hpp would complain if we try to compile without
 dnl -pthread on GNU/Linux.
 AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl
 boost_thread_save_LIBS=$LIBS
 boost_thread_save_LDFLAGS=$LDFLAGS
 boost_thread_save_CPPFLAGS=$CPPFLAGS
 # Link-time dependency from thread to system was added as of 1.49.0.
 if test $boost_major_version -ge 149; then
 BOOST_SYSTEM([$1])
 fi # end of the Boost.System check.
 m4_pattern_allow([^BOOST_SYSTEM_(LIBS|LDFLAGS)$])dnl
 LIBS="$LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag"
 LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS"
 CPPFLAGS="$CPPFLAGS $boost_cv_pthread_flag"
 
 # When compiling for the Windows platform, the threads library is named
 # differently.  This suffix doesn't exist in new versions of Boost, or
 # possibly new versions of GCC on mingw I am assuming it's Boost's change for
 # now and I am setting version to 1.48, for lack of knowledge as to when this
 # change occurred.
 if test $boost_major_version -lt 148; then
   case $host_os in
     (*mingw*) boost_thread_lib_ext=_win32;;
   esac
 fi
 BOOST_FIND_LIBS([thread], [thread$boost_thread_lib_ext],
                 [$1],
                 [boost/thread.hpp], [boost::thread t; boost::mutex m;])
 
 case $host_os in
   (*mingw*) boost_thread_w32_socket_link=-lws2_32;;
 esac
 
 BOOST_THREAD_LIBS="$BOOST_THREAD_LIBS $BOOST_SYSTEM_LIBS $boost_cv_pthread_flag $boost_thread_w32_socket_link"
 BOOST_THREAD_LDFLAGS="$BOOST_SYSTEM_LDFLAGS"
 BOOST_CPPFLAGS="$BOOST_CPPFLAGS $boost_cv_pthread_flag"
 LIBS=$boost_thread_save_LIBS
 LDFLAGS=$boost_thread_save_LDFLAGS
 CPPFLAGS=$boost_thread_save_CPPFLAGS
 ])# BOOST_THREAD
 
 AU_ALIAS([BOOST_THREADS], [BOOST_THREAD])
 
 
 # BOOST_TOKENIZER()
 # -----------------
 # Look for Boost.Tokenizer
 BOOST_DEFUN([Tokenizer],
 [BOOST_FIND_HEADER([boost/tokenizer.hpp])])
 
 
 # BOOST_TRIBOOL()
 # ---------------
 # Look for Boost.Tribool
 BOOST_DEFUN([Tribool],
 [BOOST_FIND_HEADER([boost/logic/tribool_fwd.hpp])
 BOOST_FIND_HEADER([boost/logic/tribool.hpp])
 ])
 
 
 # BOOST_TUPLE()
 # -------------
 # Look for Boost.Tuple
 BOOST_DEFUN([Tuple],
 [BOOST_FIND_HEADER([boost/tuple/tuple.hpp])])
 
 
 # BOOST_TYPETRAITS()
 # --------------------
 # Look for Boost.TypeTraits
 BOOST_DEFUN([TypeTraits],
 [BOOST_FIND_HEADER([boost/type_traits.hpp])])
 
 
 # BOOST_UTILITY()
 # ---------------
 # Look for Boost.Utility (noncopyable, result_of, base-from-member idiom,
 # etc.)
 BOOST_DEFUN([Utility],
 [BOOST_FIND_HEADER([boost/utility.hpp])])
 
 
 # BOOST_VARIANT()
 # ---------------
 # Look for Boost.Variant.
 BOOST_DEFUN([Variant],
 [BOOST_FIND_HEADER([boost/variant/variant_fwd.hpp])
 BOOST_FIND_HEADER([boost/variant.hpp])])
 
 
 # BOOST_POINTER_CONTAINER()
 # ------------------------
 # Look for Boost.PointerContainer
 BOOST_DEFUN([Pointer_Container],
 [BOOST_FIND_HEADER([boost/ptr_container/ptr_deque.hpp])
 BOOST_FIND_HEADER([boost/ptr_container/ptr_list.hpp])
 BOOST_FIND_HEADER([boost/ptr_container/ptr_vector.hpp])
 BOOST_FIND_HEADER([boost/ptr_container/ptr_array.hpp])
 BOOST_FIND_HEADER([boost/ptr_container/ptr_set.hpp])
 BOOST_FIND_HEADER([boost/ptr_container/ptr_map.hpp])
 ])# BOOST_POINTER_CONTAINER
 
 
 # BOOST_WAVE([PREFERRED-RT-OPT])
 # ------------------------------
 # NOTE: If you intend to use Wave/Spirit with thread support, make sure you
 # call BOOST_THREAD first.
 # Look for Boost.Wave.  For the documentation of PREFERRED-RT-OPT, see the
 # documentation of BOOST_FIND_LIB above.
 BOOST_DEFUN([Wave],
 [AC_REQUIRE([BOOST_FILESYSTEM])dnl
 AC_REQUIRE([BOOST_DATE_TIME])dnl
 boost_wave_save_LIBS=$LIBS
 boost_wave_save_LDFLAGS=$LDFLAGS
 m4_pattern_allow([^BOOST_((FILE)?SYSTEM|DATE_TIME|THREAD)_(LIBS|LDFLAGS)$])dnl
 LIBS="$LIBS $BOOST_SYSTEM_LIBS $BOOST_FILESYSTEM_LIBS $BOOST_DATE_TIME_LIBS \
 $BOOST_THREAD_LIBS"
 LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS $BOOST_FILESYSTEM_LDFLAGS \
 $BOOST_DATE_TIME_LDFLAGS $BOOST_THREAD_LDFLAGS"
 BOOST_FIND_LIB([wave], [$1],
                 [boost/wave.hpp],
                 [boost::wave::token_id id; get_token_name(id);])
 LIBS=$boost_wave_save_LIBS
 LDFLAGS=$boost_wave_save_LDFLAGS
 ])# BOOST_WAVE
 
 
 # BOOST_XPRESSIVE()
 # -----------------
 # Look for Boost.Xpressive (new since 1.36.0).
 BOOST_DEFUN([Xpressive],
 [BOOST_FIND_HEADER([boost/xpressive/xpressive.hpp])])
 
 
 # ----------------- #
 # Internal helpers. #
 # ----------------- #
 
 
 # _BOOST_PTHREAD_FLAG()
 # ---------------------
 # Internal helper for BOOST_THREAD.  Computes boost_cv_pthread_flag
 # which must be used in CPPFLAGS and LIBS.
 #
 # Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3,
 # boost/thread.hpp will trigger a #error if -pthread isn't used:
 #   boost/config/requires_threads.hpp:47:5: #error "Compiler threading support
 #   is not turned on. Please set the correct command line options for
 #   threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
 #
 # Based on ACX_PTHREAD: http://autoconf-archive.cryp.to/acx_pthread.html
 AC_DEFUN([_BOOST_PTHREAD_FLAG],
 [AC_REQUIRE([AC_PROG_CXX])dnl
 AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_LANG_PUSH([C++])dnl
 AC_CACHE_CHECK([for the flags needed to use pthreads], [boost_cv_pthread_flag],
 [ boost_cv_pthread_flag=
   # The ordering *is* (sometimes) important.  Some notes on the
   # individual items follow:
   # (none): in case threads are in libc; should be tried before -Kthread and
   #       other compiler flags to prevent continual compiler warnings
   # -lpthreads: AIX (must check this before -lpthread)
   # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
   # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
   # -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
   # -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads)
   # -pthreads: Solaris/GCC
   # -mthreads: MinGW32/GCC, Lynx/GCC
   # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
   #      doesn't hurt to check since this sometimes defines pthreads too;
   #      also defines -D_REENTRANT)
   #      ... -mt is also the pthreads flag for HP/aCC
   # -lpthread: GNU Linux, etc.
   # --thread-safe: KAI C++
   case $host_os in #(
     *solaris*)
       # On Solaris (at least, for some versions), libc contains stubbed
       # (non-functional) versions of the pthreads routines, so link-based
       # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
       # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
       # a function called by this macro, so we could check for that, but
       # who knows whether they'll stub that too in a future libc.)  So,
       # we'll just look for -pthreads and -lpthread first:
       boost_pthread_flags="-pthreads -lpthread -mt -pthread";; #(
     *)
       boost_pthread_flags="-lpthreads -Kthread -kthread -llthread -pthread \
                            -pthreads -mthreads -lpthread --thread-safe -mt";;
   esac
   # Generate the test file.
   AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include <pthread.h>],
     [pthread_t th; pthread_join(th, 0);
     pthread_attr_init(0); pthread_cleanup_push(0, 0);
     pthread_create(0,0,0,0); pthread_cleanup_pop(0);])])
   for boost_pthread_flag in '' $boost_pthread_flags; do
     boost_pthread_ok=false
 dnl Re-use the test file already generated.
     boost_pthreads__save_LIBS=$LIBS
     LIBS="$LIBS $boost_pthread_flag"
     AC_LINK_IFELSE([],
       [if grep ".*$boost_pthread_flag" conftest.err; then
          echo "This flag seems to have triggered warnings" >&AS_MESSAGE_LOG_FD
        else
          boost_pthread_ok=:; boost_cv_pthread_flag=$boost_pthread_flag
        fi])
     LIBS=$boost_pthreads__save_LIBS
     $boost_pthread_ok && break
   done
 ])
 AC_LANG_POP([C++])dnl
 ])# _BOOST_PTHREAD_FLAG
 
 
 # _BOOST_gcc_test(MAJOR, MINOR)
 # -----------------------------
 # Internal helper for _BOOST_FIND_COMPILER_TAG.
 m4_define([_BOOST_gcc_test],
 ["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC @ gcc$1$2"])dnl
 
 # _BOOST_mingw_test(MAJOR, MINOR)
 # -----------------------------
 # Internal helper for _BOOST_FIND_COMPILER_TAG.
 m4_define([_BOOST_mingw_test],
 ["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC && \
   (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
          || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw$1$2"])dnl
 
 
 # _BOOST_FIND_COMPILER_TAG()
 # --------------------------
 # Internal.  When Boost is installed without --layout=system, each library
 # filename will hold a suffix that encodes the compiler used during the
 # build.  The Boost build system seems to call this a `tag'.
 AC_DEFUN([_BOOST_FIND_COMPILER_TAG],
 [AC_REQUIRE([AC_PROG_CXX])dnl
 AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_CACHE_CHECK([for the toolset name used by Boost for $CXX],
                [boost_cv_lib_tag],
 [boost_cv_lib_tag=unknown
 if test x$boost_cv_inc_path != xno; then
   AC_LANG_PUSH([C++])dnl
   # The following tests are mostly inspired by boost/config/auto_link.hpp
   # The list is sorted to most recent/common to oldest compiler (in order
   # to increase the likelihood of finding the right compiler with the
   # least number of compilation attempt).
   # Beware that some tests are sensible to the order (for instance, we must
   # look for MinGW before looking for GCC3).
   # I used one compilation test per compiler with a #error to recognize
   # each compiler so that it works even when cross-compiling (let me know
   # if you know a better approach).
   # Known missing tags (known from Boost's tools/build/v2/tools/common.jam):
   #   como, edg, kcc, bck, mp, sw, tru, xlc
   # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines
   # the same defines as GCC's).
   for i in \
     _BOOST_mingw_test(6, 1) \
     _BOOST_gcc_test(6, 1) \
+    _BOOST_mingw_test(5, 4) \
+    _BOOST_gcc_test(5, 4) \
     _BOOST_mingw_test(5, 3) \
     _BOOST_gcc_test(5, 3) \
     _BOOST_mingw_test(5, 2) \
     _BOOST_gcc_test(5, 2) \
     _BOOST_mingw_test(5, 1) \
     _BOOST_gcc_test(5, 1) \
     _BOOST_mingw_test(5, 0) \
     _BOOST_gcc_test(5, 0) \
     _BOOST_mingw_test(4, 10) \
     _BOOST_gcc_test(4, 10) \
     _BOOST_mingw_test(4, 9) \
     _BOOST_gcc_test(4, 9) \
     _BOOST_mingw_test(4, 8) \
     _BOOST_gcc_test(4, 8) \
     _BOOST_mingw_test(4, 7) \
     _BOOST_gcc_test(4, 7) \
     _BOOST_mingw_test(4, 6) \
     _BOOST_gcc_test(4, 6) \
     _BOOST_mingw_test(4, 5) \
     _BOOST_gcc_test(4, 5) \
     _BOOST_mingw_test(4, 4) \
     _BOOST_gcc_test(4, 4) \
     _BOOST_mingw_test(4, 3) \
     _BOOST_gcc_test(4, 3) \
     _BOOST_mingw_test(4, 2) \
     _BOOST_gcc_test(4, 2) \
     _BOOST_mingw_test(4, 1) \
     _BOOST_gcc_test(4, 1) \
     _BOOST_mingw_test(4, 0) \
     _BOOST_gcc_test(4, 0) \
     "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \
      && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \
          || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \
     _BOOST_gcc_test(3, 4) \
     _BOOST_gcc_test(3, 3) \
     "defined _MSC_VER && _MSC_VER >= 1500 @ vc90" \
     "defined _MSC_VER && _MSC_VER == 1400 @ vc80" \
     _BOOST_gcc_test(3, 2) \
     "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \
     _BOOST_gcc_test(3, 1) \
     _BOOST_gcc_test(3, 0) \
     "defined __BORLANDC__ @ bcb" \
     "defined __ICC && (defined __unix || defined __unix__) @ il" \
     "defined __ICL @ iw" \
     "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \
     _BOOST_gcc_test(2, 95) \
     "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \
     "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \
     "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \
     "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8"
   do
     boost_tag_test=`expr "X$i" : 'X\([[^@]]*\) @ '`
     boost_tag=`expr "X$i" : 'X[[^@]]* @ \(.*\)'`
     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #if $boost_tag_test
 /* OK */
 #else
 # error $boost_tag_test
 #endif
 ]])], [boost_cv_lib_tag=$boost_tag; break], [])
   done
 AC_LANG_POP([C++])dnl
   case $boost_cv_lib_tag in #(
     # Some newer (>= 1.35?) versions of Boost seem to only use "gcc" as opposed
     # to "gcc41" for instance.
     *-gcc | *'-gcc ') :;; #(  Don't re-add -gcc: it's already in there.
     gcc*)
       boost_tag_x=
       case $host_os in #(
         darwin*)
           if test $boost_major_version -ge 136; then
             # The `x' added in r46793 of Boost.
             boost_tag_x=x
           fi;;
       esac
       # We can specify multiple tags in this variable because it's used by
       # BOOST_FIND_LIB that does a `for tag in -$boost_cv_lib_tag' ...
       boost_cv_lib_tag="$boost_tag_x$boost_cv_lib_tag -${boost_tag_x}gcc"
       ;; #(
     unknown)
       AC_MSG_WARN([[could not figure out which toolset name to use for $CXX]])
       boost_cv_lib_tag=
       ;;
   esac
 fi])dnl end of AC_CACHE_CHECK
 ])# _BOOST_FIND_COMPILER_TAG
 
 
 # _BOOST_GUESS_WHETHER_TO_USE_MT()
 # --------------------------------
 # Compile a small test to try to guess whether we should favor MT (Multi
 # Thread) flavors of Boost.  Sets boost_guess_use_mt accordingly.
 AC_DEFUN([_BOOST_GUESS_WHETHER_TO_USE_MT],
 [# Check whether we do better use `mt' even though we weren't ask to.
 AC_LANG_PUSH([C++])dnl
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #if defined _REENTRANT || defined _MT || defined __MT__
 /* use -mt */
 #else
 # error MT not needed
 #endif
 ]])], [boost_guess_use_mt=:], [boost_guess_use_mt=false])
 AC_LANG_POP([C++])dnl
 ])
 
 # _BOOST_AC_LINK_IFELSE(PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
 # -------------------------------------------------------------------
 # Fork of _AC_LINK_IFELSE that preserves conftest.o across calls.  Fragile,
 # will break when Autoconf changes its internals.  Requires that you manually
 # rm -f conftest.$ac_objext in between to really different tests, otherwise
 # you will try to link a conftest.o left behind by a previous test.
 # Used to aggressively optimize BOOST_FIND_LIB (see the big comment in this
 # macro).
 #
 # Don't use "break" in the actions, as it would short-circuit some code
 # this macro runs after the actions.
 m4_define([_BOOST_AC_LINK_IFELSE],
 [m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl
 rm -f conftest$ac_exeext
 boost_save_ac_ext=$ac_ext
 boost_use_source=:
 # If we already have a .o, re-use it.  We change $ac_ext so that $ac_link
 # tries to link the existing object file instead of compiling from source.
 test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false &&
   _AS_ECHO_LOG([re-using the existing conftest.$ac_objext])
 AS_IF([_AC_DO_STDERR($ac_link) && {
          test -z "$ac_[]_AC_LANG_ABBREV[]_werror_flag" ||
          test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
          test "$cross_compiling" = yes ||
          $as_executable_p conftest$ac_exeext
 dnl FIXME: use AS_TEST_X instead when 2.61 is widespread enough.
        }],
       [$2],
       [if $boost_use_source; then
          _AC_MSG_LOG_CONFTEST
        fi
        $3])
 ac_objext=$boost_save_ac_objext
 ac_ext=$boost_save_ac_ext
 dnl Delete also the IPA/IPO (Inter Procedural Analysis/Optimization)
 dnl information created by the PGI compiler (conftest_ipa8_conftest.oo),
 dnl as it would interfere with the next link command.
 rm -f core conftest.err conftest_ipa8_conftest.oo \
       conftest$ac_exeext m4_ifval([$1], [conftest.$ac_ext])[]dnl
 ])# _BOOST_AC_LINK_IFELSE
 
 # Local Variables:
 # mode: autoconf
 # End: