   =========================================================================
   ==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
   ==  Version 2.0, in this case for the Apache Xalan Java distribution.  ==
   =========================================================================

   Apache Xalan (Xalan XSLT processor)
   Copyright 1999-2006 The Apache Software Foundation

   Apache Xalan (Xalan serializer)
   Copyright 1999-2006 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   =========================================================================
   Portions of this software was originally based on the following:
     - software copyright (c) 1999-2002, Lotus Development Corporation.,
       http://www.lotus.com.
     - software copyright (c) 2001-2002, Sun Microsystems.,
       http://www.sun.com.
     - software copyright (c) 2003, IBM Corporation., 
       http://www.ibm.com.
       
   =========================================================================
   The binary distribution package (ie. jars, samples and documentation) of
   this product includes software developed by the following:
       
     - The Apache Software Foundation 
         - Xerces Java - see LICENSE.txt 
         - JAXP 1.3 APIs - see LICENSE.txt
         - Bytecode Engineering Library - see LICENSE.txt
         - Regular Expression - see LICENSE.txt
       
     - Scott Hudson, Frank Flannery, C. Scott Ananian 
         - CUP Parser Generator runtime (javacup\runtime) - see LICENSE.txt 
 
   ========================================================================= 
   The source distribution package (ie. all source and tools required to build
   Xalan Java) of this product includes software developed by the following:
       
     - The Apache Software Foundation
         - Xerces Java - see LICENSE.txt 
         - JAXP 1.3 APIs - see LICENSE.txt
         - Bytecode Engineering Library - see LICENSE.txt
         - Regular Expression - see LICENSE.txt
         - Ant - see LICENSE.txt
         - Stylebook doc tool - see LICENSE.txt    
       
     - Elliot Joel Berk and C. Scott Ananian 
         - Lexical Analyzer Generator (JLex) - see LICENSE.txt

   =========================================================================       
   Apache Xerces Java
   Copyright 1999-2006 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   Portions of Apache Xerces Java in xercesImpl.jar and xml-apis.jar
   were originally based on the following:
     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
     - voluntary contributions made by Paul Eng on behalf of the 
       Apache Software Foundation that were originally developed at iClick, Inc.,
       software copyright (c) 1999.    

   =========================================================================   
   Apache xml-commons xml-apis (redistribution of xml-apis.jar)

   Apache XML Commons
   Copyright 2001-2003,2006 The Apache Software Foundation.

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   Portions of this software were originally based on the following:
     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
     - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org

