=========================================================================
The source code that makes up The Apache Open For Business Project
(Apache OFBiz) and the majority of the libraries distributed with it are
licensed under the Apache License Version 2.0.

Other licenses used by libraries distributed with Apache OFBiz are listed
below. This file includes a list of all libraries distributed with Apache
OFBiz and the full text of the license used for each.

For additional details, see the NOTICE file and:
http://cwiki.apache.org/confluence/display/OFBADMIN/Libraries+Included+in+OFBiz
=========================================================================
The following libraries are licensed under the Apache License Version 2.0:
ofbiz/trunk/framework/base/lib/ant-launcher-1.7.1.jar
ofbiz/trunk/framework/base/lib/ant-1.7.1.jar
ofbiz/trunk/framework/base/lib/ant-junit-1.7.1.jar
ofbiz/trunk/framework/base/lib/ant-trax-1.7.1.jar
ofbiz/trunk/framework/base/lib/ant/ant-apache-bsf-1.7.1.jar
ofbiz/trunk/framework/base/lib/ant/ant-nodeps-1.7.1.jar
ofbiz/trunk/framework/base/lib/avalon-framework-4.2.0.jar
ofbiz/trunk/framework/base/lib/avalon-util-exception-1.0.0.jar
ofbiz/trunk/framework/base/lib/batik-all-1.7.jar
ofbiz/trunk/framework/base/lib/barcode4j-fop-ext-complete-2.0.jar
ofbiz/trunk/framework/base/lib/clhm-release-1.0-lru.jar
ofbiz/trunk/framework/base/lib/httpclient-4.1.1.jar
ofbiz/trunk/framework/base/lib/httpclient-cache-4.1.1.jar
ofbiz/trunk/framework/base/lib/httpcore-4.1.jar
ofbiz/trunk/framework/base/lib/httpmime-4.1.1.jar
ofbiz/trunk/framework/base/lib/ivy-2.2.0.jar
ofbiz/trunk/framework/base/lib/jakarta-regexp-1.5.jar
ofbiz/trunk/framework/base/lib/jpim-0.1.jar
ofbiz/trunk/framework/base/lib/juel-2.2.1.jar
ofbiz/trunk/framework/base/lib/log4j-1.2.15.jar
ofbiz/trunk/framework/base/lib/mx4j-3.0.1.jar
ofbiz/trunk/framework/base/lib/mx4j-remote-3.0.1.jar
ofbiz/trunk/framework/base/lib/nekohtml.jar
ofbiz/trunk/framework/base/lib/resolver-2.9.1.jar
ofbiz/trunk/framework/base/lib/serializer-2.9.1.jar
ofbiz/trunk/framework/base/lib/ws-commons-java5-1.0.1.jar
ofbiz/trunk/framework/base/lib/ws-commons-util-1.0.2.jar
ofbiz/trunk/framework/base/lib/xercesImpl-2.9.1.jar
ofbiz/trunk/framework/base/lib/xml-apis-2.9.1.jar
ofbiz/trunk/framework/base/lib/commons/commons-beanutils-1.7.0.jar
ofbiz/trunk/framework/base/lib/commons/commons-cli-1.0.jar
ofbiz/trunk/framework/base/lib/commons/commons-codec-1.4.jar
ofbiz/trunk/framework/base/lib/commons/commons-collections-3.2.jar
ofbiz/trunk/framework/base/lib/commons/commons-digester-1.8.jar
ofbiz/trunk/framework/base/lib/commons/commons-discovery-0.4.jar
ofbiz/trunk/framework/base/lib/commons/commons-el-1.0.jar
ofbiz/trunk/framework/base/lib/commons/commons-fileupload-1.2.2.jar
ofbiz/trunk/framework/base/lib/commons/commons-io-1.3.1.jar
ofbiz/trunk/framework/base/lib/commons/commons-lang-2.4.jar
ofbiz/trunk/framework/base/lib/commons/commons-logging-1.1.jar
ofbiz/trunk/framework/base/lib/commons/commons-modeler-2.0.jar
ofbiz/trunk/framework/base/lib/commons/commons-net-1.4.1.jar
ofbiz/trunk/framework/base/lib/commons/commons-pool-1.3.jar
ofbiz/trunk/framework/base/lib/commons/commons-primitives-1.0.jar
ofbiz/trunk/framework/base/lib/commons/commons-validator-1.3.1
ofbiz/trunk/framework/base/lib/commons/commons-vfs-20070730.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-activation_1.0.2_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-j2ee-connector_1.5_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-jaxr_1.0_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-jaxrpc_1.1_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-jms_1.1_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-jta_1.1_spec-1.1.1.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-qname_1.1_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/geronimo-saaj_1.1_spec-1.0.jar
ofbiz/trunk/framework/base/lib/j2eespecs/tomcat-6.0.32-annotations-api.jar
ofbiz/trunk/framework/base/lib/j2eespecs/tomcat-6.0.32-el-api.jar
ofbiz/trunk/framework/base/lib/j2eespecs/tomcat-6.0.32-jsp-api.jar
ofbiz/trunk/framework/base/lib/j2eespecs/tomcat-6.0.32-servlet-api.jar
ofbiz/trunk/framework/base/lib/scripting/bsf-2.4.0.jar
ofbiz/trunk/framework/base/lib/scripting/jakarta-oro-2.0.8.jar
ofbiz/trunk/framework/base/lib/scripting/groovy-all-1.7.7.jar
ofbiz/trunk/framework/base/lib/scripting/jansi-1.2.1.jar
ofbiz/trunk/framework/base/lib/xmlrpc-client-3.1.2.jar
ofbiz/trunk/framework/base/lib/xmlrpc-common-3.1.2.jar
ofbiz/trunk/framework/base/lib/xmlrpc-server-3.1.2.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-catalina-ha.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-catalina-tribes.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-catalina.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-jasper-el.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-jasper.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-tomcat-coyote.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-tomcat-dbcp.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-tomcat-juli.jar
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.32-tomcat-juli-adapters.jar
ofbiz/trunk/framework/entity/lib/commons-dbcp-1.3-20091113-r835956.jar
ofbiz/trunk/framework/entity/lib/jdbc/derby-10.8.1.2.jar
ofbiz/trunk/framework/entity/lib/jdbc/derbytools-10.8.1.2.jar
ofbiz/trunk/framework/jetty/lib/ant-1.6.5.jar
ofbiz/trunk/framework/jetty/lib/jasper-compiler-5.5.15.jar
ofbiz/trunk/framework/jetty/lib/jasper-compiler-jdt-5.5.15.jar
ofbiz/trunk/framework/jetty/lib/jasper-runtime-5.5.15.jar
ofbiz/trunk/framework/jetty/lib/jetty-6.1.11.jar
ofbiz/trunk/framework/jetty/lib/jetty-ajp-6.1.11.jar
ofbiz/trunk/framework/jetty/lib/jetty-sslengine-6.1.11.jar
ofbiz/trunk/framework/jetty/lib/jetty-util-6.1.11.jar
ofbiz/trunk/framework/jetty/lib/xmlParserAPIs-2.6.2.jar
ofbiz/trunk/framework/service/lib/axis-ant.jar
ofbiz/trunk/framework/service/lib/axis.jar
ofbiz/trunk/framework/service/lib/axiom-api-1.2.9.jar
ofbiz/trunk/framework/service/lib/axiom-impl-1.2.9.jar
ofbiz/trunk/framework/service/lib/axis2-kernel-1.5.2.jar
ofbiz/trunk/framework/service/lib/axis2-transport-http-1.5.2.jar
ofbiz/trunk/framework/service/lib/axis2-transport-local-1.5.2.jar
ofbiz/trunk/framework/service/lib/commons-httpclient-3.1.jar
ofbiz/trunk/framework/service/lib/neethi-2.0.4.jar
ofbiz/trunk/framework/service/lib/XmlSchema-1.4.3.jar
ofbiz/trunk/framework/testtools/lib/selenium-java-client-driver.jar
ofbiz/trunk/framework/webapp/lib/fop-1.0.jar
ofbiz/trunk/framework/webapp/lib/velocity-1.6.1.jar
ofbiz/trunk/framework/webapp/lib/xmlgraphics-commons-1.4.jar
ofbiz/trunk/framework/webapp/lib/json-lib-2.2.3-jdk15.jar
ofbiz/trunk/framework/webapp/lib/ezmorph-0.9.1.jar
ofbiz/trunk/framework/webapp/lib/rome-0.9.jar
ofbiz/trunk/framework/webapp/lib/serializer-2.7.0.jar
ofbiz/trunk/framework/webapp/lib/xalan-2.7.1.jar
ofbiz/trunk/framework/geronimo/lib/geronimo-connector-2.1.1.jar
ofbiz/trunk/framework/geronimo/lib/geronimo-transaction-2.1.1.jar
ofbiz/trunk/framework/base/lib/webslinger-base-invoker-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-cache-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-collections-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-collections-arrays-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-concurrent-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-html-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-invoker-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-io-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-javacc-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-junit-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-lang-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-logging-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-resolver-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-util-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-base-xml-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-catalina-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-cgi-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-embryo-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-beanshell-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-bsf-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-code-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-commonsvfs-object-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-directory-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-freemarker-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-groovy-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-image-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-janino-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-jruby-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-jython-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-nutch-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-plan9-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-quercus-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-rhino-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-servlet-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-template-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-velocity-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-extension-wiki-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/framework/webslinger/lib/webslinger-launcher-20091211-3897-7ab22baea4b6.jar
ofbiz/trunk/applications/content/lib/fontbox-1.4.0.jar
ofbiz/trunk/applications/content/lib/jempbox-1.4.0.jar
ofbiz/trunk/applications/content/lib/lucene-core-3.0.3.jar
ofbiz/trunk/applications/content/lib/metadata-extractor-2.4.0.jar
ofbiz/trunk/applications/content/lib/pdfbox-1.4.0.jar
ofbiz/trunk/applications/content/lib/poi-3.7.jar
ofbiz/trunk/applications/content/lib/poi-ooxml-3.7.jar
ofbiz/trunk/applications/content/lib/poi-scratchpad-3.7.jar
ofbiz/trunk/applications/content/lib/tika-core-0.9.jar
ofbiz/trunk/applications/content/lib/tika-parsers-0.9.jar
ofbiz/trunk/applications/product/lib/dozer-4.2.1.jar
ofbiz/trunk/applications/product/lib/watermarker-0.0.4.jar
ofbiz/trunk/specialpurpose/googlecheckout/lib/checkout-sdk-0.8.8.jar
=========================================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2001-2008 The Apache Software Foundation

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
Apache Software License:
ofbiz/trunk/framework/webapp/lib/DataVision-1.0.0.jar
ofbiz/trunk/framework/base/lib/ant/ant-contrib-1.0b3.jar
=========================================================================
Apache Software License

Version 1.1

Copyright (c) 2000 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment:

"This product includes software developed by the Apache Software Foundation
(http://www.apache.org/)."

Alternately, this acknowledgment may appear in the software itself, if and
wherever such third-party acknowledgments normally appear.

4. The names "Apache" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior written
permission. For written permission, please contact apache@apache.org.

5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the Apache
Software Foundation.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE
SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software consists of voluntary contributions made by many individuals on
behalf of the Apache Software Foundation. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.

Portions of this software are based upon public domain software originally
written at the National Center for Supercomputing Applications, University of
Illinois, Urbana-Champaign.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
JDOM (Modified Apache)  License:
ofbiz/trunk/framework/webapp/lib/jdom-1.1.jar
=========================================================================
The JDOM License
 Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin.
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:

 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions, and the following disclaimer.

 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions, and the disclaimer that follows
    these conditions in the documentation and/or other materials
    provided with the distribution.

 3. The name "JDOM" must not be used to endorse or promote products
    derived from this software without prior written permission.  For
    written permission, please contact <request_AT_jdom_DOT_org>.

 4. Products derived from this software may not be called "JDOM", nor
    may "JDOM" appear in their name, without prior written permission
    from the JDOM Project Management <request_AT_jdom_DOT_org>.

 In addition, we request (but do not require) that you include in the
 end-user documentation provided with the redistribution and/or in the
 software itself an acknowledgement equivalent to the following:
     "This product includes software developed by the
      JDOM Project (http://www.jdom.org/)."
 Alternatively, the acknowledgment may be graphical using the logos
 available at http://www.jdom.org/images/logos.

 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 SUCH DAMAGE.

 This software consists of voluntary contributions made by many
 individuals on behalf of the JDOM Project and was originally
 created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
 Brett McLaughlin <brett_AT_jdom_DOT_org>.  For more information
 on the JDOM Project, please see <http://www.jdom.org/>

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
BSD License:
ofbiz/trunk/framework/base/lib/antisamy-bin.1.2.jar
ofbiz/trunk/framework/base/lib/freemarker-2.3.10.jar
ofbiz/trunk/framework/base/lib/hamcrest-all-1.2.jar
ofbiz/trunk/framework/base/lib/httpunit.jar
ofbiz/trunk/framework/base/lib/ical4j-1.0.jar
ofbiz/trunk/lib/build/javacc/javacc.jar (5.0)
ofbiz/trunk/framework/base/lib/javolution-5.4.3.jar
ofbiz/trunk/framework/base/lib/junitperf.jar
ofbiz/trunk/framework/base/lib/xpp3_min-1.1.4c.jar
ofbiz/trunk/framework/base/lib/xstream-1.3.1.jar
ofbiz/trunk/framework/base/lib/owasp-esapi-full-java-1.4.jar
ofbiz/trunk/framework/base/lib/scripting/antlr-2.7.6.jar
ofbiz/trunk/framework/base/lib/scripting/asm-3.2.jar
ofbiz/trunk/framework/base/lib/scripting/asm-analysis-3.2.jar
ofbiz/trunk/framework/base/lib/scripting/asm-tree-3.2.jar
ofbiz/trunk/framework/base/lib/scripting/asm-util-3.2.jar
ofbiz/trunk/framework/base/lib/scripting/janino-2.5.15.jar
ofbiz/trunk/framework/base/lib/scripting/jline-0.9.94.jar
ofbiz/trunk/specialpurpose/ldap/lib/cas-server-core-3.3.jar
ofbiz/trunk/specialpurpose/pos/lib/looks-2.0.2.jar

=========================================================================
The BSD License

The following is a BSD license template. To generate your own license, change
the values of OWNER, ORGANIZATION and YEAR from their original values as given
here, and substitute your own.

Note: The advertising clause in the license appearing on BSD Unix files was
officially rescinded by the Director of the Office of Technology Licensing of
the University of California on July 22 1999. He states that clause 3 is
"hereby deleted in its entirety."

Note the new BSD license is thus equivalent to the MIT License, except for the
no-endorsement final clause.

<OWNER> = Regents of the University of California
<ORGANIZATION> = University of California, Berkeley
<YEAR> = 1998

In the original BSD license, both occurrences of the phrase "COPYRIGHT HOLDERS
AND CONTRIBUTORS" in the disclaimer read "REGENTS AND CONTRIBUTORS".

Here is the license template:

Copyright (c) <YEAR>, <OWNER>
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

Neither the name of the <ORGANIZATION> nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
Mozilla Public License Version 1.1:
ofbiz/trunk/framework/guiapp/lib/XuiCoreSwing-v3.2rc2b.jar
ofbiz/trunk/framework/guiapp/lib/XuiOptional-v3.2rc2b.jar
ofbiz/trunk/framework/webapp/lib/iText-2.1.7.jar
=========================================================================
                          MOZILLA PUBLIC LICENSE
                                Version 1.1

                              ---------------

1. Definitions.

     1.0.1. "Commercial Use" means distribution or otherwise making the
     Covered Code available to a third party.

     1.1. "Contributor" means each entity that creates or contributes to
     the creation of Modifications.

     1.2. "Contributor Version" means the combination of the Original
     Code, prior Modifications used by a Contributor, and the Modifications
     made by that particular Contributor.

     1.3. "Covered Code" means the Original Code or Modifications or the
     combination of the Original Code and Modifications, in each case
     including portions thereof.

     1.4. "Electronic Distribution Mechanism" means a mechanism generally
     accepted in the software development community for the electronic
     transfer of data.

     1.5. "Executable" means Covered Code in any form other than Source
     Code.

     1.6. "Initial Developer" means the individual or entity identified
     as the Initial Developer in the Source Code notice required by Exhibit
     A.

     1.7. "Larger Work" means a work which combines Covered Code or
     portions thereof with code not governed by the terms of this License.

     1.8. "License" means this document.

     1.8.1. "Licensable" means having the right to grant, to the maximum
     extent possible, whether at the time of the initial grant or
     subsequently acquired, any and all of the rights conveyed herein.

     1.9. "Modifications" means any addition to or deletion from the
     substance or structure of either the Original Code or any previous
     Modifications. When Covered Code is released as a series of files, a
     Modification is:
          A. Any addition to or deletion from the contents of a file
          containing Original Code or previous Modifications.

          B. Any new file that contains any part of the Original Code or
          previous Modifications.

     1.10. "Original Code" means Source Code of computer software code
     which is described in the Source Code notice required by Exhibit A as
     Original Code, and which, at the time of its release under this
     License is not already Covered Code governed by this License.

     1.10.1. "Patent Claims" means any patent claim(s), now owned or
     hereafter acquired, including without limitation,  method, process,
     and apparatus claims, in any patent Licensable by grantor.

     1.11. "Source Code" means the preferred form of the Covered Code for
     making modifications to it, including all modules it contains, plus
     any associated interface definition files, scripts used to control
     compilation and installation of an Executable, or source code
     differential comparisons against either the Original Code or another
     well known, available Covered Code of the Contributor's choice. The
     Source Code can be in a compressed or archival form, provided the
     appropriate decompression or de-archiving software is widely available
     for no charge.

     1.12. "You" (or "Your")  means an individual or a legal entity
     exercising rights under, and complying with all of the terms of, this
     License or a future version of this License issued under Section 6.1.
     For legal entities, "You" includes any entity which controls, is
     controlled by, or is under common control with You. For purposes of
     this definition, "control" means (a) the power, direct or indirect,
     to cause the direction or management of such entity, whether by
     contract or otherwise, or (b) ownership of more than fifty percent
     (50%) of the outstanding shares or beneficial ownership of such
     entity.

2. Source Code License.

     2.1. The Initial Developer Grant.
     The Initial Developer hereby grants You a world-wide, royalty-free,
     non-exclusive license, subject to third party intellectual property
     claims:
          (a)  under intellectual property rights (other than patent or
          trademark) Licensable by Initial Developer to use, reproduce,
          modify, display, perform, sublicense and distribute the Original
          Code (or portions thereof) with or without Modifications, and/or
          as part of a Larger Work; and

          (b) under Patents Claims infringed by the making, using or
          selling of Original Code, to make, have made, use, practice,
          sell, and offer for sale, and/or otherwise dispose of the
          Original Code (or portions thereof).

          (c) the licenses granted in this Section 2.1(a) and (b) are
          effective on the date Initial Developer first distributes
          Original Code under the terms of this License.

          (d) Notwithstanding Section 2.1(b) above, no patent license is
          granted: 1) for code that You delete from the Original Code; 2)
          separate from the Original Code;  or 3) for infringements caused
          by: i) the modification of the Original Code or ii) the
          combination of the Original Code with other software or devices.

     2.2. Contributor Grant.
     Subject to third party intellectual property claims, each Contributor
     hereby grants You a world-wide, royalty-free, non-exclusive license

          (a)  under intellectual property rights (other than patent or
          trademark) Licensable by Contributor, to use, reproduce, modify,
          display, perform, sublicense and distribute the Modifications
          created by such Contributor (or portions thereof) either on an
          unmodified basis, with other Modifications, as Covered Code
          and/or as part of a Larger Work; and

          (b) under Patent Claims infringed by the making, using, or
          selling of  Modifications made by that Contributor either alone
          and/or in combination with its Contributor Version (or portions
          of such combination), to make, use, sell, offer for sale, have
          made, and/or otherwise dispose of: 1) Modifications made by that
          Contributor (or portions thereof); and 2) the combination of
          Modifications made by that Contributor with its Contributor
          Version (or portions of such combination).

          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
          effective on the date Contributor first makes Commercial Use of
          the Covered Code.

          (d)    Notwithstanding Section 2.2(b) above, no patent license is
          granted: 1) for any code that Contributor has deleted from the
          Contributor Version; 2)  separate from the Contributor Version;
          3)  for infringements caused by: i) third party modifications of
          Contributor Version or ii)  the combination of Modifications made
          by that Contributor with other software  (except as part of the
          Contributor Version) or other devices; or 4) under Patent Claims
          infringed by Covered Code in the absence of Modifications made by
          that Contributor.

3. Distribution Obligations.

     3.1. Application of License.
     The Modifications which You create or to which You contribute are
     governed by the terms of this License, including without limitation
     Section 2.2. The Source Code version of Covered Code may be
     distributed only under the terms of this License or a future version
     of this License released under Section 6.1, and You must include a
     copy of this License with every copy of the Source Code You
     distribute. You may not offer or impose any terms on any Source Code
     version that alters or restricts the applicable version of this
     License or the recipients' rights hereunder. However, You may include
     an additional document offering the additional rights described in
     Section 3.5.

     3.2. Availability of Source Code.
     Any Modification which You create or to which You contribute must be
     made available in Source Code form under the terms of this License
     either on the same media as an Executable version or via an accepted
     Electronic Distribution Mechanism to anyone to whom you made an
     Executable version available; and if made available via Electronic
     Distribution Mechanism, must remain available for at least twelve (12)
     months after the date it initially became available, or at least six
     (6) months after a subsequent version of that particular Modification
     has been made available to such recipients. You are responsible for
     ensuring that the Source Code version remains available even if the
     Electronic Distribution Mechanism is maintained by a third party.

     3.3. Description of Modifications.
     You must cause all Covered Code to which You contribute to contain a
     file documenting the changes You made to create that Covered Code and
     the date of any change. You must include a prominent statement that
     the Modification is derived, directly or indirectly, from Original
     Code provided by the Initial Developer and including the name of the
     Initial Developer in (a) the Source Code, and (b) in any notice in an
     Executable version or related documentation in which You describe the
     origin or ownership of the Covered Code.

     3.4. Intellectual Property Matters
          (a) Third Party Claims.
          If Contributor has knowledge that a license under a third party's
          intellectual property rights is required to exercise the rights
          granted by such Contributor under Sections 2.1 or 2.2,
          Contributor must include a text file with the Source Code
          distribution titled "LEGAL" which describes the claim and the
          party making the claim in sufficient detail that a recipient will
          know whom to contact. If Contributor obtains such knowledge after
          the Modification is made available as described in Section 3.2,
          Contributor shall promptly modify the LEGAL file in all copies
          Contributor makes available thereafter and shall take other steps
          (such as notifying appropriate mailing lists or newsgroups)
          reasonably calculated to inform those who received the Covered
          Code that new knowledge has been obtained.

          (b) Contributor APIs.
          If Contributor's Modifications include an application programming
          interface and Contributor has knowledge of patent licenses which
          are reasonably necessary to implement that API, Contributor must
          also include this information in the LEGAL file.

               (c)    Representations.
          Contributor represents that, except as disclosed pursuant to
          Section 3.4(a) above, Contributor believes that Contributor's
          Modifications are Contributor's original creation(s) and/or
          Contributor has sufficient rights to grant the rights conveyed by
          this License.

     3.5. Required Notices.
     You must duplicate the notice in Exhibit A in each file of the Source
     Code.  If it is not possible to put such notice in a particular Source
     Code file due to its structure, then You must include such notice in a
     location (such as a relevant directory) where a user would be likely
     to look for such a notice.  If You created one or more Modification(s)
     You may add your name as a Contributor to the notice described in
     Exhibit A.  You must also duplicate this License in any documentation
     for the Source Code where You describe recipients' rights or ownership
     rights relating to Covered Code.  You may choose to offer, and to
     charge a fee for, warranty, support, indemnity or liability
     obligations to one or more recipients of Covered Code. However, You
     may do so only on Your own behalf, and not on behalf of the Initial
     Developer or any Contributor. You must make it absolutely clear than
     any such warranty, support, indemnity or liability obligation is
     offered by You alone, and You hereby agree to indemnify the Initial
     Developer and every Contributor for any liability incurred by the
     Initial Developer or such Contributor as a result of warranty,
     support, indemnity or liability terms You offer.

     3.6. Distribution of Executable Versions.
     You may distribute Covered Code in Executable form only if the
     requirements of Section 3.1-3.5 have been met for that Covered Code,
     and if You include a notice stating that the Source Code version of
     the Covered Code is available under the terms of this License,
     including a description of how and where You have fulfilled the
     obligations of Section 3.2. The notice must be conspicuously included
     in any notice in an Executable version, related documentation or
     collateral in which You describe recipients' rights relating to the
     Covered Code. You may distribute the Executable version of Covered
     Code or ownership rights under a license of Your choice, which may
     contain terms different from this License, provided that You are in
     compliance with the terms of this License and that the license for the
     Executable version does not attempt to limit or alter the recipient's
     rights in the Source Code version from the rights set forth in this
     License. If You distribute the Executable version under a different
     license You must make it absolutely clear that any terms which differ
     from this License are offered by You alone, not by the Initial
     Developer or any Contributor. You hereby agree to indemnify the
     Initial Developer and every Contributor for any liability incurred by
     the Initial Developer or such Contributor as a result of any such
     terms You offer.

     3.7. Larger Works.
     You may create a Larger Work by combining Covered Code with other code
     not governed by the terms of this License and distribute the Larger
     Work as a single product. In such a case, You must make sure the
     requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.

     If it is impossible for You to comply with any of the terms of this
     License with respect to some or all of the Covered Code due to
     statute, judicial order, or regulation then You must: (a) comply with
     the terms of this License to the maximum extent possible; and (b)
     describe the limitations and the code they affect. Such description
     must be included in the LEGAL file described in Section 3.4 and must
     be included with all distributions of the Source Code. Except to the
     extent prohibited by statute or regulation, such description must be
     sufficiently detailed for a recipient of ordinary skill to be able to
     understand it.

5. Application of this License.

     This License applies to code to which the Initial Developer has
     attached the notice in Exhibit A and to related Covered Code.

6. Versions of the License.

     6.1. New Versions.
     Netscape Communications Corporation ("Netscape") may publish revised
     and/or new versions of the License from time to time. Each version
     will be given a distinguishing version number.

     6.2. Effect of New Versions.
     Once Covered Code has been published under a particular version of the
     License, You may always continue to use it under the terms of that
     version. You may also choose to use such Covered Code under the terms
     of any subsequent version of the License published by Netscape. No one
     other than Netscape has the right to modify the terms applicable to
     Covered Code created under this License.

     6.3. Derivative Works.
     If You create or use a modified version of this License (which you may
     only do in order to apply it to code which is not already Covered Code
     governed by this License), You must (a) rename Your license so that
     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
     "MPL", "NPL" or any confusingly similar phrase do not appear in your
     license (except to note that your license differs from this License)
     and (b) otherwise make it clear that Your version of the license
     contains terms which differ from the Mozilla Public License and
     Netscape Public License. (Filling in the name of the Initial
     Developer, Original Code or Contributor in the notice described in
     Exhibit A shall not of themselves be deemed to be modifications of
     this License.)

7. DISCLAIMER OF WARRANTY.

     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

8. TERMINATION.

     8.1.  This License and the rights granted hereunder will terminate
     automatically if You fail to comply with terms herein and fail to cure
     such breach within 30 days of becoming aware of the breach. All
     sublicenses to the Covered Code which are properly granted shall
     survive any termination of this License. Provisions which, by their
     nature, must remain in effect beyond the termination of this License
     shall survive.

     8.2.  If You initiate litigation by asserting a patent infringement
     claim (excluding declatory judgment actions) against Initial Developer
     or a Contributor (the Initial Developer or Contributor against whom
     You file such action is referred to as "Participant")  alleging that:

     (a)  such Participant's Contributor Version directly or indirectly
     infringes any patent, then any and all rights granted by such
     Participant to You under Sections 2.1 and/or 2.2 of this License
     shall, upon 60 days notice from Participant terminate prospectively,
     unless if within 60 days after receipt of notice You either: (i)
     agree in writing to pay Participant a mutually agreeable reasonable
     royalty for Your past and future use of Modifications made by such
     Participant, or (ii) withdraw Your litigation claim with respect to
     the Contributor Version against such Participant.  If within 60 days
     of notice, a reasonable royalty and payment arrangement are not
     mutually agreed upon in writing by the parties or the litigation claim
     is not withdrawn, the rights granted by Participant to You under
     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
     the 60 day notice period specified above.

     (b)  any software, hardware, or device, other than such Participant's
     Contributor Version, directly or indirectly infringes any patent, then
     any rights granted to You by such Participant under Sections 2.1(b)
     and 2.2(b) are revoked effective as of the date You first made, used,
     sold, distributed, or had made, Modifications made by that
     Participant.

     8.3.  If You assert a patent infringement claim against Participant
     alleging that such Participant's Contributor Version directly or
     indirectly infringes any patent where such claim is resolved (such as
     by license or settlement) prior to the initiation of patent
     infringement litigation, then the reasonable value of the licenses
     granted by such Participant under Sections 2.1 or 2.2 shall be taken
     into account in determining the amount or value of any payment or
     license.

     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
     all end user license agreements (excluding distributors and resellers)
     which have been validly granted by You or any distributor hereunder
     prior to termination shall survive termination.

9. LIMITATION OF LIABILITY.

     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.

10. U.S. GOVERNMENT END USERS.

     The Covered Code is a "commercial item," as that term is defined in
     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
     software" and "commercial computer software documentation," as such
     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
     all U.S. Government End Users acquire Covered Code with only those
     rights set forth herein.

11. MISCELLANEOUS.

     This License represents the complete agreement concerning subject
     matter hereof. If any provision of this License is held to be
     unenforceable, such provision shall be reformed only to the extent
     necessary to make it enforceable. This License shall be governed by
     California law provisions (except to the extent applicable law, if
     any, provides otherwise), excluding its conflict-of-law provisions.
     With respect to disputes in which at least one party is a citizen of,
     or an entity chartered or registered to do business in the United
     States of America, any litigation relating to this License shall be
     subject to the jurisdiction of the Federal Courts of the Northern
     District of California, with venue lying in Santa Clara County,
     California, with the losing party responsible for costs, including
     without limitation, court costs and reasonable attorneys' fees and
     expenses. The application of the United Nations Convention on
     Contracts for the International Sale of Goods is expressly excluded.
     Any law or regulation which provides that the language of a contract
     shall be construed against the drafter shall not apply to this
     License.

12. RESPONSIBILITY FOR CLAIMS.

     As between Initial Developer and the Contributors, each party is
     responsible for claims and damages arising, directly or indirectly,
     out of its utilization of rights under this License and You agree to
     work with Initial Developer and Contributors to distribute such
     responsibility on an equitable basis. Nothing herein is intended or
     shall be deemed to constitute any admission of liability.

13. MULTIPLE-LICENSED CODE.

     Initial Developer may designate portions of the Covered Code as
     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
     Developer permits you to utilize portions of the Covered Code under
     Your choice of the NPL or the alternative licenses, if any, specified
     by the Initial Developer in the file described in Exhibit A.

EXHIBIT A -Mozilla Public License.

     ``The contents of this file are subject to the Mozilla Public License
     Version 1.1 (the "License"); you may not use this file except in
     compliance with the License. You may obtain a copy of the License at
     http://www.mozilla.org/MPL/

     Software distributed under the License is distributed on an "AS IS"
     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
     License for the specific language governing rights and limitations
     under the License.

     The Original Code is ______________________________________.

     The Initial Developer of the Original Code is ________________________.
     Portions created by ______________________ are Copyright (C) ______
     _______________________. All Rights Reserved.

     Contributor(s): ______________________________________.

     Alternatively, the contents of this file may be used under the terms
     of the _____ license (the  "[___] License"), in which case the
     provisions of [______] License are applicable instead of those
     above.  If you wish to allow use of your version of this file only
     under the terms of the [____] License and not to allow others to use
     your version of this file under the MPL, indicate your decision by
     deleting  the provisions above and replace  them with the notice and
     other provisions required by the [___] License.  If you do not delete
     the provisions above, a recipient may use your version of this file
     under either the MPL or the [___] License."

     [NOTE: The text of this Exhibit A may differ slightly from the text of
     the notices in the Source Code files of the Original Code. You should
     use the text of this Exhibit A rather than the text found in the
     Original Code Source Code for Your Modifications.]

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
Common Public License:
ofbiz/trunk/specialpurpose/pos/lib/jcl.jar
ofbiz/trunk/specialpurpose/pos/lib/jpos18-controls.jar
ofbiz/trunk/framework/service/lib/wsdl4j.jar
ofbiz/trunk/framework/base/lib/junit.jar
=========================================================================
Common Public License Version 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

    a) in the case of the initial Contributor, the initial code and
documentation distributed under this Agreement, and

    b) in the case of each subsequent Contributor:

    i) changes to the Program, and

    ii) additions to the Program;

    where such changes and/or additions to the Program originate from and are
distributed by that particular Contributor. A Contribution 'originates' from a
Contributor if it was added to the Program by such Contributor itself or anyone
acting on such Contributor's behalf. Contributions do not include additions to
the Program which: (i) are separate modules of software distributed in
conjunction with the Program under their own license agreement, and (ii) are not
derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents " mean patent claims licensable by a Contributor which are
necessarily infringed by the use or sale of its Contribution alone or when
combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement,
including all Contributors.

2. GRANT OF RIGHTS

    a) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free copyright license to
reproduce, prepare derivative works of, publicly display, publicly perform,
distribute and sublicense the Contribution of such Contributor, if any, and such
derivative works, in source code and object code form.

    b) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
Patents to make, use, sell, offer to sell, import and otherwise transfer the
Contribution of such Contributor, if any, in source code and object code form.
This patent license shall apply to the combination of the Contribution and the
Program if, at the time the Contribution is added by the Contributor, such
addition of the Contribution causes such combination to be covered by the
Licensed Patents. The patent license shall not apply to any other combinations
which include the Contribution. No hardware per se is licensed hereunder.

    c) Recipient understands that although each Contributor grants the licenses
to its Contributions set forth herein, no assurances are provided by any
Contributor that the Program does not infringe the patent or other intellectual
property rights of any other entity. Each Contributor disclaims any liability to
Recipient for claims brought by any other entity based on infringement of
intellectual property rights or otherwise. As a condition to exercising the
rights and licenses granted hereunder, each Recipient hereby assumes sole
responsibility to secure any other intellectual property rights needed, if any.
For example, if a third party patent license is required to allow Recipient to
distribute the Program, it is Recipient's responsibility to acquire that license
before distributing the Program.

    d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright license set
forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its
own license agreement, provided that:

    a) it complies with the terms and conditions of this Agreement; and

    b) its license agreement:

    i) effectively disclaims on behalf of all Contributors all warranties and
conditions, express and implied, including warranties or conditions of title and
non-infringement, and implied warranties or conditions of merchantability and
fitness for a particular purpose;

    ii) effectively excludes on behalf of all Contributors all liability for
damages, including direct, indirect, special, incidental and consequential
damages, such as lost profits;

    iii) states that any provisions which differ from this Agreement are offered
by that Contributor alone and not by any other party; and

    iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable manner on or
through a medium customarily used for software exchange.

When the Program is made available in source code form:

    a) it must be made available under this Agreement; and

    b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the
Program.

Each Contributor must identify itself as the originator of its Contribution, if
any, in a manner that reasonably allows subsequent Recipients to identify the
originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with
respect to end users, business partners and the like. While this license is
intended to facilitate the commercial use of the Program, the Contributor who
includes the Program in a commercial product offering should do so in a manner
which does not create potential liability for other Contributors. Therefore, if
a Contributor includes the Program in a commercial product offering, such
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
every other Contributor ("Indemnified Contributor") against any losses, damages
and costs (collectively "Losses") arising from claims, lawsuits and other legal
actions brought by a third party against the Indemnified Contributor to the
extent caused by the acts or omissions of such Commercial Contributor in
connection with its distribution of the Program in a commercial product
offering. The obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property infringement. In order
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
Contributor in writing of such claim, and b) allow the Commercial Contributor to
control, and cooperate with the Commercial Contributor in, the defense and any
related settlement negotiations. The Indemnified Contributor may participate in
any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product
offering, Product X. That Contributor is then a Commercial Contributor. If that
Commercial Contributor then makes performance claims, or offers warranties
related to Product X, those performance claims and warranties are such
Commercial Contributor's responsibility alone. Under this section, the
Commercial Contributor would have to defend claims against the other
Contributors related to those performance claims and warranties, and if a court
requires any other Contributor to pay any damages as a result, the Commercial
Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
Recipient is solely responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its exercise of
rights under this Agreement, including but not limited to the risks and costs of
program errors, compliance with applicable laws, damage to or loss of data,
programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable
law, it shall not affect the validity or enforceability of the remainder of the
terms of this Agreement, and without further action by the parties hereto, such
provision shall be reformed to the minimum extent necessary to make such
provision valid and enforceable.

If Recipient institutes patent litigation against a Contributor with respect to
a patent applicable to software (including a cross-claim or counterclaim in a
lawsuit), then any patent licenses granted by that Contributor to such Recipient
under this Agreement shall terminate as of the date such litigation is filed. In
addition, if Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
itself (excluding combinations of the Program with other software or hardware)
infringes such Recipient's patent(s), then such Recipient's rights granted under
Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to
comply with any of the material terms or conditions of this Agreement and does
not cure such failure in a reasonable period of time after becoming aware of
such noncompliance. If all Recipient's rights under this Agreement terminate,
Recipient agrees to cease use and distribution of the Program as soon as
reasonably practicable. However, Recipient's obligations under this Agreement
and any licenses granted by Recipient relating to the Program shall continue and
survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in
order to avoid inconsistency the Agreement is copyrighted and may only be
modified in the following manner. The Agreement Steward reserves the right to
publish new versions (including revisions) of this Agreement from time to time.
No one other than the Agreement Steward has the right to modify this Agreement.
IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
as the Agreement Steward to a suitable separate entity. Each new version of the
Agreement will be given a distinguishing version number. The Program (including
Contributions) may always be distributed subject to the version of the Agreement
under which it was received. In addition, after a new version of the Agreement
is published, Contributor may elect to distribute the Program (including its
Contributions) under the new version. Except as expressly stated in Sections
2(a) and 2(b) above, Recipient receives no rights or licenses to the
intellectual property of any Contributor under this Agreement, whether
expressly, by implication, estoppel or otherwise. All rights in the Program not
expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the
intellectual property laws of the United States of America. No party to this
Agreement will bring a legal action under this Agreement more than one year
after the cause of action arose. Each party waives its rights to a jury trial in
any resulting litigation.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
MIT/X License:
ofbiz/trunk/framework/base/lib/icu4j-4_4.jar
ofbiz/trunk/framework/entity/lib/ofbiz-minerva.jar
ofbiz/trunk/framework/jetty/lib/jcl104-over-slf4j-1.3.1.jar
ofbiz/trunk/framework/jetty/lib/slf4j-api-1.3.1.jar
ofbiz/trunk/framework/jetty/lib/slf4j-log4j12-1.3.1.jar
ofbiz/trunk/framework/images/webapp/images/jquery/*
=========================================================================
The MIT License

Copyright (c) <year> <copyright holders>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
W3C License:
ofbiz/trunk/framework/base/lib/Tidy.jar
=========================================================================
W3C¨ SOFTWARE NOTICE AND LICENSE

 Copyright © 1994-2001 World Wide Web Consortium, (Massachusetts Institute of
 Technology, Institut National de Recherche en Informatique et en Automatique,
 Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/

 This W3C work (including software, documents, or other related items) is
 being provided by the copyright holders under the following license. By
 obtaining, using and/or copying this work, you (the licensee) agree that you
 have read, understood, and will comply with the following terms and
 conditions:

 Permission to use, copy, modify, and distribute this software and its
 documentation, with or without modification,  for any purpose and without fee
 or royalty is hereby granted, provided that you include the following on ALL
 copies of the software and documentation or portions thereof, including
 modifications, that you make:

   1. The full text of this NOTICE in a location viewable to users of the
   redistributed or derivative work.

   2. Any pre-existing intellectual property disclaimers, notices, or terms and
   conditions. If none exist, a short notice of the following form (hypertext is
   preferred, text is permitted) should be used within the body of any
   redistributed or derivative code: "Copyright © [$date-of-software] World Wide
   Web Consortium, (Massachusetts Institute of Technology, Institut National de
   Recherche en Informatique et en Automatique, Keio University). All Rights
   Reserved. http://www.w3.org/Consortium/Legal/"

   3. Notice of any changes or modifications to the W3C files, including the
   date changes were made. (We recommend you provide URIs to the location from
   which the code is derived.)

 THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
 MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE
 OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
 PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.

 COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
 CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
 DOCUMENTATION.

 The name and trademarks of copyright holders may NOT be used in advertising
 or publicity pertaining to the software without specific, written prior
 permission. Title to copyright in this software and any associated
 documentation will at all times remain with copyright holders.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
Sun Public License:
ofbiz/trunk/framework/base/lib/scripting/bsh-2.0b4.jar
=========================================================================
SUN PUBLIC LICENSE Version 1.0

1. Definitions.

    1.0.1. "Commercial Use" means distribution or otherwise making the
    Covered Code available to a third party.

    1.1. "Contributor" means each entity that creates or contributes to
    the creation of Modifications.

    1.2. "Contributor Version" means the combination of the Original Code,
    prior Modifications used by a Contributor, and the Modifications made
    by that particular Contributor.

    1.3. "Covered Code" means the Original Code or Modifications or the
    combination of the Original Code and Modifications, in each case
    including portions thereof and corresponding documentation released
    with the source code.

    1.4. "Electronic Distribution Mechanism" means a mechanism generally
    accepted in the software development community for the electronic
    transfer of data.

    1.5. "Executable" means Covered Code in any form other than Source
    Code.

    1.6. "Initial Developer" means the individual or entity identified as
    the Initial Developer in the Source Code notice required by Exhibit A.

    1.7. "Larger Work" means a work which combines Covered Code or
    portions thereof with code not governed by the terms of this License.

    1.8. "License" means this document.

    1.8.1. "Licensable" means having the right to grant, to the maximum
    extent possible, whether at the time of the initial grant or
    subsequently acquired, any and all of the rights conveyed herein.

    1.9. "Modifications" means any addition to or deletion from the
    substance or structure of either the Original Code or any previous
    Modifications. When Covered Code is released as a series of files, a
    Modification is:

    A. Any addition to or deletion from the contents of a file containing
    Original Code or previous Modifications.

    B. Any new file that contains any part of the Original Code or
    previous Modifications.

    1.10. "Original Code" means Source Code of computer software code
    which is described in the Source Code notice required by Exhibit A as
    Original Code, and which, at the time of its release under this
    License is not already Covered Code governed by this License.

    1.10.1. "Patent Claims" means any patent claim(s), now owned or
    hereafter acquired, including without limitation, method, process, and
    apparatus claims, in any patent Licensable by grantor.

    1.11. "Source Code" means the preferred form of the Covered Code for
    making modifications to it, including all modules it contains, plus
    any associated documentation, interface definition files, scripts used
    to control compilation and installation of an Executable, or source
    code differential comparisons against either the Original Code or
    another well known, available Covered Code of the Contributor's
    choice. The Source Code can be in a compressed or archival form,
    provided the appropriate decompression or de-archiving software is
    widely available for no charge.

    1.12. "You" (or "Your") means an individual or a legal entity
    exercising rights under, and complying with all of the terms of, this
    License or a future version of this License issued under Section 6.1.
    For legal entities, "You" includes any entity which controls, is
    controlled by, or is under common control with You. For purposes of
    this definition, "control" means (a) the power, direct or indirect, to
    cause the direction or management of such entity, whether by contract
    or otherwise, or (b) ownership of more than fifty percent (50%) of the
    outstanding shares or beneficial ownership of such entity.

2. Source Code License.

2.1 The Initial Developer Grant.

    The Initial Developer hereby grants You a world-wide, royalty-free,
    non-exclusive license, subject to third party intellectual property
    claims:

    (a)  under intellectual property rights (other than patent or
    trademark) Licensable by Initial Developer to use, reproduce, modify,
    display, perform, sublicense and distribute the Original Code (or
    portions thereof) with or without Modifications, and/or as part of a
    Larger Work; and

    (b) under Patent Claims infringed by the making, using or selling of
    Original Code, to make, have made, use, practice, sell, and offer for
    sale, and/or otherwise dispose of the Original Code (or portions
    thereof).

    (c) the licenses granted in this Section 2.1(a) and (b) are effective
    on the date Initial Developer first distributes Original Code under
    the terms of this License.

    (d) Notwithstanding Section 2.1(b) above, no patent license is
    granted: 1)     for code that You delete from the Original Code; 2)
    separate from the     Original Code; or 3) for infringements caused by:
    i) the modification of the Original Code or ii) the combination of the
    Original Code with other software or devices.

2.2. Contributor Grant.

    Subject to third party intellectual property claims, each Contributor
    hereby grants You a world-wide, royalty-free, non-exclusive license

    (a) under intellectual property rights (other than patent or
    trademark) Licensable by Contributor, to use, reproduce,  modify,
    display, perform, sublicense and distribute the Modifications created
    by such Contributor (or portions thereof) either on an unmodified
    basis, with other Modifications, as Covered Code and/or as part of a
    Larger Work; and

    (b) under Patent Claims infringed by the making, using, or selling of
    Modifications made by that Contributor either alone and/or in
    combination with its Contributor Version (or portions of such
    combination), to make, use, sell, offer for sale, have made, and/or
    otherwise dispose of: 1) Modifications made by that Contributor (or
    portions thereof); and 2) the combination of Modifications made by
    that Contributor with its Contributor Version (or portions of such
    combination).

    (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective
    on the date Contributor first makes Commercial Use of the Covered
    Code.

    (d)  notwithstanding Section 2.2(b) above, no patent license is
    granted: 1) for any code that Contributor has deleted from the
    Contributor Version; 2)  separate from the Contributor Version; 3) for
    infringements caused by: i) third party modifications of Contributor
    Version or ii) the combination of Modifications made by that
    Contributor with other software (except as part of the Contributor
    Version) or other devices; or 4) under Patent Claims infringed by
    Covered Code in the absence of Modifications made by that Contributor.

3. Distribution Obligations.

3.1. Application of License.

    The Modifications which You create or to which You contribute are
    governed by the terms of this License, including without limitation
    Section 2.2. The Source Code version of Covered Code may be
    distributed only under the terms of this License or a future version
    of this License released under Section 6.1, and You must include a
    copy of this License with every copy of the Source Code You
    distribute. You may not offer or impose any terms on any Source Code
    version that alters or restricts the applicable version of this
    License or the recipients' rights hereunder. However, You may include
    an additional document offering the additional rights described in
    Section 3.5.

3.2. Availability of Source Code.

    Any Modification which You create or to which You contribute must be
    made available in Source Code form under the terms of this License
    either on the same media as an Executable version or via an accepted
    Electronic Distribution Mechanism to anyone to whom you made an
    Executable version available; and if made available via Electronic
    Distribution Mechanism, must remain available for at least twelve (12)
    months after the date it initially became available, or at least six
    (6) months after a subsequent version of that particular Modification
    has been made available to such recipients. You are responsible for
    ensuring that the Source Code version remains available even if the
    Electronic Distribution Mechanism is maintained by a third party.

3.3. Description of Modifications.

    You must cause all Covered Code to which You contribute to contain a
    file documenting the changes You made to create that Covered Code and
    the date of any change. You must include a prominent statement that
    the Modification is derived, directly or indirectly, from Original
    Code provided by the Initial Developer and including the name of the
    Initial Developer in (a) the Source Code, and (b) in any notice in an
    Executable version or related documentation in which You describe the
    origin or ownership of the Covered Code.

3.4. Intellectual Property Matters.

    (a) Third Party Claims.

    If Contributor has knowledge that a license under a third party's
    intellectual property rights is required to exercise the rights
    granted by such Contributor under Sections 2.1 or 2.2, Contributor
    must include a text file with the Source Code distribution titled
    "LEGAL'' which describes the claim and the party making the claim in
    sufficient detail that a recipient will know whom to contact. If
    Contributor obtains such knowledge after the Modification is made
    available as described in Section 3.2, Contributor shall promptly
    modify the LEGAL file in all copies Contributor makes available
    thereafter and shall take other steps (such as notifying appropriate
    mailing lists or newsgroups) reasonably calculated to inform those who
    received the Covered Code that new knowledge has been obtained.

    (b) Contributor APIs.

    If Contributor's Modifications include an application programming
    interface ("API") and Contributor has knowledge of patent licenses
    which are reasonably necessary to implement that API, Contributor must
    also include this information in the LEGAL file.

    (c) Representations.

    Contributor represents that, except as disclosed pursuant to Section
    3.4(a) above, Contributor believes that Contributor's Modifications
    are Contributor's original creation(s) and/or Contributor has
    sufficient rights to grant the rights conveyed by this License.

3.5. Required Notices.

    You must duplicate the notice in Exhibit A in each file of the Source
    Code. If it is not possible to put such notice in a particular Source
    Code file due to its structure, then You must include such notice in a
    location (such as a relevant directory) where a user would be likely
    to look for such a notice.  If You created one or more Modification(s)
    You may add your name as a Contributor to the notice described in
    Exhibit A. You must also duplicate this License in any documentation
    for the Source Code where You describe recipients' rights or ownership
    rights relating to Covered Code. You may choose to offer, and to
    charge a fee for, warranty, support, indemnity or liability
    obligations to one or more recipients of Covered Code. However, You
    may do so only on Your own behalf, and not on behalf of the Initial
    Developer or any Contributor. You must make it absolutely clear than
    any such warranty, support, indemnity or liability obligation is
    offered by You alone, and You hereby agree to indemnify the Initial
    Developer and every Contributor for any liability incurred by the
    Initial Developer or such Contributor as a result of warranty,
    support, indemnity or liability terms You offer.

3.6. Distribution of Executable Versions.

    You may distribute Covered Code in Executable form only if the
    requirements of Section 3.1-3.5 have been met for that Covered Code,
    and if You include a notice stating that the Source Code version of
    the Covered Code is available under the terms of this License,
    including a description of how and where You have fulfilled the
    obligations of Section 3.2. The notice must be conspicuously included
    in any notice in an Executable version, related documentation or
    collateral in which You describe recipients' rights relating to the
    Covered Code. You may distribute the Executable version of Covered
    Code or ownership rights under a license of Your choice, which may
    contain terms different from this License, provided that You are in
    compliance with the terms of this License and that the license for the
    Executable version does not attempt to limit or alter the recipient's
    rights in the Source Code version from the rights set forth in this
    License. If You distribute the Executable version under a different
    license You must make it absolutely clear that any terms which differ
    from this License are offered by You alone, not by the Initial
    Developer or any Contributor. You hereby agree to indemnify the
    Initial Developer and every Contributor for any liability incurred by
    the Initial Developer or such Contributor as a result of any such
    terms You offer.

3.7. Larger Works.

    You may create a Larger Work by combining Covered Code with other code
    not governed by the terms of this License and distribute the Larger
    Work as a single product. In such a case, You must make sure the
    requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.

    If it is impossible for You to comply with any of the terms of this
    License with respect to some or all of the Covered Code due to
    statute, judicial order, or regulation then You must: (a) comply with
    the terms of this License to the maximum extent possible; and (b)
    describe the limitations and the code they affect. Such description
    must be included in the LEGAL file described in Section 3.4 and must
    be included with all distributions of the Source Code. Except to the
    extent prohibited by statute or regulation, such description must be
    sufficiently detailed for a recipient of ordinary skill to be able to
    understand it.

5. Application of this License.

    This License applies to code to which the Initial Developer has
    attached the notice in Exhibit A and to related Covered Code.

6. Versions of the License.

6.1. New Versions.

    Sun Microsystems, Inc. ("Sun") may publish revised and/or new versions
    of the License from time to time. Each version will be given a
    distinguishing version number.

6.2. Effect of New Versions.

    Once Covered Code has been published under a particular version of the
    License, You may always continue to use it under the terms of that
    version. You may also choose to use such Covered Code under the terms
    of any subsequent version of the License published by Sun. No one
    other than Sun has the right to modify the terms applicable to Covered
    Code created under this License.

6.3. Derivative Works.

    If You create or use a modified version of this License (which you may
    only do in order to apply it to code which is not already Covered Code
    governed by this License), You must: (a) rename Your license so that
    the phrases "Sun," "Sun Public License," or "SPL" or any confusingly
    similar phrase do not appear in your license (except to note that your
    license differs from this License) and (b) otherwise make it clear
    that Your version of the license contains terms which differ from the
    Sun Public License. (Filling in the name of the Initial Developer,
    Original Code or Contributor in the notice described in Exhibit A
    shall not of themselves be deemed to be modifications of this
    License.)

7. DISCLAIMER OF WARRANTY.

    COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS,
    WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
    WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
    DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
    THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
    IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
    YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
    COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
    OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
    ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

8. TERMINATION.

    8.1. This License and the rights granted hereunder will terminate
    automatically if You fail to comply with terms herein and fail to cure
    such breach within 30 days of becoming aware of the breach. All
    sublicenses to the Covered Code which are properly granted shall
    survive any termination of this License. Provisions which, by their
    nature, must remain in effect beyond the termination of this License
    shall survive.

    8.2. If You initiate litigation by asserting a patent infringement
    claim (excluding declaratory judgment actions) against Initial Developer
    or a Contributor (the Initial Developer or Contributor against whom
    You file such action is referred to as "Participant")  alleging that:

    (a) such Participant's Contributor Version directly or indirectly
    infringes any patent, then any and all rights granted by such
    Participant to You under Sections 2.1 and/or 2.2 of this License
    shall, upon 60 days notice from Participant terminate prospectively,
    unless if within 60 days after receipt of notice You either: (i)
    agree in writing to pay Participant a mutually agreeable reasonable
    royalty for Your past and future use of Modifications made by such
    Participant, or (ii) withdraw Your litigation claim with respect to
    the Contributor Version against such Participant.  If within 60 days
    of notice, a reasonable royalty and payment arrangement are not
    mutually agreed upon in writing by the parties or the litigation claim
    is not withdrawn, the rights granted by Participant to You under
    Sections 2.1 and/or 2.2 automatically terminate at the expiration of
    the 60 day notice period specified above.

    (b) any software, hardware, or device, other than such Participant's
    Contributor Version, directly or indirectly infringes any patent, then
    any rights granted to You by such Participant under Sections 2.1(b)
    and 2.2(b) are revoked effective as of the date You first made, used,
    sold, distributed, or had made, Modifications made by that
    Participant.

    8.3. If You assert a patent infringement claim against Participant
    alleging that such Participant's Contributor Version directly or
    indirectly infringes any patent where such claim is resolved (such as
    by license or settlement) prior to the initiation of patent
    infringement litigation, then the reasonable value of the licenses
    granted by such Participant under Sections 2.1 or 2.2 shall be taken
    into account in determining the amount or value of any payment or
    license.

    8.4. In the event of termination under Sections 8.1 or 8.2 above,  all
    end user license agreements (excluding distributors and resellers)
    which have been validly granted by You or any distributor hereunder
    prior to termination shall survive termination.

9. LIMITATION OF LIABILITY.

    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
    (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
    DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
    OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
    ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
    CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
    WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
    COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
    INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
    LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
    RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
    PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
    EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
    THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.

10. U.S. GOVERNMENT END USERS.

    The Covered Code is a "commercial item," as that term is defined in 48
    C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software"
    and "commercial computer software documentation," as such terms are
    used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R.
    12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all
    U.S. Government End Users acquire Covered Code with only those rights
    set forth herein.

11. MISCELLANEOUS.

    This License represents the complete agreement concerning subject
    matter hereof. If any provision of this License is held to be
    unenforceable, such provision shall be reformed only to the extent
    necessary to make it enforceable. This License shall be governed by
    California law provisions (except to the extent applicable law, if
    any, provides otherwise), excluding its conflict-of-law provisions.
    With respect to disputes in which at least one party is a citizen of,
    or an entity chartered or registered to do business in the United
    States of America, any litigation relating to this License shall be
    subject to the jurisdiction of the Federal Courts of the Northern
    District of California, with venue lying in Santa Clara County,
    California, with the losing party responsible for costs, including
    without limitation, court costs and reasonable attorneys' fees and
    expenses. The application of the United Nations Convention on
    Contracts for the International Sale of Goods is expressly excluded.
    Any law or regulation which provides that the language of a contract
    shall be construed against the drafter shall not apply to this
    License.

12. RESPONSIBILITY FOR CLAIMS.

    As between Initial Developer and the Contributors, each party is
    responsible for claims and damages arising, directly or indirectly,
    out of its utilization of rights under this License and You agree to
    work with Initial Developer and Contributors to distribute such
    responsibility on an equitable basis. Nothing herein is intended or
    shall be deemed to constitute any admission of liability.

13. MULTIPLE-LICENSED CODE.

    Initial Developer may designate portions of the Covered Code as
    "Multiple-Licensed". "Multiple-Licensed" means that the Initial
    Developer permits you to utilize portions of the Covered Code under
    Your choice of the alternative licenses, if any, specified by the
    Initial Developer in the file described in Exhibit A.

Exhibit A -Sun Public License Notice.

    The contents of this file are subject to the Sun Public License
    Version 1.0 (the "License"); you may not use this file except in
    compliance with the License. A copy of the License is available at
    http://www.sun.com/

    The Original Code is _________________. The Initial Developer of the
    Original Code is ___________. Portions created by ______ are Copyright
    (C)_________. All Rights Reserved.

    Contributor(s): ______________________________________.

    Alternatively, the contents of this file may be used under the terms
    of the _____ license (the  "[___] License"), in which case the
    provisions of [______] License are applicable  instead of those above.
    If you wish to allow use of your version of this file only under the
    terms of the [____] License and not to allow others to use your
    version of this file under the SPL, indicate your decision by deleting
    the provisions above and replace  them with the notice and other
    provisions required by the [___] License. If you do not delete the
    provisions above, a recipient may use your version of this file under
    either the SPL or the [___] License."

    [NOTE: The text of this Exhibit A may differ slightly from the text of
    the notices in the Source Code files of the Original Code. You should
    use the text of this Exhibit A rather than the text found in the
    Original Code Source Code for Your Modifications.]

=========================================================================
The Jython library is licensed under the BeOpen/CNRI as follows.
ofbiz/trunk/framework/base/lib/scripting/jython-nooro.jar
=========================================================================
Jython changes Software License.
=========================================================================

Copyright (c) 2000, Jython Developers
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

 - Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

 - Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in
   the documentation and/or other materials provided with the distribution.

 - Neither the name of the Jython Developers nor the names of
   its contributors may be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

JPython Software License.
=========================================================================

______________________________________________________________________

IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY.

BY CLICKING ON THE "ACCEPT" BUTTON WHERE INDICATED, OR BY INSTALLING,
COPYING OR OTHERWISE USING THE SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO
THE TERMS AND CONDITIONS OF THIS AGREEMENT.

______________________________________________________________________

JPython version 1.1.x

  1. This LICENSE AGREEMENT is between the Corporation for National Research
     Initiatives, having an office at 1895 Preston White Drive, Reston, VA
     20191 ("CNRI"), and the Individual or Organization ("Licensee")
     accessing and using JPython version 1.1.x in source or binary form and
     its associated documentation as provided herein ("Software").

  2. Subject to the terms and conditions of this License Agreement, CNRI
     hereby grants Licensee a non-exclusive, non-transferable, royalty-free,
     world-wide license to reproduce, analyze, test, perform and/or display
     publicly, prepare derivative works, distribute, and otherwise use the
     Software alone or in any derivative version, provided, however, that
     CNRI's License Agreement and CNRI's notice of copyright, i.e.,
     "Copyright ©1996-1999 Corporation for National Research Initiatives;
     All Rights Reserved" are both retained in the Software, alone or in any
     derivative version prepared by Licensee.

     Alternatively, in lieu of CNRI's License Agreement, Licensee may
     substitute the following text (omitting the quotes), provided, however,
     that such text is displayed prominently in the Software alone or in any
     derivative version prepared by Licensee: "JPython (Version 1.1.x) is
     made available subject to the terms and conditions in CNRI's License
     Agreement. This Agreement may be located on the Internet using the
     following unique, persistent identifier (known as a handle):
     1895.22/1006. The License may also be obtained from a proxy server on
     the Web using the following URL: http://hdl.handle.net/1895.22/1006."

  3. In the event Licensee prepares a derivative work that is based on or
     incorporates the Software or any part thereof, and wants to make the
     derivative work available to the public as provided herein, then
     Licensee hereby agrees to indicate in any such work, in a prominently
     visible way, the nature of the modifications made to CNRI's Software.

  4. Licensee may not use CNRI trademarks or trade name, including JPython
     or CNRI, in a trademark sense to endorse or promote products or
     services of Licensee, or any third party. Licensee may use the mark
     JPython in connection with Licensee's derivative versions that are
     based on or incorporate the Software, but only in the form
     "JPython-based ___________________," or equivalent.

  5. CNRI is making the Software available to Licensee on an "AS IS" basis.
     CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY
     OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY
     REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY
     PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE
     ANY THIRD PARTY RIGHTS.

  6. CNRI SHALL NOT BE LIABLE TO LICENSEE OR OTHER USERS OF THE SOFTWARE FOR
     ANY INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
     USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE
     THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. SOME STATES DO NOT
     ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY SO THE ABOVE DISCLAIMER
     MAY NOT APPLY TO LICENSEE.

  7. This License Agreement may be terminated by CNRI (i) immediately upon
     written notice from CNRI of any material breach by the Licensee, if the
     nature of the breach is such that it cannot be promptly remedied; or
     (ii) sixty (60) days following notice from CNRI to Licensee of a
     material remediable breach, if Licensee has not remedied such breach
     within that sixty-day period.

  8. This License Agreement shall be governed by and interpreted in all
     respects by the law of the State of Virginia, excluding conflict of law
     provisions. Nothing in this Agreement shall be deemed to create any
     relationship of agency, partnership, or joint venture between CNRI and
     Licensee.

  9. By clicking on the "ACCEPT" button where indicated, or by installing,
     copying or otherwise using the Software, Licensee agrees to be bound by
     the terms and conditions of this License Agreement.

                               [ACCEPT BUTTON]

=========================================================================
The JDBM library is licensed under the JDBM LICENSE v1.00 as follows.
This license is nearly equivalent to the BSD License.
ofbiz/trunk/framework/base/lib/jdbm-1.0-SNAPSHOT.jar
=========================================================================
/**
 * JDBM LICENSE v1.00
 *
 * Redistribution and use of this software and associated documentation
 * ("Software"), with or without modification, are permitted provided
 * that the following conditions are met:
 *
 * 1. Redistributions of source code must retain copyright
 *    statements and notices.  Redistributions must also contain a
 *    copy of this document.
 *
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions and the
 *    following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 *
 * 3. The name "JDBM" must not be used to endorse or promote
 *    products derived from this Software without prior written
 *    permission of Cees de Groot.  For written permission,
 *    please contact cg@cdegroot.com.
 *
 * 4. Products derived from this Software may not be called "JDBM"
 *    nor may "JDBM" appear in their names without prior written
 *    permission of Cees de Groot.
 *
 * 5. Due credit should be given to the JDBM Project
 *    (http://jdbm.sourceforge.net/).
 *
 * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Copyright 2000 (C) Cees de Groot. All Rights Reserved.
 * Contributions are Copyright (C) 2000 by their associated contributors.
 *
 * $Id: LICENSE.txt,v 1.1 2000/05/05 23:59:52 boisvert Exp $
 */
=========================================================================
The following library distributed with Apache OFBiz is licensed under the
COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL):
ofbiz/trunk/framework/base/lib/juel-2.1.1.jar (contains the javax.el package)
ofbiz/trunk/framework/base/lib/mail.jar
ofbiz/trunk/specialpurpose/ebaystore/lib/attributes.jar
ofbiz/trunk/specialpurpose/ebaystore/lib/ebaysdkcore.jar
ofbiz/trunk/specialpurpose/ebaystore/lib/helper.jar
ofbiz/trunk/specialpurpose/ebaystore/lib/ebaycalls.jar
=========================================================================
COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1.

Definitions.

1.1. Contributor means each individual or entity that creates or
contributes to the creation of Modifications.

1.2. Contributor Version means the combination of the Original Software,
prior Modifications used by a Contributor (if any), and the Modifications
made by that particular Contributor.

1.3. Covered Software means (a) the Original Software, or
(b) Modifications, or (c) the combination of files containing
Original Software with files containing Modifications, in each case
including portions thereof.

1.4. Executable means the Covered Software in any form other than Source Code.

1.5. Initial Developer means the individual or entity that first makes
Original Software available under this License.

1.6. Larger Work means a work which combines Covered Software or portions
thereof with code not governed by the terms of this License.

1.7. License means this document.

1.8. Licensable means having the right to grant, to the maximum extent
possible, whether at the time of the initial grant or subsequently acquired,
any and all of the rights conveyed herein.

1.9. Modifications means the Source Code and Executable form of any
of the following: A. Any file that results from an addition to, deletion
from or modification of the contents of a file containing Original Software
or previous Modifications; B. Any new file that contains any part of the
Original Software or previous Modification; or C. Any new file that is
contributed or otherwise made available under the terms of this License.

1.10. Original Software means the Source Code and Executable form of
computer software code that is originally released under this License.

1.11. Patent Claims means any patent claim(s), now owned or hereafter
acquired, including without limitation, method, process, and apparatus claims,
in any patent Licensable by grantor.

1.12. Source Code means (a) the common form of computer software code in
which modifications are made and (b) associated documentation included
in or with such code.

1.13. You (or Your) means an individual or a legal entity exercising
rights under, and complying with all of the terms of, this License.
For legal entities, You includes any entity which controls, is controlled by,
or is under common control with You. For purposes of this definition,
control means (a) the power, direct or indirect, to cause the direction or
management of such entity, whether by contract or otherwise, or (b) ownership of
more than fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.

2. License Grants.

 2.1. The Initial Developer Grant. Conditioned upon Your compliance with
Section 3.1 below and subject to third party intellectual property claims,
the Initial Developer hereby grants You a world-wide, royalty-free,
non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
Licensable by Initial Developer, to use, reproduce, modify, display, perform,
sublicense and distribute the Original Software (or portions thereof), with or
without Modifications, and/or as part of a Larger Work; and

(b) under Patent Claims infringed by the making, using or selling of
Original Software, to make, have made, use, practice, sell, and offer for sale,
and/or otherwise dispose of the Original Software (or portions thereof);

 (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date
Initial Developer first distributes or otherwise makes the Original Software
available to a third party under the terms of this License;

 (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for
code that You delete from the Original Software, or (2) for infringements caused
by: (i) the modification of the Original Software, or (ii) the combination of
the Original Software with other software or devices.

2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below
and subject to third party intellectual property claims, each Contributor hereby
grants You a world-wide, royalty-free, non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
Licensable by Contributor to use, reproduce, modify, display, perform,
sublicense and distribute the Modifications created by such Contributor
(or portions thereof), either on an unmodified basis, with other Modifications,
as Covered Software and/or as part of a Larger Work; and

(b) under Patent Claims infringed by the making, using, or selling of
Modifications made by that Contributor either alone and/or in combination with
its Contributor Version (or portions of such combination), to make, use, sell,
offer for sale, have made, and/or otherwise dispose of: (1) Modifications made
by that Contributor (or portions thereof); and (2) the combination of
Modifications made by that Contributor with its Contributor Version
(or portions of such combination).

(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the
date Contributor first distributes or otherwise makes the Modifications
available to a third party.

(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for
any code that Contributor has deleted from the Contributor Version; (2) for
infringements caused by: (i) third party modifications of Contributor Version,
or (ii) the combination of Modifications made by that Contributor with other
software (except as part of the Contributor Version) or other devices; or (3)
under Patent Claims infringed by Covered Software in the absence of
Modifications made by that Contributor.

3. Distribution Obligations.

3.1. Availability of Source Code. Any Covered Software that You distribute or
otherwise make available in Executable form must also be made available in
Source Code form and that Source Code form must be distributed only under the
terms of this License. You must include a copy of this License with every copy
of the Source Code form of the Covered Software You distribute or otherwise
make available. You must inform recipients of any such Covered Software in
Executable form as to how they can obtain such Covered Software in Source Code
form in a reasonable manner on or through a medium customarily used
for software exchange.

3.2. Modifications. The Modifications that You create or to which You contribute
are governed by the terms of this License. You represent that You believe Your
Modifications are Your original creation(s) and/or You have sufficient rights
to grant the rights conveyed by this License.

3.3. Required Notices. You must include a notice in each of Your Modifications
that identifies You as the Contributor of the Modification. You may not remove
or alter any copyright, patent or trademark notices contained within the
Covered Software, or any notices of licensing or any descriptive text giving
attribution to any Contributor or the Initial Developer.

3.4. Application of Additional Terms. You may not offer or impose any terms on
any Covered Software in Source Code form that alters or restricts the applicable
version of this License or the recipients rights hereunder. You may choose to
offer, and to charge a fee for, warranty, support, indemnity or liability
obligations to one or more recipients of Covered Software. However, you may do
so only on Your own behalf, and not on behalf of the Initial Developer or any
Contributor. You must make it absolutely clear that any such warranty, support,
indemnity or liability obligation is offered by You alone, and You hereby agree
to indemnify the Initial Developer and every Contributor for any liability
incurred by the Initial Developer or such Contributor as a result of warranty,
support, indemnity or liability terms You offer.

3.5. Distribution of Executable Versions. You may distribute the Executable form
of the Covered Software under the terms of this License or under the terms of a
license of Your choice, which may contain terms different from this License,
provided that You are in compliance with the terms of this License and that the
license for the Executable form does not attempt to limit or alter the
recipients rights in the Source Code form from the rights set forth in this
License. If You distribute the Covered Software in Executable form under a
different license, You must make it absolutely clear that any terms which
differ from this License are offered by You alone, not by the Initial
Developer or Contributor. You hereby agree to indemnify the Initial Developer
and every Contributor for any liability incurred by the Initial Developer or
such Contributor as a result of any such terms You offer.

3.6. Larger Works. You may create a Larger Work by combining Covered Software
with other code not governed by the terms of this License and distribute the
Larger Work as a single product. In such a case, You must make sure the
requirements of this License are fulfilled for the Covered Software.

4. Versions of the License.

4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may
publish revised and/or new versions of this License from time to time. Each
version will be given a distinguishing version number. Except as provided in
Section 4.3, no one other than the license steward has the right to modify
this License.

4.2. Effect of New Versions. You may always continue to use, distribute or
otherwise make the Covered Software available under the terms of the version of
the License under which You originally received the Covered Software. If the
Initial Developer includes a notice in the Original Software prohibiting it
from being distributed or otherwise made available under any subsequent version
of the License, You must distribute and make the Covered Software available
under the terms of the version of the License under which You originally
received the Covered Software. Otherwise, You may also choose to use,
distribute or otherwise make the Covered Software available under the terms of
any subsequent version of the License published by the license steward.

4.3. Modified Versions. When You are an Initial Developer and You want to create
a new license for Your Original Software, You may create and use a modified
version of this License if You: (a) rename the license and remove any references
to the name of the license steward (except to note that the license differs
from this License); and (b) otherwise make it clear that the license contains
terms which differ from this License.

5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN
AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE
ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH
YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU
(NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS
AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

6. TERMINATION.

6.1. This License and the rights granted hereunder will terminate automatically
if You fail to comply with terms herein and fail to cure such breach within 30
days of becoming aware of the breach. Provisions which, by their nature, must
remain in effect beyond the termination of this License shall survive.

6.2. If You assert a patent infringement claim (excluding declaratory judgment
actions) against Initial Developer or a Contributor (the Initial Developer or
Contributor against whom You assert such claim is referred to as Participant)
alleging that the Participant Software (meaning the Contributor Version where
the Participant is a Contributor or the Original Software where the Participant
is the Initial Developer) directly or indirectly infringes any patent, then any
and all rights granted directly or indirectly to You by such Participant, the
Initial Developer (if the Initial Developer is not the Participant) and all
Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days
notice from Participant terminate prospectively and automatically at the
expiration of such 60 day notice period, unless if within such 60 day period
You withdraw Your claim with respect to the Participant Software against such
Participant either unilaterally or pursuant to a written agreement
with Participant.

6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user
licenses that have been validly granted by You or any distributor hereunder
prior to termination (excluding licenses granted to You by any distributor)
shall survive termination.

7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE,
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT,
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE,
COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH
DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR
PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE
LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR
LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND
LIMITATION MAY NOT APPLY TO YOU.

8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item, as that
term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer
software (as that term is defined at 48 C.F.R.  252.227-7014(a)(1)) and
commercial computer software documentation as such terms are used in
48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R.
227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire
Covered Software with only those rights set forth herein. This U.S. Government
Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause
or provision that addresses Government rights in computer software
under this License.

9. MISCELLANEOUS. This License represents the complete agreement concerning
subject matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent necessary
to make it enforceable. This License shall be governed by the law of the
jurisdiction specified in a notice contained within the Original Software
(except to the extent applicable law, if any, provides otherwise), excluding such
jurisdictions conflict-of-law provisions. Any litigation relating to this
License shall be subject to the jurisdiction of the courts located in the
jurisdiction and venue specified in a notice contained within the Original
Software, with the losing party responsible for costs, including, without
limitation, court costs and reasonable attorneys fees and expenses.
The application of the United Nations Convention on Contracts for the
International Sale of Goods is expressly excluded. Any law or regulation which
provides that the language of a contract shall be construed against the drafter
shall not apply to this License. You agree that You alone are responsible for
compliance with the United States export administration regulations (and the
export control laws and regulation of any other countries) when You use,
distribute or otherwise make available any Covered Software.

10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors,
each party is responsible for claims and damages arising, directly or indirectly,
out of its utilization of rights under this License and You agree to work with
Initial Developer and Contributors to distribute such responsibility on an
equitable basis. Nothing herein is intended or shall be deemed to constitute
any admission of liability.

NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
(CDDL) The code released under the CDDL shall be governed by the laws of the
State of California (excluding conflict-of-law provisions). Any litigation
relating to this License shall be subject to the jurisdiction of the Federal
Courts of the Northern District of California and the state courts of the State
of California, with venue lying in Santa Clara County, California.

=========================================================================
Apache OFBiz includes the XML Schema files from the Open Applications Group, Inc
NOTE: these files and the license are for an older version of the OAGIS
specification, namely version 7.2.1.
ofbiz/specialpurpose/oagis/dtd/002_confirm_bod_004.xsd
ofbiz/specialpurpose/oagis/dtd/068_sync_inventory_005.xsd
ofbiz/specialpurpose/oagis/dtd/161_show_shipment_005.xsd
ofbiz/specialpurpose/oagis/dtd/161B_process_shipment_001.xsd
ofbiz/specialpurpose/oagis/dtd/196_acknowledge_delivery_001.xsd
ofbiz/specialpurpose/oagis/dtd/197_receive_delivery_001.xsd
ofbiz/specialpurpose/oagis/dtd/oagis_fields.xsd
ofbiz/specialpurpose/oagis/dtd/oagis_segments.xsd
Open Applications Group Xml Schema is licensed as follows:
=========================================================================
Copyright (c) 1998-2001 Open Applications Group, Inc. All Rights Reserved

Documents and resource files on the Open Applications Group, Inc. Internet site are
provided under the following license.  By obtaining, using, and/or copying this file,
or any related file obtained from this site, you agree that you have read, understood,
and will comply with the following terms and conditions:

Permissions to use, copy, and distribute the contents of this file, in any medium
for any purpose and without fee or royalty is hereby granted, provided that you
include the following on ALL copies of the file that you use:

1. A reference to the original Open Applications Group resource
2. A notice of the form "Copyright (c) Open Applications Group. All Rights Reserved

When space permits, inclusion of the full text of this NOTICE should be provided.
Attribution is requested to be provided in any software, documentation, or other items
or products that you create related to the implementation of the contents of this file.

THIS RESOURCE IS PROVIDED AS IS, AND THE COPYRIGHT HOLDER MAKES NO REPRESENTATIONS
OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT
THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION
OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR
OTHER RIGHTS.
THE COPYRIGHT HOLDER WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCE OR
IMPLEMENTATION OF THE CONTENTS THEREOF.

The name and trademarks of copyright holder may NOT be used in advertising or publicity
pertaining to this file or its contents without specific, written prior permission.

Title to copyright in this document will at all times remain with copyright holders.

Please Note: This file is a work in process, and may be modified or enhanced, at the
discretion of the Open Applications Group without notice, at any time.
Please contact the Open Applications Group at www.openapplications.org with any
questions or comments regarding the usage of this material.

=========================================================================
The following libraries distributed with Apache OFBiz are licensed under the
Eclipse Public License - v 1.0:
ofbiz/trunk/framework/catalina/lib/tomcat-6.0.16-jasper-jdt.jar
ofbiz/trunk/framework/birt/lib/chartengineapi.jar
ofbiz/trunk/framework/birt/lib/coreapi.jar
ofbiz/trunk/framework/birt/lib/crosstabcoreapi.jar
ofbiz/trunk/framework/birt/lib/dataadapterapi.jar
ofbiz/trunk/framework/birt/lib/dataaggregationapi.jar
ofbiz/trunk/framework/birt/lib/dataextraction.jar
ofbiz/trunk/framework/birt/lib/dteapi.jar
ofbiz/trunk/framework/birt/lib/emitterconfig.jar
ofbiz/trunk/framework/birt/lib/engineapi.jar
ofbiz/trunk/framework/birt/lib/jaxrpc.jar
ofbiz/trunk/framework/birt/lib/modelapi.jar
ofbiz/trunk/framework/birt/lib/modelodaapi.jar
ofbiz/trunk/framework/birt/lib/odadesignapi.jar
ofbiz/trunk/framework/birt/lib/saaj.jar
ofbiz/trunk/framework/birt/lib/scriptapi.jar
ofbiz/trunk/framework/birt/lib/viewservlets.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.batik.css_1.6.0.v200912221622.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.batik.util_1.6.0.v200805290154.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.batik.transcoder_1.6.0.v200805290154.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.batik.dom.svg_1.6.0.v200805290154.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.batik.bridge_1.6.0.v200912221622.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.batik.dom_1.6.0.v200912221622.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.xml.resolver_1.2.0.v201005080400.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.apache.xml.serializer_2.7.1.v201005080400.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.api_1.0.0.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.chart.device.extension_2.6.0.v20100521.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.chart.device.svg_2.6.0.v20100527.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.chart.engine_2.6.0.v20100607.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.chart.engine.extension_2.6.0.v20100601.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.chart.reportitem_2.6.0.v20100604.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.core_2.6.0.v20100526.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.core.script.function_2.6.0.v20100524.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.data_2.6.0.v20100524.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.data.aggregation_2.6.0.v20100524.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.data.adapter_2.6.0.v20100525.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.data.oda.jdbc.dbprofile_2.6.0.v20100524.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.data.oda.jdbc.dbprofile.sampledb_2.6.0.v20100524.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.data.oda.xml_2.6.0.v20100524.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine_2.6.0.v20100609.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.dataextraction_2.5.2.v20100115.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.dataextraction.csv_2.5.2.v20100115.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.config_2.6.0.v20100304.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.html.config_2.6.0.v20100304.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.pdf_2.6.0.v20100513.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.postscript_2.6.0.v20100526.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.ppt_2.6.0.v20100429.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.prototype.excel_2.6.0.v20100601.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.engine.emitter.wpml_2.6.0.v20100520.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.item.crosstab.core_2.6.0.v20100531.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.model_2.6.0.v20100603.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.birt.report.model.adapter.oda_2.6.0.v20100528.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.contenttype_3.4.100.v20100505-1235.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.expressions_3.4.200.v20100505.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.filesystem_1.3.0.v20100526-0737.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.jobs_3.5.0.v20100515.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.resources_3.6.0.v20100526-0737.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.runtime_3.6.0.v20100505.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.runtime.compatibility_3.2.100.v20100505.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.runtime.compatibility.auth_3.2.200.v20100517.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity_1.2.0.v201005270426.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.apache.derby_1.0.100.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.apache.derby.dbdefinition_1.0.2.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.console.profile_1.0.0.v200906020553.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.dbdefinition.genericJDBC_1.0.1.v200906111145.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.db.generic_1.0.1.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.oda_3.3.0.v201004270801.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.oda.consumer_3.2.3.v201005281018.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.oda.design_3.3.0.v201004020648.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.oda.flatfile_3.1.1.v201001131420.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.oda.profile_3.2.3.v201005281018.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.connectivity.sqm.core_1.2.0.v201005270630.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.hsqldb_1.0.0.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.hsqldb.dbdefinition_1.0.0.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.db2.iseries_1.0.2.v201005211230.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.db2.iseries.dbdefinition_1.0.3.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.db2.luw_1.0.2.v201005211230.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.db2.luw.dbdefinition_1.0.4.v201005211215.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.db2.zseries_1.0.2.v201005211230.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.db2.zseries.dbdefinition_1.0.4.v201005211230.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.informix_1.0.1.v201005211230.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.ibm.informix.dbdefinition_1.0.4.v201005211230.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.msft.sqlserver_1.0.1.v201001180222.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.msft.sqlserver.dbdefinition_1.0.0.v201004211630.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.mysql_1.0.2.v201002041100.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.mysql.dbdefinition_1.0.4.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.oda.ws_1.2.2.v201001131420.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.oda.xml_1.2.1.v201001151620.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.oracle_1.0.0.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.oracle.dbdefinition_1.0.101.v201004211630.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.postgresql_1.0.1.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.postgresql.dbdefinition_1.0.1.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.sap.maxdb_1.0.0.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.enablement.sap.maxdb.dbdefinition_1.0.0.v200906020900.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.modelbase.dbdefinition_1.0.2.v201002130228.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.modelbase.derby_1.0.0.v201002161452.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.datatools.modelbase.sql_1.0.4.v201002250945.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.emf_2.6.0.v20100607-0756.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.emf.common_2.6.0.v20100607-0756.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.emf.ecore_2.6.0.v20100607-0756.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.emf.ecore.change_2.5.0.v20100521-1846.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.emf.ecore.xmi_2.5.0.v20100521-1846.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.equinox.app_1.3.0.v20100512.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.equinox.common_3.6.0.v20100503.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.equinox.preferences_3.3.0.v20100503.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.equinox.registry_3.5.0.v20100503.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.osgi_3.6.0.v20100517.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.osgi.services_3.2.100.v20100503.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.update.configurator_3.3.100.v20100512.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.w3c.css.sac_1.3.0.v200805290154.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.w3c.dom.smil_1.0.0.v200806040011.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.w3c.dom.svg_1.1.0.v200806040011.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.eclipse.core.runtime.compatibility.registry_3.3.0.v20100520-1800/runtime_registry_compatibility.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.mozilla.rhino_1.7.1.v20090608/lib/js.jar
ofbiz/trunk/framework/birt/lib/platform/plugins/org.w3c.sac_1.3.0.v20090608/lib/flute.jar
ofbiz/trunk/framework/catalina/lib/ecj-3.3.1.jar
=========================================================================
Eclipse Public License - v 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation
distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are
distributed by that particular Contributor. A Contribution 'originates' from a
Contributor if it was added to the Program by such Contributor itself or anyone
acting on such Contributor's behalf. Contributions do not include additions to
the Program which: (i) are separate modules of software distributed in
conjunction with the Program under their own license agreement, and (ii) are not
derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor which are
necessarily infringed by the use or sale of its Contribution alone or when
combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement,
including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free copyright license to
reproduce, prepare derivative works of, publicly display, publicly perform,
distribute and sublicense the Contribution of such Contributor, if any, and such
derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
Patents to make, use, sell, offer to sell, import and otherwise transfer the
Contribution of such Contributor, if any, in source code and object code form.
This patent license shall apply to the combination of the Contribution and the
Program if, at the time the Contribution is added by the Contributor, such
addition of the Contribution causes such combination to be covered by the
Licensed Patents. The patent license shall not apply to any other combinations
which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to
its Contributions set forth herein, no assurances are provided by any
Contributor that the Program does not infringe the patent or other intellectual
property rights of any other entity. Each Contributor disclaims any liability to
Recipient for claims brought by any other entity based on infringement of
intellectual property rights or otherwise. As a condition to exercising the
rights and licenses granted hereunder, each Recipient hereby assumes sole
responsibility to secure any other intellectual property rights needed, if any.
For example, if a third party patent license is required to allow Recipient to
distribute the Program, it is Recipient's responsibility to acquire that license
before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright
rights in its Contribution, if any, to grant the copyright license set forth in
this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its
own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and
conditions, express and implied, including warranties or conditions of title and
non-infringement, and implied warranties or conditions of merchantability and
fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for
damages, including direct, indirect, special, incidental and consequential
damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by
that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor,
and informs licensees how to obtain it in a reasonable manner on or through a
medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the
Program.

Each Contributor must identify itself as the originator of its Contribution, if
any, in a manner that reasonably allows subsequent Recipients to identify the
originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with
respect to end users, business partners and the like. While this license is
intended to facilitate the commercial use of the Program, the Contributor who
includes the Program in a commercial product offering should do so in a manner
which does not create potential liability for other Contributors. Therefore, if
a Contributor includes the Program in a commercial product offering, such
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
every other Contributor ("Indemnified Contributor") against any losses, damages
and costs (collectively "Losses") arising from claims, lawsuits and other legal
actions brought by a third party against the Indemnified Contributor to the
extent caused by the acts or omissions of such Commercial Contributor in
connection with its distribution of the Program in a commercial product
offering. The obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property infringement. In order
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
Contributor in writing of such claim, and b) allow the Commercial Contributor
to control, and cooperate with the Commercial Contributor in, the defense and
any related settlement negotiations. The Indemnified Contributor may
participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product
offering, Product X. That Contributor is then a Commercial Contributor. If that
Commercial Contributor then makes performance claims, or offers warranties
related to Product X, those performance claims and warranties are such
Commercial Contributor's responsibility alone. Under this section, the
Commercial Contributor would have to defend claims against the other
Contributors related to those performance claims and warranties, and if a court
requires any other Contributor to pay any damages as a result, the Commercial
Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
Recipient is solely responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its exercise of
rights under this Agreement , including but not limited to the risks and costs
of program errors, compliance with applicable laws, damage to or loss of data,
programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable
law, it shall not affect the validity or enforceability of the remainder of the
terms of this Agreement, and without further action by the parties hereto, such
provision shall be reformed to the minimum extent necessary to make such
provision valid and enforceable.

If Recipient institutes patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Program itself
(excluding combinations of the Program with other software or hardware)
infringes such Recipient's patent(s), then such Recipient's rights granted under
Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to
comply with any of the material terms or conditions of this Agreement and does
not cure such failure in a reasonable period of time after becoming aware of
such noncompliance. If all Recipient's rights under this Agreement terminate,
Recipient agrees to cease use and distribution of the Program as soon as
reasonably practicable. However, Recipient's obligations under this Agreement
and any licenses granted by Recipient relating to the Program shall continue and
survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in
order to avoid inconsistency the Agreement is copyrighted and may only be
modified in the following manner. The Agreement Steward reserves the right to
publish new versions (including revisions) of this Agreement from time to time.
No one other than the Agreement Steward has the right to modify this Agreement.
The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation
may assign the responsibility to serve as the Agreement Steward to a suitable
separate entity. Each new version of the Agreement will be given a
distinguishing version number. The Program (including Contributions) may always
be distributed subject to the version of the Agreement under which it was
received. In addition, after a new version of the Agreement is published,
Contributor may elect to distribute the Program (including its Contributions)
under the new version. Except as expressly stated in Sections 2(a) and 2(b)
above, Recipient receives no rights or licenses to the intellectual property of
any Contributor under this Agreement, whether expressly, by implication,
estoppel or otherwise. All rights in the Program not expressly granted under
this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the
intellectual property laws of the United States of America. No party to this
Agreement will bring a legal action under this Agreement more than one year
after the cause of action arose. Each party waives its rights to a jury trial in
any resulting litigation.

=========================================================================
Apache Ofbiz includes docbook templates in the /applications/content/template/docbook
directory with the following licence:
Copyright
---------
Copyright (C) 1999-2007 Norman Walsh
Copyright (C) 2003 Jiří Kosek
Copyright (C) 2004-2007 Steve Ball
Copyright (C) 2005-2008 The DocBook Project

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the ``Software''), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

Except as contained in this notice, the names of individuals
credited with contribution to this software shall not be used in
advertising or otherwise to promote the sale, use or other
dealings in this Software without prior written authorization
from the individuals in question.

Any stylesheet derived from this Software that is publically
distributed will be identified with a different name and the
version strings in any derived Software will be changed so that
no possibility of confusion between the derived package and this
Software will exist.

Warranty
--------
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT.  IN NO EVENT SHALL NORMAN WALSH OR ANY OTHER
CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

Contacting the Author
---------------------
The DocBook XSL stylesheets are maintained by Norman Walsh,
<ndw@nwalsh.com>, and members of the DocBook Project,
<docbook-developers@sf.net>
=========================================================================
The docbook schemas in the files docbook.xsd, docbook.dtd xlink.xsd
and xml.xsd are distributed under the GNU Free Documentation License
GNU Free Documentation License
It was allowed by the author to use the docbook files within the
Apache OFBiz system in an email to H.Bakker from N.Walsh dd
Tue, 25 Aug 2009 07:27:51 -0400 (18:27 ICT)
=========================================================================
Apache Ofbiz includes images in the ofbiz/framework/images/webapp/images/icons
directory with the following licence: Creative Commons Attribution 2.5 License 
and condition :


=========================================================================
Creative Commons Attribution 2.5 License.
http://creativecommons.org/licenses/by/2.5/

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY 
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE 
TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions
 1. "Collective Work" means a work, such as a periodical issue,
     anthology or encyclopedia, in which the Work in its 
     entirety in unmodified form, along with a number of
     other contributions, constituting separate and independent
     works in themselves, are assembled into a collective whole.
     A work that constitutes a Collective Work will not be
     considered a Derivative Work (as defined below) for the
     purposes of this License.
 2. "Derivative Work" means a work based upon the Work or upon
     the Work and other pre-existing works, such as a 
     translation, musical arrangement, dramatization,
     fictionalization, motion picture version, sound recording,
     art reproduction, abridgment, condensation, or any other 
     form in which the Work may be recast, transformed,
     or adapted, except that a work that constitutes 
     a Collective Work will not be considered a Derivative
     Work for the purpose of this License. 
     For the avoidance of doubt, where the Work is a musical
     composition or sound recording, the synchronization of 
     the Work in timed-relation with a moving image ("synching")
     will be considered a Derivative Work for the purpose
     of this License.
 3. "Licensor" means the individual or entity that offers 
    the Work under the terms of this License.
 4. "Original Author" means the individual or entity who
    created the Work.
 5. "Work" means the copyrightable work of authorship offered
    under the terms of this License.
 6. "You" means an individual or entity exercising rights under
    this License who has not previously violated the terms of
    this License with respect to the Work, or who has received
    express permission from the Licensor to exercise rights 
    under this License despite a previous violation.

2. Fair Use Rights. Nothing in this license is intended to reduce,
   limit, or restrict any rights arising from fair use, first
   sale or other limitations on the exclusive rights of the
   copyright owner under copyright law or other applicable laws.

3. License Grant. Subject to the terms and conditions of
   this License, Licensor hereby grants You a worldwide,
   royalty-free, non-exclusive, perpetual (for the
   duration of the applicable copyright) license to
   exercise the rights in the Work as stated below:

 1. to reproduce the Work, to incorporate the Work into
    one or more Collective Works, and to reproduce the
    Work as incorporated in the Collective Works;
 2. to create and reproduce Derivative Works;
 3. to distribute copies or phonorecords of, display
    publicly, perform publicly, and perform publicly 
    by means of a digital audio transmission the Work
    including as incorporated in Collective Works;
 4. to distribute copies or phonorecords of, display publicly,
    perform publicly, and perform publicly by means of a
    digital audio transmission Derivative Works.
 5. For the avoidance of doubt, where the work is
    a musical composition:
    1. Performance Royalties Under Blanket Licenses.
       Licensor waives the exclusive right to collect,
       whether individually or via a performance rights
       society (e.g. ASCAP, BMI, SESAC), royalties for the
       public performance or public digital performance
       (e.g. webcast) of the Work.
    2. Mechanical Rights and Statutory Royalties. 
       Licensor waives the exclusive right to collect,
       whether individually or via a music rights agency
       or designated agent (e.g. Harry Fox Agency),
       royalties for any phonorecord You create from
       the Work ("cover version") and distribute,
       subject to the compulsory license created by
       17 USC Section 115 of the US Copyright Act
       (or the equivalent in other jurisdictions).
 6. Webcasting Rights and Statutory Royalties. 
    For the avoidance of doubt, where the Work is a sound 
    recording, Licensor waives the exclusive right to collect,
    whether individually or via a performance-rights society
    (e.g. SoundExchange), royalties for the public digital 
    performance (e.g. webcast) of the Work, subject to the
    compulsory license created by 17 USC Section 114 of the
    US Copyright Act (or the equivalent in other jurisdictions).

The above rights may be exercised in all media and formats whether
now known or hereafter devised. The above rights include the right
to make such modifications as are technically necessary to exercise
the rights in other media and formats. All rights not expressly
granted by Licensor are hereby reserved.

4. Restrictions.The license granted in Section 3 above is expressly
   made subject to and limited by the following restrictions:
 1. You may distribute, publicly display, publicly perform, 
    or publicly digitally perform the Work only under the terms
    of this License, and You must include a copy of, or the 
    Uniform Resource Identifier for, this License with every 
    copy or phonorecord of the Work You distribute, publicly 
    display, publicly perform, or publicly digitally perform.
    You may not offer or impose any terms on the Work that alter
    or restrict the terms of this License or the recipients' 
    exercise of the rights granted hereunder. You may not 
    sublicense the Work. You must keep intact all notices
    that refer to this License and to the disclaimer of warranties.
    You may not distribute, publicly display, publicly perform, 
    or publicly digitally perform the Work with any technological
    measures that control access or use of the Work in a manner
    inconsistent with the terms of this License Agreement.
    The above applies to the Work as incorporated in a Collective
    Work, but this does not require the Collective Work apart from
    the Work itself to be made subject to the terms of this License.
    If You create a Collective Work, upon notice from any Licensor
    You must, to the extent practicable, remove from the Collective 
    Work any credit as required by clause 4(b), as requested. 
    If You create a Derivative Work, upon notice from any Licensor
    You must, to the extent practicable, remove from the Derivative
    Work any credit as required by clause 4(b), as requested.
   2. If you distribute, publicly display, publicly perform, 
      or publicly digitally perform the Work or any Derivative 
      Works or Collective Works, You must keep intact all copyright
      notices for the Work and provide, reasonable to the medium
      or means You are utilizing: (i) the name of the Original Author
      (or pseudonym, if applicable) if supplied, and/or (ii) if the
      Original Author and/or Licensor designate another party or
      parties (e.g. a sponsor institute, publishing entity, journal)
      for attribution in Licensor's copyright notice, terms of
      service or by other reasonable means, the name of such party
      or parties; the title of the Work if supplied; to the extent
      reasonably practicable, the Uniform Resource Identifier,
      if any, that Licensor specifies to be associated with the Work,
      unless such URI does not refer to the copyright notice or
      licensing information for the Work; and in the case of a 
      Derivative Work, a credit identifying the use of the Work
      in the Derivative Work (e.g., "French translation of the Work
      by Original Author," or "Screenplay based on original Work by
      Original Author"). Such credit may be implemented in any 
      reasonable manner; provided, however, that in the case of a 
      Derivative Work or Collective Work, at a minimum such credit 
      will appear where any other comparable authorship credit appears
      and in a manner at least as prominent as such other comparable
      authorship credit.

5. Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability. 
EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR
BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL,
CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE
OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY
OF SUCH DAMAGES.

7. Termination
  1. This License and the rights granted hereunder will terminate
     automatically upon any breach by You of the terms of this License.
     Individuals or entities who have received Derivative Works or
     Collective Works from You under this License, however, will not
     have their licenses terminated provided such individuals or entities
     remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7,
     and 8 will survive any termination of this License.
  2. Subject to the above terms and conditions, the license granted
     here is perpetual (for the duration of the applicable copyright
     in the Work). Notwithstanding the above, Licensor reserves the
     right to release the Work under different license terms or to
     stop distributing the Work at any time; provided, however that
     any such election will not serve to withdraw this License
     (or any other license that has been, or is required to be, granted
     under the terms of this License), and this License will continue in
     full force and effect unless terminated as stated above.

8. Miscellaneous
  1. Each time You distribute or publicly digitally perform the Work or
     a Collective Work, the Licensor offers to the recipient a license to
     the Work on the same terms and conditions as the license granted to
     You under this License.
  2. Each time You distribute or publicly digitally perform a Derivative Work,
     Licensor offers to the recipient a license to the original Work on the
     same terms and conditions as the license granted to You under this License.
  3. If any provision of this License is invalid or unenforceable under
     applicable law, it shall not affect the validity or enforceability of the
     remainder of the terms of this License, and without further action by the
     parties to this agreement, such provision shall be reformed to the minimum
     extent necessary to make such provision valid and enforceable.
  4. No term or provision of this License shall be deemed waived and no breach
     consented to unless such waiver or consent shall be in writing and signed
      by the party to be charged with such waiver or consent.
  5. This License constitutes the entire agreement between the parties with
     respect to the Work licensed here. There are no understandings, agreements
     or representations with respect to the Work not specified here. 
     Licensor shall not be bound by any additional provisions that may appear
     in any communication from You. This License may not be modified without
     the mutual written agreement of the Licensor and You.

