
This software is distributed under the Apache License, version 2.0. See (1) below.
This software is copyright (c) The Apache Software Foundation and contributors.

Contents:

  (1) This software license: Apache License, version 2.0
  (2) Notices for bundled software
  (3) Licenses for bundled software


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

(1) This software license: Apache License, version 2.0


                                 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.


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

(2) Notices for bundled software

This project includes the software: aopalliance
  Available at: http://aopalliance.sourceforge.net
  Version used: 1.0
  Used under the following license: Public Domain

This project includes the software: asm
  Available at: http://asm.objectweb.org/
  Developed by: ObjectWeb (http://www.objectweb.org/)
  Version used: 3.3.1
  Used under the following license: BSD License (http://asm.objectweb.org/license.html)

This project includes the software: async.js
  Available at: https://github.com/p15martin/google-maps-hello-world/blob/master/js/libs/async.js
  Developed by: Miller Medeiros (https://github.com/millermedeiros/)
  Version used: 0.1.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Miller Medeiros (2011)

This project includes the software: backbone.js
  Available at: http://backbonejs.org
  Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
  Version used: 1.0.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jeremy Ashkenas, DocumentCloud Inc. (2010-2013)

This project includes the software: bootstrap.js
  Available at: http://twitter.github.com/bootstrap/javascript.html#transitions
  Version used: 2.0.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
  Copyright (c) Twitter, Inc. (2012)

This project includes the software: ch.qos.logback
  Available at: http://logback.qos.ch
  Developed by: QOS.ch (http://www.qos.ch)
  Version used: 1.0.7
  Used under the following license: Eclipse Public License, version 1.0 (http://www.eclipse.org/legal/epl-v10.html)

This project includes the software: com.fasterxml.jackson.core
  Available at: http://github.com/FasterXML/jackson https://github.com/FasterXML/jackson
  Developed by: FasterXML (http://fasterxml.com/)
  Version used: 2.4.5
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.fasterxml.jackson.dataformat
  Available at: https://github.com/FasterXML/jackson http://wiki.fasterxml.com/JacksonExtensionXmlDataBinding
  Developed by: FasterXML (http://fasterxml.com/)
  Version used: 2.4.5
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.fasterxml.jackson.datatype
  Available at: http://wiki.fasterxml.com/JacksonModuleJoda
  Developed by: FasterXML (http://fasterxml.com/)
  Version used: 2.4.5
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.fasterxml.jackson.jaxrs
  Available at: http://wiki.fasterxml.com/JacksonHome
  Developed by: FasterXML (http://fasterxml.com/)
  Version used: 2.4.5
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.fasterxml.jackson.module
  Available at: http://wiki.fasterxml.com/JacksonJAXBAnnotations
  Developed by: FasterXML (http://fasterxml.com/)
  Version used: 2.4.5
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.google.code.findbugs
  Available at: http://findbugs.sourceforge.net/
  Version used: 2.0.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.google.code.gson
  Available at: http://code.google.com/p/google-gson/
  Developed by: Google, Inc. (http://www.google.com)
  Version used: 2.3
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.google.guava
  Available at: http://code.google.com/p/guava-libraries
  Version used: 17.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.google.http-client
  Available at: http://code.google.com/p/google-http-java-client/
  Developed by: Google (http://www.google.com/)
  Version used: 1.18.0-rc
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.google.inject
  Available at: http://code.google.com/p/google-guice/
  Developed by: Google, Inc. (http://www.google.com)
  Version used: 3.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.google.inject.extensions
  Available at: http://code.google.com/p/google-guice/
  Developed by: Google, Inc. (http://www.google.com)
  Version used: 3.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.googlecode.concurrentlinkedhashmap
  Available at: http://code.google.com/p/concurrentlinkedhashmap
  Version used: 1.0_jdk5
  Used under the following license: Apache License (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.jamesmurty.utils
  Available at: https://github.com/jmurty/java-xmlbuilder
  Version used: 1.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

This project includes the software: com.jayway.jsonpath
  Available at: https://github.com/jayway/JsonPath
  Version used: 2.0.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.jcraft
  Available at: http://www.jcraft.com/jsch-agent-proxy/
  Developed by: JCraft,Inc. (http://www.jcraft.com/)
  Version used: 0.0.8
  Used under the following license: The BSD 3-Clause (New BSD) License (http://www.jcraft.com/jsch-agent-proxy/LICENSE.txt)

This project includes the software: com.maxmind.db
  Available at: http://dev.maxmind.com/
  Developed by: MaxMind, Inc. (http://www.maxmind.com/)
  Version used: 0.3.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html)

This project includes the software: com.maxmind.geoip2
  Available at: http://dev.maxmind.com/geoip/geoip2/web-services
  Developed by: MaxMind, Inc. (http://www.maxmind.com/)
  Version used: 0.8.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html)

This project includes the software: com.squareup.okhttp
  Available at: https://github.com/square/okhttp
  Version used: 2.2.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.squareup.okio
  Available at: https://github.com/square/okio
  Version used: 1.2.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: com.sun.jersey
  Available at: https://jersey.java.net/
  Developed by: Oracle Corporation (http://www.oracle.com/)
  Version used: 1.19
  Used under the following license: Common Development and Distribution License, version 1.1 (http://glassfish.java.net/public/CDDL+GPL_1_1.html)

This project includes the software: com.sun.jersey.contribs
  Available at: https://jersey.java.net/
  Developed by: Oracle Corporation (http://www.oracle.com/)
  Version used: 1.19
  Used under the following license: Common Development and Distribution License, version 1.1 (http://glassfish.java.net/public/CDDL+GPL_1_1.html)

This project includes the software: com.thoughtworks.xstream
  Available at: http://x-stream.github.io/
  Developed by: XStream (http://xstream.codehaus.org)
  Version used: 1.4.7
  Used under the following license: BSD License (http://xstream.codehaus.org/license.html)

This project includes the software: commons-beanutils
  Available at: http://commons.apache.org/proper/commons-beanutils/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: commons-codec
  Available at: http://commons.apache.org/proper/commons-codec/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: commons-collections
  Available at: http://commons.apache.org/collections/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 3.2.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: commons-io
  Available at: http://commons.apache.org/io/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 2.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: commons-lang
  Available at: http://commons.apache.org/lang/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 2.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: commons-logging
  Available at: http://commons.apache.org/proper/commons-logging/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.2
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: dom4j
  Available at: http://dom4j.sourceforge.net/
  Developed by: MetaStuff Ltd. (http://sourceforge.net/projects/dom4j)
  Version used: 1.6.1
  Used under the following license: MetaStuff BSD style license (3-clause) (http://dom4j.sourceforge.net/dom4j-1.6.1/license.html)

This project includes the software: handlebars.js
  Available at: https://github.com/wycats/handlebars.js
  Developed by: Yehuda Katz (https://github.com/wycats/)
  Inclusive of: handlebars*.js
  Version used: 1.0-rc1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Yehuda Katz (2012)

This project includes the software: io.airlift
  Available at: https://github.com/airlift/airline
  Version used: 0.6
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: io.cloudsoft.windows
  Available at: http://github.com/cloudsoft/winrm4j
  Version used: 0.1.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: io.swagger
  Available at: https://github.com/swagger-api/swagger-core
  Version used: 1.5.3
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html)

This project includes the software: javax.annotation
  Available at: https://jcp.org/en/jsr/detail?id=250
  Version used: 1.0
  Used under the following license: Common Development and Distribution License, version 1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html)

This project includes the software: javax.inject
  Available at: http://code.google.com/p/atinject/
  Version used: 1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: javax.servlet
  Available at: http://servlet-spec.java.net
  Developed by: GlassFish Community (https://glassfish.dev.java.net)
  Version used: 3.1.0
  Used under the following license: CDDL + GPLv2 with classpath exception (https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)

This project includes the software: javax.validation
  Available at: http://beanvalidation.org
  Version used: 1.1.0.Final
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: javax.ws.rs
  Available at: https://jsr311.java.net/
  Developed by: Sun Microsystems, Inc (http://www.sun.com/)
  Version used: 1.1.1
  Used under the following license: CDDL License (http://www.opensource.org/licenses/cddl1.php)

This project includes the software: joda-time
  Available at: http://joda-time.sourceforge.net
  Developed by: Joda.org (http://www.joda.org)
  Version used: 2.2
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: jQuery JavaScript Library
  Available at: http://jquery.com/
  Developed by: The jQuery Foundation (http://jquery.org/)
  Inclusive of: jquery.js
  Version used: 1.7.2
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) John Resig (2005-2011)
  Includes code fragments from sizzle.js:
    Copyright (c) The Dojo Foundation
    Available at http://sizzlejs.com
    Used under the MIT license

This project includes the software: jQuery BBQ: Back Button & Query Library
  Available at: http://benalman.com/projects/jquery-bbq-plugin/
  Developed by: "Cowboy" Ben Alman (http://benalman.com/)
  Inclusive of: jquery.ba-bbq*.js
  Version used: 1.2.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) "Cowboy" Ben Alman (2010)"

This project includes the software: DataTables Table plug-in for jQuery
  Available at: http://www.datatables.net/
  Developed by: SpryMedia Ltd (http://sprymedia.co.uk/)
  Inclusive of: jquery.dataTables.{js,css}
  Version used: 1.9.4
  Used under the following license: The BSD 3-Clause (New BSD) License (http://opensource.org/licenses/BSD-3-Clause)
  Copyright (c) Allan Jardine (2008-2012)

This project includes the software: jQuery Form Plugin
  Available at: https://github.com/malsup/form
  Developed by: Mike Alsup (http://malsup.com/)
  Inclusive of: jquery.form.js
  Version used: 3.09
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) M. Alsup (2006-2013)

This project includes the software: jQuery Wiggle
  Available at: https://github.com/jordanthomas/jquery-wiggle
  Inclusive of: jquery.wiggle.min.js
  Version used: swagger-ui:1.0.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) WonderGroup and Jordan Thomas (2010)
  Previously online at http://labs.wondergroup.com/demos/mini-ui/index.html.
  The version included here is from the Swagger UI distribution.

This project includes the software: js-uri
  Available at: http://code.google.com/p/js-uri/
  Developed by: js-uri contributors (https://code.google.com/js-uri)
  Inclusive of: URI.js
  Version used: 0.1
  Used under the following license: The BSD 3-Clause (New BSD) License (http://opensource.org/licenses/BSD-3-Clause)
  Copyright (c) js-uri contributors (2013)

This project includes the software: js-yaml.js
  Available at: https://github.com/nodeca/
  Developed by: Vitaly Puzrin (https://github.com/nodeca/)
  Version used: 3.2.7
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Vitaly Puzrin (2011-2015)

This project includes the software: marked.js
  Available at: https://github.com/chjj/marked
  Developed by: Christopher Jeffrey (https://github.com/chjj)
  Version used: 0.3.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Christopher Jeffrey (2011-2014)

This project includes the software: moment.js
  Available at: http://momentjs.com
  Developed by: Tim Wood (http://momentjs.com)
  Version used: 2.1.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Tim Wood, Iskren Chernev, Moment.js contributors (2011-2014)

This project includes the software: net.iharder
  Available at: http://iharder.net/base64/
  Version used: 2.3.8
  Used under the following license: Public domain

This project includes the software: net.java.dev.jna
  Available at: https://github.com/twall/jna
  Version used: 4.0.0
  Used under the following license: Apache License, version 2.0 (http://www.gnu.org/licenses/licenses.html)

This project includes the software: net.minidev
  Available at: http://www.minidev.net/
  Developed by: Chemouni Uriel (http://www.minidev.net/)
  Version used: 2.1.1; 1.0.2
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: net.schmizz
  Available at: http://github.com/shikhar/sshj
  Version used: 0.8.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.99soft.guice
  Available at: http://99soft.github.com/rocoto/
  Developed by: 99 Software Foundation (http://www.99soft.org/)
  Version used: 6.2
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.commons
  Available at: http://commons.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 3.3.2; 1.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.felix
  Available at: http://felix.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 4.4.0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.httpcomponents
  Available at: http://hc.apache.org/httpcomponents-client-ga http://hc.apache.org/httpcomponents-core-ga
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 4.4.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.jclouds
  Available at: http://jclouds.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.jclouds.api
  Available at: http://jclouds.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.jclouds.common
  Available at: http://jclouds.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.jclouds.driver
  Available at: http://jclouds.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.jclouds.labs
  Available at: http://jclouds.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.apache.jclouds.provider
  Available at: http://jclouds.apache.org/
  Developed by: The Apache Software Foundation (http://www.apache.org/)
  Version used: 1.9.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.bouncycastle
  Available at: http://www.bouncycastle.org/java.html
  Version used: 1.49
  Used under the following license: Bouncy Castle Licence (http://www.bouncycastle.org/licence.html)

This project includes the software: org.codehaus.groovy
  Available at: http://groovy.codehaus.org/
  Developed by: The Codehaus (http://codehaus.org)
  Version used: 2.3.7
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.codehaus.jackson
  Available at: http://jackson.codehaus.org
  Developed by: FasterXML (http://fasterxml.com)
  Version used: 1.9.13
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.codehaus.jettison
  Version used: 1.1
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

This project includes the software: org.codehaus.woodstox
  Available at: http://wiki.fasterxml.com/WoodstoxStax2
  Developed by: fasterxml.com (http://fasterxml.com)
  Version used: 3.1.4
  Used under the following license: BSD License (http://www.opensource.org/licenses/bsd-license.php)

This project includes the software: org.eclipse.jetty
  Available at: http://www.eclipse.org/jetty
  Developed by: Webtide (http://webtide.com)
  Version used: 9.2.13.v20150730
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

This project includes the software: org.eclipse.jetty.toolchain
  Available at: http://www.eclipse.org/jetty
  Developed by: Mort Bay Consulting (http://www.mortbay.com)
  Version used: 3.1.M0
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

This project includes the software: org.freemarker
  Available at: http://freemarker.org/
  Version used: 2.3.22
  Used under the following license: Apache License, version 2.0 (http://freemarker.org/LICENSE.txt)

This project includes the software: org.glassfish.external
  Version used: 1.0-b01-ea
  Used under the following license: Common Development and Distribution License (http://opensource.org/licenses/CDDL-1.0)

This project includes the software: org.hibernate
  Available at: http://jtidy.sourceforge.net
  Version used: r8-20060801
  Used under the following license: Java HTML Tidy License (http://sourceforge.net/p/jtidy/code/HEAD/tree/trunk/jtidy/LICENSE.txt?revision=95)

This project includes the software: org.javassist
  Available at: http://www.javassist.org/
  Version used: 3.16.1-GA
  Used under the following license: Apache License, version 2.0 (http://www.mozilla.org/MPL/MPL-1.1.html)

This project includes the software: org.jvnet.mimepull
  Available at: http://mimepull.java.net
  Developed by: Oracle Corporation (http://www.oracle.com/)
  Version used: 1.9.3
  Used under the following license: Common Development and Distribution License, version 1.1 (https://glassfish.java.net/public/CDDL+GPL_1_1.html)

This project includes the software: org.mongodb
  Available at: http://www.mongodb.org
  Version used: 3.0.3
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)

This project includes the software: org.python
  Available at: http://www.jython.org/
  Version used: 2.7-b3
  Used under the following license: Jython Software License (http://www.jython.org/license.html)

This project includes the software: org.reflections
  Available at: http://code.google.com/p/reflections/
  Version used: 0.9.9-RC1
  Used under the following license: WTFPL (http://www.wtfpl.net/)

This project includes the software: org.slf4j
  Available at: http://www.slf4j.org
  Developed by: QOS.ch (http://www.qos.ch)
  Version used: 1.6.6
  Used under the following license: The MIT License (http://www.opensource.org/licenses/mit-license.php)

This project includes the software: org.tukaani
  Available at: http://tukaani.org/xz/java.html
  Version used: 1.0
  Used under the following license: Public Domain

This project includes the software: org.yaml
  Available at: http://www.snakeyaml.org
  Version used: 1.11
  Used under the following license: Apache License, version 2.0 (in-project reference: LICENSE.txt)

This project includes the software: RequireJS
  Available at: http://requirejs.org/
  Developed by: The Dojo Foundation (http://dojofoundation.org/)
  Inclusive of: require.js, text.js
  Version used: 2.0.6
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) The Dojo Foundation (2010-2012)

This project includes the software: RequireJS (r.js maven plugin)
  Available at: http://github.com/jrburke/requirejs
  Developed by: The Dojo Foundation (http://dojofoundation.org/)
  Inclusive of: r.js
  Version used: 2.1.6
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) The Dojo Foundation (2009-2013)
  Includes code fragments for source-map and other functionality:
    Copyright (c) The Mozilla Foundation and contributors (2011)
    Used under the BSD 2-Clause license.
  Includes code fragments for parse-js and other functionality:
    Copyright (c) Mihai Bazon (2010, 2012)
    Used under the BSD 2-Clause license.
  Includes code fragments for uglifyjs/consolidator:
    Copyright (c) Robert Gust-Bardon (2012)
    Used under the BSD 2-Clause license.
  Includes code fragments for the esprima parser:
    Copyright (c):
      Ariya Hidayat (2011, 2012)
      Mathias Bynens (2012)
      Joost-Wim Boekesteijn (2012)
      Kris Kowal (2012)
      Yusuke Suzuki (2012)
      Arpad Borsos (2012)
    Used under the BSD 2-Clause license.

This project includes the software: swagger
  Used under the following license: <no license info>

This project includes the software: swagger-ui
  Used under the following license: <no license info>

This project includes the software: typeahead.js
  Available at: https://github.com/twitter/typeahead.js
  Developed by: Twitter, Inc (http://twitter.com)
  Version used: 0.10.5
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Twitter, Inc. and other contributors (2013-2014)

This project includes the software: underscore.js
  Available at: http://underscorejs.org
  Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
  Inclusive of: underscore*.{js,map}
  Version used: 1.4.4
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jeremy Ashkenas, DocumentCloud Inc. (2009-2013)

This project includes the software: underscore.js:1.7.0
  Available at: http://underscorejs.org
  Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
  Inclusive of: underscore*.{js,map}
  Version used: 1.7.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (2009-2014)

This project includes the software: xmlpull
  Available at: http://www.xmlpull.org
  Version used: 1.1.3.1
  Used under the following license: Public Domain (http://www.xmlpull.org/v1/download/unpacked/LICENSE.txt)

This project includes the software: xpp3
  Available at: http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/
  Developed by: Extreme! Lab, Indiana University (http://www.extreme.indiana.edu/)
  Version used: 1.1.4c
  Used under the following license: Indiana University Extreme! Lab Software License, vesion 1.1.1 (https://github.com/apache/openmeetings/blob/a95714ce3f7e587d13d3d0bb3b4f570be15c67a5/LICENSE#L1361)

This project includes the software: ZeroClipboard
  Available at: http://zeroclipboard.org/
  Developed by: ZeroClipboard contributors (https://github.com/zeroclipboard)
  Inclusive of: ZeroClipboard.*
  Version used: 1.3.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jon Rohan, James M. Greene (2014)


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

(3) Licenses for bundled software

Contents:

  Apache License, Version 2.0
  The BSD 2-Clause License
  The BSD 3-Clause License ("New BSD")
  COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
  COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1
  Eclipse Public License, version 1.0
  The MIT License ("MIT")
  WTF Public License
  Bouncy Castle License
  JTidy License
  Jython License
  MetaStuff BSD Style License
  Indiana University Extreme! Lab Software License, Version 1.1.1


Apache License, Version 2.0

  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.
  

The BSD 2-Clause License

  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.
  
  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 HOLDER 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 BSD 3-Clause License ("New BSD")

  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. Neither the name of the copyright holder 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 HOLDER 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.
  

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 recipient"s 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 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.
  
  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
  jurisdiction"s 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.
  

COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1

  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
  recipient's 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.  Oracle 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. If You assert a patent infringement claim against Participant alleging
  that the Participant Software 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.
  
  6.4. 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 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.
  
  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
  jurisdiction's 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.


Eclipse Public License, version 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.
  

The MIT License ("MIT")

  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.
  

WTF Public License

  DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE, Version 2, December 2004 
 
  Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> 
 
  Everyone is permitted to copy and distribute verbatim or modified 
  copies of this license document, and changing it is allowed as long 
  as the name is changed. 
 
             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 
 
   0. You just DO WHAT THE FUCK YOU WANT TO.
 

Bouncy Castle License
  
  Copyright (c) 2000 - 2015 The Legion of the Bouncy Castle Inc.
  (http://www.bouncycastle.org)
  
  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.
  

JTidy License

  Java HTML Tidy - JTidy
  HTML parser and pretty printer
  
  Copyright (c) 1998-2000 World Wide Web Consortium (Massachusetts
  Institute of Technology, Institut National de Recherche en
  Informatique et en Automatique, Keio University). All Rights
  Reserved.
  
  Contributing Author(s):
  
     Dave Raggett <dsr@w3.org>
     Andy Quick <ac.quick@sympatico.ca> (translation to Java)
     Gary L Peskin <garyp@firstech.com> (Java development)
     Sami Lempinen <sami@lempinen.net> (release management)
     Fabrizio Giustina <fgiust at users.sourceforge.net>
  
  The contributing author(s) would like to thank all those who
  helped with testing, bug fixes, and patience.  This wouldn't
  have been possible without all of you.
  
  COPYRIGHT NOTICE:
   
  This software and documentation is provided "as is," and
  the copyright holders and contributing author(s) 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. 
  
  The copyright holders and contributing author(s) will not be
  liable for any direct, indirect, special or consequential damages
  arising out of any use of the software or documentation, even if
  advised of the possibility of such damage.
  
  Permission is hereby granted to use, copy, modify, and distribute
  this source code, or portions hereof, documentation and executables,
  for any purpose, without fee, subject to the following restrictions:
  
  1. The origin of this source code must not be misrepresented.
  2. Altered versions must be plainly marked as such and must
     not be misrepresented as being the original source.
  3. This Copyright notice may not be removed or altered from any
     source or altered source distribution.
   
  The copyright holders and contributing author(s) specifically
  permit, without fee, and encourage the use of this source code
  as a component for supporting the Hypertext Markup Language in
  commercial products. If you use this source code in a product,
  acknowledgment is not required but would be appreciated.
  

Jython License

  Jython 2.0, 2.1 License
  
  Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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.
  
  

MetaStuff BSD Style License

  Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
  
  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 "DOM4J" must not be used to endorse or promote
     products derived from this Software without prior written
     permission of MetaStuff, Ltd.  For written permission,
     please contact dom4j-info@metastuff.com.
  
  4. Products derived from this Software may not be called "DOM4J"
     nor may "DOM4J" appear in their names without prior written
     permission of MetaStuff, Ltd. DOM4J is a registered
     trademark of MetaStuff, Ltd.
  
  5. Due credit should be given to the DOM4J Project -
     http://www.dom4j.org
  
  THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. 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
  METASTUFF, LTD. 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.
  

Indiana University Extreme! Lab Software License, Version 1.1.1

  Copyright (c) 2002 Extreme! Lab, Indiana University. 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 Indiana University
    Extreme! Lab (http://www.extreme.indiana.edu/)."
  
  Alternately, this acknowledgment may appear in the software itself,
  if and wherever such third-party acknowledgments normally appear.
  
  4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab"
  must not be used to endorse or promote products derived from this
  software without prior written permission. For written permission,
  please contact http://www.extreme.indiana.edu/.
  
  5. Products derived from this software may not use "Indiana Univeristy"
  name nor may "Indiana Univeristy" appear in their name, without prior
  written permission of the Indiana University.
  
  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 AUTHORS, COPYRIGHT HOLDERS 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.
  

