Apache Druid (incubating)
Copyright 2019 The Apache Software Foundation

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


############ SOURCE/JAVA-CORE ############

================= Apache Hive =================
Apache Hive
Copyright 2008-2018 The Apache Software Foundation




================= Apache Lucene =================
Apache Lucene
Copyright 2001-2019 The Apache Software Foundation




================= Apache Calcite =================
Apache Calcite
Copyright 2012-2019 The Apache Software Foundation

This product is based on source code originally developed
by DynamoBI Corporation, LucidEra Inc., SQLstream Inc. and others
under the auspices of the Eigenbase Foundation
and released as the LucidDB project.




================= Apache Hadoop =================
Apache Hadoop
Copyright 2009-2017 The Apache Software Foundation




================= Metamarkets java-util =================
java-util
Copyright 2011-2017 Metamarkets Group Inc.




================= Metamarkets bytebuffer-collections =================
bytebuffer-collections
Copyright 2011-2015 Metamarkets Group Inc.




================= Metamarkets extendedset =================
extendedset
Copyright 2012 Metamarkets Group Inc.

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

This library contains a modified version of Alessandro Colantonio's CONCISE
(COmpressed 'N' Composable Integer SEt) library, extending the functionality of
ConciseSet to use IntBuffers.




############ BINARY/WEB-CONSOLE ############

================= tslib 0.9.3 =================
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



############ BINARY/JAVA-CORE ############

================= aggdesigner-algorithm-6.0.jar =================
Aggregate Designer

Copyright 2006 - 2013 Pentaho Corporation.  All rights reserved.
Copyright 2000-2005, 2014-2016 Julian Hyde




================= airline-0.7.jar =================
Copyright Notices
=================

Copyright 2011 Dain Sundstrom <dain@iq80.com>
Copyright 2010 Cedric Beust <cedric@beust.com>




================= audience-annotations-0.5.0.jar =================
Apache Yetus - Audience Annotations
Copyright 2015-2017 The Apache Software Foundation




================= avatica-core-1.10.0.jar =================
Apache Calcite Avatica
Copyright 2012-2017 The Apache Software Foundation




================= avatica-metrics-1.10.0.jar =================
Apache Calcite Avatica Metrics
Copyright 2012-2017 The Apache Software Foundation




================= avatica-server-1.10.0.jar =================
Apache Calcite Avatica Server
Copyright 2012-2017 The Apache Software Foundation




================= AWS SDK for Java 1.11.199 =================
AWS SDK for Java
Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.

This product includes software developed by
Amazon Technologies, Inc (http://www.amazon.com/).

**********************
THIRD PARTY COMPONENTS
**********************
This software includes third party software subject to the following copyrights:
- XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty.
- PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.

The licenses for these third party components are included in LICENSE.txt




================= calcite-core-1.17.0.jar =================
Calcite Core
Copyright 2012-2018 The Apache Software Foundation




================= calcite-linq4j-1.17.0.jar =================
Calcite Linq4j
Copyright 2012-2018 The Apache Software Foundation




================= classmate-1.0.0.jar =================
Java ClassMate library was originally written by Tatu Saloranta (tatu.saloranta@iki.fi)

Other developers who have contributed code are:

* Brian Langel




================= commons-beanutils-1.9.3.jar =================
Apache Commons BeanUtils
Copyright 2000-2016 The Apache Software Foundation




================= commons-cli-1.2.jar =================
Apache Commons CLI
Copyright 2001-2009 The Apache Software Foundation




================= commons-codec-1.7.jar =================
Apache Commons Codec
Copyright 2002-2012 The Apache Software Foundation

--------------------------------------------------------------------------------
src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java contains
test data from http://aspell.sourceforge.net/test/batch0.tab.

Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org). Verbatim copying
and distribution of this entire article is permitted in any medium,
provided this notice is preserved.
--------------------------------------------------------------------------------




================= commons-collections-3.2.2.jar =================
Apache Commons Collections
Copyright 2001-2015 The Apache Software Foundation




================= commons-collections4-4.1.jar =================
Apache Commons Collections
Copyright 2001-2015 The Apache Software Foundation




================= commons-compress-1.16.jar =================
Apache Commons Compress
Copyright 2002-2018 The Apache Software Foundation

The files in the package org.apache.commons.compress.archivers.sevenz
were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
which has been placed in the public domain:

"LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html)




================= commons-dbcp2-2.0.1.jar =================
Apache Commons DBCP
Copyright 2001-2014 The Apache Software Foundation




================= commons-io-2.5.jar =================
Apache Commons IO
Copyright 2002-2016 The Apache Software Foundation




================= commons-lang-2.6.jar =================
Apache Commons Lang
Copyright 2001-2011 The Apache Software Foundation




================= commons-lang3-3.7.jar =================
Apache Commons Lang
Copyright 2001-2017 The Apache Software Foundation

This product includes software from the Spring Framework,
under the Apache License 2.0 (see: StringUtils.containsWhitespace())




================= commons-logging-1.1.1.jar =================
// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for Commons Logging
// ------------------------------------------------------------------

Commons Logging
Copyright 2001-2007 The Apache Software Foundation

This product includes/uses software(s) developed by 'an unknown organization'
  - Unnamed - avalon-framework:avalon-framework:jar:4.1.3
  - Unnamed - log4j:log4j:jar:1.2.12
  - Unnamed - logkit:logkit:jar:1.0.1




================= commons-math3-3.6.1.jar =================
Apache Commons Math
Copyright 2001-2016 The Apache Software Foundation

This product includes software developed for Orekit by
CS Systèmes d'Information (http://www.c-s.fr/)
Copyright 2010-2012 CS Systèmes d'Information




================= commons-pool-1.6.jar =================
Apache Commons Pool
Copyright 2001-2012 The Apache Software Foundation




================= commons-pool2-2.2.jar =================
Apache Commons Pool
Copyright 2001-2014 The Apache Software Foundation

The LinkedBlockingDeque implementation is based on an implementation written by
Doug Lea with assistance from members of JCP JSR-166 Expert Group and released
to the public domain, as explained at
http://creativecommons.org/licenses/publicdomain




================= commons-text-1.3.jar =================
Apache Commons Text
Copyright 2001-2018 The Apache Software Foundation




================= compress-lzf-1.0.4.jar =================
# Compress LZF

This library contains efficient implementation of LZF compression format,
as well as additional helper classes that build on JDK-provided gzip (deflat)
codec.

## Licensing

Library is licensed under Apache License 2.0, as per accompanying LICENSE file.

## Credit

Library has been written by Tatu Saloranta (tatu.saloranta@iki.fi).
It was started at Ning, inc., as an official Open Source process used by
platform backend, but after initial versions has been developed outside of
Ning by supporting community.

Other contributors include:

* Jon Hartlaub (first versions of streaming reader/writer; unit tests)
* Cedrik Lime: parallel LZF implementation

Various community members have contributed bug reports, and suggested minor
fixes; these can be found from file "VERSION.txt" in SCM.




================= config-magic-0.9.jar =================
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).




================= curator-client-4.1.0.jar =================
Curator Client
Copyright 2011-2018 The Apache Software Foundation




================= curator-framework-4.1.0.jar =================
Curator Framework
Copyright 2011-2018 The Apache Software Foundation




================= curator-recipes-4.1.0.jar =================
Curator Recipes
Copyright 2011-2018 The Apache Software Foundation




================= curator-x-discovery-4.1.0.jar =================
Curator Service Discovery
Copyright 2011-2018 The Apache Software Foundation




================= Derby 10.11.1.1 =================
derby-10.11.1.1.jar
derbyclient-10.11.1.1.jar
derbynet-10.11.1.1.jar
=================
=========================================================================
==  NOTICE file corresponding to section 4(d) of the Apache License,
==  Version 2.0, in this case for the Apache Derby distribution.
==
==  DO NOT EDIT THIS FILE DIRECTLY. IT IS GENERATED
==  BY THE buildnotice TARGET IN THE TOP LEVEL build.xml FILE.
==
=========================================================================

Apache Derby
Copyright 2004-2014 The Apache Software Foundation


=========================================================================

Portions of Derby were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant and Corporate Contribution License Agreement",
informally known as the "Derby CLA".
The following copyright notice(s) were affixed to portions of the code
with which this file is now or was at one time distributed
and are placed here unaltered.

(C) Copyright 1997,2004 International Business Machines Corporation.  All rights reserved.

(C) Copyright IBM Corp. 2003.


=========================================================================


The portion of the functionTests under 'nist' was originally
developed by the National Institute of Standards and Technology (NIST),
an agency of the United States Department of Commerce, and adapted by
International Business Machines Corporation in accordance with the NIST
Software Acknowledgment and Redistribution document at
http://www.itl.nist.gov/div897/ctg/sql_form.htm



=========================================================================


The JDBC apis for small devices and JDBC3 (under java/stubs/jsr169 and
java/stubs/jdbc3) were produced by trimming sources supplied by the
Apache Harmony project. In addition, the Harmony SerialBlob and
SerialClob implementations are used. The following notice covers the Harmony sources:

Portions of Harmony were originally developed by
Intel Corporation and are licensed to the Apache Software
Foundation under the "Software Grant and Corporate Contribution
License Agreement", informally known as the "Intel Harmony CLA".


=========================================================================


The Derby build relies on source files supplied by the Apache Felix
project. The following notice covers the Felix files:

  Apache Felix Main
  Copyright 2008 The Apache Software Foundation


  I. Included Software

  This product includes software developed at
  The Apache Software Foundation (http://www.apache.org/).
  Licensed under the Apache License 2.0.

  This product includes software developed at
  The OSGi Alliance (http://www.osgi.org/).
  Copyright (c) OSGi Alliance (2000, 2007).
  Licensed under the Apache License 2.0.

  This product includes software from http://kxml.sourceforge.net.
  Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany.
  Licensed under BSD License.

  II. Used Software

  This product uses software developed at
  The OSGi Alliance (http://www.osgi.org/).
  Copyright (c) OSGi Alliance (2000, 2007).
  Licensed under the Apache License 2.0.


  III. License Summary
  - Apache License 2.0
  - BSD License


=========================================================================


The Derby build relies on jar files supplied by the Apache Lucene
project. The following notice covers the Lucene files:

Apache Lucene
Copyright 2013 The Apache Software Foundation

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

Includes software from other Apache Software Foundation projects,
including, but not limited to:
 - Apache Ant
 - Apache Jakarta Regexp
 - Apache Commons
 - Apache Xerces

ICU4J, (under analysis/icu) is licensed under an MIT styles license
and Copyright (c) 1995-2008 International Business Machines Corporation and others

Some data files (under analysis/icu/src/data) are derived from Unicode data such
as the Unicode Character Database. See http://unicode.org/copyright.html for more
details.

Brics Automaton (under core/src/java/org/apache/lucene/util/automaton) is
BSD-licensed, created by Anders Møller. See http://www.brics.dk/automaton/

The levenshtein automata tables (under core/src/java/org/apache/lucene/util/automaton) were
automatically generated with the moman/finenight FSA library, created by
Jean-Philippe Barrette-LaPierre. This library is available under an MIT license,
see http://sites.google.com/site/rrettesite/moman and
http://bitbucket.org/jpbarrette/moman/overview/

The class org.apache.lucene.util.WeakIdentityMap was derived from
the Apache CXF project and is Apache License 2.0.

The Google Code Prettify is Apache License 2.0.
See http://code.google.com/p/google-code-prettify/

JUnit (junit-4.10) is licensed under the Common Public License v. 1.0
See http://junit.sourceforge.net/cpl-v10.html

This product includes code (JaspellTernarySearchTrie) from Java Spelling Checkin
g Package (jaspell): http://jaspell.sourceforge.net/
License: The BSD License (http://www.opensource.org/licenses/bsd-license.php)

The snowball stemmers in
  analysis/common/src/java/net/sf/snowball
were developed by Martin Porter and Richard Boulton.
The snowball stopword lists in
  analysis/common/src/resources/org/apache/lucene/analysis/snowball
were developed by Martin Porter and Richard Boulton.
The full snowball package is available from
  http://snowball.tartarus.org/

The KStem stemmer in
  analysis/common/src/org/apache/lucene/analysis/en
was developed by Bob Krovetz and Sergio Guzman-Lara (CIIR-UMass Amherst)
under the BSD-license.

The Arabic,Persian,Romanian,Bulgarian, and Hindi analyzers (common) come with a default
stopword list that is BSD-licensed created by Jacques Savoy.  These files reside in:
analysis/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt,
analysis/common/src/resources/org/apache/lucene/analysis/fa/stopwords.txt,
analysis/common/src/resources/org/apache/lucene/analysis/ro/stopwords.txt,
analysis/common/src/resources/org/apache/lucene/analysis/bg/stopwords.txt,
analysis/common/src/resources/org/apache/lucene/analysis/hi/stopwords.txt
See http://members.unine.ch/jacques.savoy/clef/index.html.

The German,Spanish,Finnish,French,Hungarian,Italian,Portuguese,Russian and Swedish light stemmers
(common) are based on BSD-licensed reference implementations created by Jacques Savoy and
Ljiljana Dolamic. These files reside in:
analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemmer.java
analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemmer.java

The Stempel analyzer (stempel) includes BSD-licensed software developed
by the Egothor project http://egothor.sf.net/, created by Leo Galambos, Martin Kvapil,
and Edmond Nolan.

The Polish analyzer (stempel) comes with a default
stopword list that is BSD-licensed created by the Carrot2 project. The file resides
in stempel/src/resources/org/apache/lucene/analysis/pl/stopwords.txt.
See http://project.carrot2.org/license.html.

The SmartChineseAnalyzer source code (smartcn) was
provided by Xiaoping Gao and copyright 2009 by www.imdict.net.

WordBreakTestUnicode_*.java (under modules/analysis/common/src/test/)
is derived from Unicode data such as the Unicode Character Database.
See http://unicode.org/copyright.html for more details.

The Morfologik analyzer (morfologik) includes BSD-licensed software
developed by Dawid Weiss and Marcin Miłkowski (http://morfologik.blogspot.com/).

Morfologik uses data from Polish ispell/myspell dictionary
(http://www.sjp.pl/slownik/en/) licenced on the terms of (inter alia)
LGPL and Creative Commons ShareAlike.

Morfologic includes data from BSD-licensed dictionary of Polish (SGJP)
(http://sgjp.pl/morfeusz/)

Servlet-api.jar and javax.servlet-*.jar are under the CDDL license, the original
source code for this can be found at http://www.eclipse.org/jetty/downloads.php

===========================================================================
Kuromoji Japanese Morphological Analyzer - Apache Lucene Integration
===========================================================================

This software includes a binary and/or source version of data from

  mecab-ipadic-2.7.0-20070801

which can be obtained from

  http://atilika.com/releases/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz

or

  http://jaist.dl.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz

===========================================================================
mecab-ipadic-2.7.0-20070801 Notice
===========================================================================

Nara Institute of Science and Technology (NAIST),
the copyright holders, disclaims all warranties with regard to this
software, including all implied warranties of merchantability and
fitness, in no event shall NAIST be liable for
any special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether in an
action of contract, negligence or other tortuous action, arising out
of or in connection with the use or performance of this software.

A large portion of the dictionary entries
originate from ICOT Free Software.  The following conditions for ICOT
Free Software applies to the current dictionary as well.

Each User may also freely distribute the Program, whether in its
original form or modified, to any third party or parties, PROVIDED
that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
on, or be attached to, the Program, which is distributed substantially
in the same form as set out herein and that such intended
distribution, if actually made, will neither violate or otherwise
contravene any of the laws and regulations of the countries having
jurisdiction over the User or the intended distribution itself.

NO WARRANTY

The program was produced on an experimental basis in the course of the
research and development conducted during the project and is provided
to users as so produced on an experimental basis.  Accordingly, the
program is provided without any warranty whatsoever, whether express,
implied, statutory or otherwise.  The term "warranty" used herein
includes, but is not limited to, any warranty of the quality,
performance, merchantability and fitness for a particular purpose of
the program and the nonexistence of any infringement or violation of
any right of any third party.

Each user of the program will agree and understand, and be deemed to
have agreed and understood, that there is no warranty whatsoever for
the program and, accordingly, the entire risk arising from or
otherwise connected with the program is assumed by the user.

Therefore, neither ICOT, the copyright holder, or any other
organization that participated in or was otherwise related to the
development of the program and their respective officials, directors,
officers and other employees shall be held liable for any and all
damages, including, without limitation, general, special, incidental
and consequential damages, arising out of or otherwise in connection
with the use or inability to use the program or any product, material
or result produced or otherwise obtained by using the program,
regardless of whether they have been advised of, or otherwise had
knowledge of, the possibility of such damages at any time during the
project or thereafter.  Each user will be deemed to have agreed to the
foregoing by his or her commencement of use of the program.  The term
"use" as used herein includes, but is not limited to, the use,
modification, copying and distribution of the program and the
production of secondary products from the program.

In the case where the program, whether in its original form or
modified, was distributed or delivered to or received by a user from
any person, organization or entity other than ICOT, unless it makes or
grants independently of ICOT any specific warranty to the user in
writing, such person, organization or entity, will also be exempted
from and not be held liable to the user for any such damages as noted
above as far as the program is concerned.




================= guice-4.1.0.jar =================
Google Guice - Core Library
Copyright 2006-2016 Google, Inc.




================= guice-multibindings-4.1.0.jar =================
Google Guice - Extensions - MultiBindings
Copyright 2006-2016 Google, Inc.




================= guice-servlet-4.1.0.jar =================
Google Guice - Extensions - Servlet
Copyright 2006-2016 Google, Inc.




================= httpclient-4.5.3.jar =================
Apache HttpClient
Copyright 1999-2017 The Apache Software Foundation




================= httpcore-4.4.4.jar =================
Apache HttpCore
Copyright 2005-2015 The Apache Software Foundation


This project contains annotations derived from JCIP-ANNOTATIONS
Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net




================= ion-java-1.0.2.jar =================
Amazon Ion Java
Copyright 2007-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.




================= Jackson 2.6.7 =================
jackson-annotations-2.6.7.jar
jackson-core-2.6.7.jar
jackson-databind-2.6.7.jar
jackson-dataformat-cbor-2.6.7.jar
jackson-dataformat-smile-2.6.7.jar
jackson-datatype-guava-2.6.7.jar
jackson-datatype-joda-2.6.7.jar
jackson-jaxrs-base-2.6.7.jar
jackson-jaxrs-json-provider-2.6.7.jar
jackson-jaxrs-smile-provider-2.6.7.jar
jackson-module-jaxb-annotations-2.6.7.jar
=================
# Jackson JSON processor

Jackson is a high-performance, Free/Open Source JSON processing library.
It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
been in development since 2007.
It is currently developed by a community of developers, as well as supported
commercially by FasterXML.com.

## Licensing

Jackson core and extension components may licensed under different licenses.
To find the details that apply to this artifact see the accompanying LICENSE file.
For more information, including possible other licensing options, contact
FasterXML.com (http://fasterxml.com).

## Credits

A list of contributors may be found from CREDITS file, which is included
in some artifacts (usually source distributions); but is always available
from the source code management (SCM) system project uses.




================= Jackson 1.9.13 =================
jackson-core-asl-1.9.13.jar
jackson-mapper-asl-1.9.13.jar
=================
This product currently only contains code developed by authors
of specific components, as identified by the source code files;
if such notes are missing files have been created by
Tatu Saloranta.

For additional credits (generally to people who reported problems)
see CREDITS file.




================== Jetty 9.4.10.v20180503 =================
jetty-client-9.4.10.v20180503.jar
jetty-continuation-9.4.10.v20180503.jar
jetty-http-9.4.10.v20180503.jar
jetty-io-9.4.10.v20180503.jar
jetty-proxy-9.4.10.v20180503.jar
jetty-security-9.4.10.v20180503.jar
jetty-server-9.4.10.v20180503.jar
jetty-servlet-9.4.10.v20180503.jar
jetty-servlets-9.4.10.v20180503.jar
jetty-util-9.4.10.v20180503.jar
==================
==============================================================
 Jetty Web Container
 Copyright 1995-2018 Mort Bay Consulting Pty Ltd.
==============================================================

The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
unless otherwise noted.

Jetty is dual licensed under both

  * The Apache 2.0 License
    http://www.apache.org/licenses/LICENSE-2.0.html

      and

  * The Eclipse Public 1.0 License
    http://www.eclipse.org/legal/epl-v10.html

Jetty may be distributed under either license.

------
Eclipse

The following artifacts are EPL.
 * org.eclipse.jetty.orbit:org.eclipse.jdt.core

The following artifacts are EPL and ASL2.
 * org.eclipse.jetty.orbit:javax.security.auth.message


The following artifacts are EPL and CDDL 1.0.
 * org.eclipse.jetty.orbit:javax.mail.glassfish


------
Oracle

The following artifacts are CDDL + GPLv2 with classpath exception.
https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

 * javax.servlet:javax.servlet-api
 * javax.annotation:javax.annotation-api
 * javax.transaction:javax.transaction-api
 * javax.websocket:javax.websocket-api

------
Oracle OpenJDK

If ALPN is used to negotiate HTTP/2 connections, then the following
artifacts may be included in the distribution or downloaded when ALPN
module is selected.

 * java.sun.security.ssl

These artifacts replace/modify OpenJDK classes.  The modififications
are hosted at github and both modified and original are under GPL v2 with
classpath exceptions.
http://openjdk.java.net/legal/gplv2+ce.html


------
OW2

The following artifacts are licensed by the OW2 Foundation according to the
terms of http://asm.ow2.org/license.html

org.ow2.asm:asm-commons
org.ow2.asm:asm


------
Apache

The following artifacts are ASL2 licensed.

org.apache.taglibs:taglibs-standard-spec
org.apache.taglibs:taglibs-standard-impl


------
MortBay

The following artifacts are ASL2 licensed.  Based on selected classes from
following Apache Tomcat jars, all ASL2 licensed.

org.mortbay.jasper:apache-jsp
  org.apache.tomcat:tomcat-jasper
  org.apache.tomcat:tomcat-juli
  org.apache.tomcat:tomcat-jsp-api
  org.apache.tomcat:tomcat-el-api
  org.apache.tomcat:tomcat-jasper-el
  org.apache.tomcat:tomcat-api
  org.apache.tomcat:tomcat-util-scan
  org.apache.tomcat:tomcat-util

org.mortbay.jasper:apache-el
  org.apache.tomcat:tomcat-jasper-el
  org.apache.tomcat:tomcat-el-api


------
Mortbay

The following artifacts are CDDL + GPLv2 with classpath exception.

https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

org.eclipse.jetty.toolchain:jetty-schemas

------
Assorted

The UnixCrypt.java code implements the one way cryptography used by
Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
modified April 2001  by Iris Van den Broeke, Daniel Deville.
Permission to use, copy, modify and distribute UnixCrypt
for non-commercial or commercial purposes and without fee is
granted provided that the copyright notice appears in all copies.




================= jdbi-2.63.1.jar =================
Java ClassMate library was originally written by Tatu Saloranta (tatu.saloranta@iki.fi)

Other developers who have contributed code are:

* Brian Langel




================= joda-time-2.9.9.jar =================
=============================================================================
= NOTICE file corresponding to section 4d of the Apache License Version 2.0 =
=============================================================================
This product includes software developed by
Joda.org (http://www.joda.org/).




================= log4j-1.2-api-2.5.jar =================
Apache Log4j 1.x Compatibility API
Copyright 1999-2015 Apache Software Foundation




================= log4j-api-2.5.jar =================
Apache Log4j API
Copyright 1999-2015 Apache Software Foundation




================= log4j-core-2.5.jar =================
Apache Log4j Core
Copyright 1999-2012 Apache Software Foundation

ResolverUtil.java
Copyright 2005-2006 Tim Fennell




================= log4j-jul-2.5.jar =================
Apache Log4j JUL Adapter
Copyright 1999-2015 Apache Software Foundation




================= log4j-slf4j-impl-2.5.jar =================
Apache Log4j SLF4J Binding
Copyright 1999-2015 Apache Software Foundation




================= maven-aether-provider-3.1.1.jar =================
Maven Aether Provider
Copyright 2001-2013 The Apache Software Foundation




================= maven-artifact-3.6.0.jar =================
Maven Artifact
Copyright 2001-2018 The Apache Software Foundation




================= maven-model-3.1.1.jar =================
Maven Model
Copyright 2001-2013 The Apache Software Foundation




================= maven-model-builder-3.1.1.jar =================
Maven Model Builder
Copyright 2001-2013 The Apache Software Foundation




================= maven-repository-metadata-3.1.1.jar =================
Maven Repository Metadata Model
Copyright 2001-2013 The Apache Software Foundation




================= maven-settings-3.1.1.jar =================
Maven Settings
Copyright 2001-2013 The Apache Software Foundation




================= maven-settings-builder-3.1.1.jar =================
Maven Settings Builder
Copyright 2001-2013 The Apache Software Foundation




================= metrics-core-4.0.0.jar =================
Metrics
Copyright 2010-2013 Coda Hale and Yammer, Inc., 2014-2017 Dropwizard Team

This product includes software developed by Coda Hale and Yammer, Inc.

This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64,
LongAdder), which was released with the following comments:

    Written by Doug Lea with assistance from members of JCP JSR-166
    Expert Group and released to the public domain, as explained at
    http://creativecommons.org/publicdomain/zero/1.0/




================= netty-3.10.6.Final.jar =================
                            The Netty Project
                            =================

Please visit the Netty web site for more information:

  * http://netty.io/

Copyright 2011 The Netty Project

The Netty Project licenses this file to you under the Apache License,
version 2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at:

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

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

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

-------------------------------------------------------------------------------
This product contains the extensions to Java Collections Framework which has
been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  * LICENSE:
    * license/LICENSE.jsr166y.txt (Public Domain)
  * HOMEPAGE:
    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

This product contains a modified version of Robert Harder's Public Domain
Base64 Encoder and Decoder, which can be obtained at:

  * LICENSE:
    * license/LICENSE.base64.txt (Public Domain)
  * HOMEPAGE:
    * http://iharder.sourceforge.net/current/java/base64/

This product contains a modified version of 'JZlib', a re-implementation of
zlib in pure Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jzlib.txt (BSD Style License)
  * HOMEPAGE:
    * http://www.jcraft.com/jzlib/

This product contains a modified version of 'Webbit', a Java event based
WebSocket and HTTP server:

  * LICENSE:
    * license/LICENSE.webbit.txt (BSD License)
  * HOMEPAGE:
    * https://github.com/joewalnes/webbit

This product optionally depends on 'Protocol Buffers', Google's data
interchange format, which can be obtained at:

  * LICENSE:
    * license/LICENSE.protobuf.txt (New BSD License)
  * HOMEPAGE:
    * http://code.google.com/p/protobuf/

This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
a temporary self-signed X.509 certificate when the JVM does not provide the
equivalent functionality.  It can be obtained at:

  * LICENSE:
    * license/LICENSE.bouncycastle.txt (MIT License)
  * HOMEPAGE:
    * http://www.bouncycastle.org/

This product optionally depends on 'SLF4J', a simple logging facade for Java,
which can be obtained at:

  * LICENSE:
    * license/LICENSE.slf4j.txt (MIT License)
  * HOMEPAGE:
    * http://www.slf4j.org/

This product optionally depends on 'Apache Commons Logging', a logging
framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://commons.apache.org/logging/

This product optionally depends on 'Apache Log4J', a logging framework,
which can be obtained at:

  * LICENSE:
    * license/LICENSE.log4j.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://logging.apache.org/log4j/

This product optionally depends on 'JBoss Logging', a logging framework,
which can be obtained at:

  * LICENSE:
    * license/LICENSE.jboss-logging.txt (GNU LGPL 2.1)
  * HOMEPAGE:
    * http://anonsvn.jboss.org/repos/common/common-logging-spi/

This product optionally depends on 'Apache Felix', an open source OSGi
framework implementation, which can be obtained at:

  * LICENSE:
    * license/LICENSE.felix.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://felix.apache.org/




================= Netty 4 =================
netty-all-4.1.30.Final.jar
netty-buffer-4.1.29.Final.jar
netty-codec-4.1.29.Final.jar
netty-codec-dns-4.1.29.Final.jar
netty-codec-http-4.1.29.Final.jar
netty-codec-socks-4.1.29.Final.jar
netty-common-4.1.29.Final.jar
netty-handler-4.1.29.Final.jar
netty-handler-proxy-4.1.29.Final.jar
netty-reactive-streams-2.0.0.jar
netty-resolver-4.1.29.Final.jar
netty-resolver-dns-4.1.29.Final.jar
netty-transport-4.1.29.Final.jar
netty-transport-native-epoll-4.1.29.Final-linux-x86_64.jar
netty-transport-native-unix-common-4.1.29.Final.jar
=================
                            The Netty Project
                            =================

Please visit the Netty web site for more information:

  * http://netty.io/

Copyright 2014 The Netty Project

The Netty Project licenses this file to you under the Apache License,
version 2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at:

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

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

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

-------------------------------------------------------------------------------
This product contains the extensions to Java Collections Framework which has
been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  * LICENSE:
    * license/LICENSE.jsr166y.txt (Public Domain)
  * HOMEPAGE:
    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

This product contains a modified version of Robert Harder's Public Domain
Base64 Encoder and Decoder, which can be obtained at:

  * LICENSE:
    * license/LICENSE.base64.txt (Public Domain)
  * HOMEPAGE:
    * http://iharder.sourceforge.net/current/java/base64/

This product contains a modified portion of 'Webbit', an event based
WebSocket and HTTP server, which can be obtained at:

  * LICENSE:
    * license/LICENSE.webbit.txt (BSD License)
  * HOMEPAGE:
    * https://github.com/joewalnes/webbit

This product contains a modified portion of 'SLF4J', a simple logging
facade for Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.slf4j.txt (MIT License)
  * HOMEPAGE:
    * http://www.slf4j.org/

This product contains a modified portion of 'Apache Harmony', an open source
Java SE, which can be obtained at:

  * NOTICE:
    * license/NOTICE.harmony.txt
  * LICENSE:
    * license/LICENSE.harmony.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://archive.apache.org/dist/harmony/

This product contains a modified portion of 'jbzip2', a Java bzip2 compression
and decompression library written by Matthew J. Francis. It can be obtained at:

  * LICENSE:
    * license/LICENSE.jbzip2.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/jbzip2/

This product contains a modified portion of 'libdivsufsort', a C API library to construct
the suffix array and the Burrows-Wheeler transformed string for any input string of
a constant-size alphabet written by Yuta Mori. It can be obtained at:

  * LICENSE:
    * license/LICENSE.libdivsufsort.txt (MIT License)
  * HOMEPAGE:
    * https://github.com/y-256/libdivsufsort

This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM,
 which can be obtained at:

  * LICENSE:
    * license/LICENSE.jctools.txt (ASL2 License)
  * HOMEPAGE:
    * https://github.com/JCTools/JCTools

This product optionally depends on 'JZlib', a re-implementation of zlib in
pure Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jzlib.txt (BSD style License)
  * HOMEPAGE:
    * http://www.jcraft.com/jzlib/

This product optionally depends on 'Compress-LZF', a Java library for encoding and
decoding data in LZF format, written by Tatu Saloranta. It can be obtained at:

  * LICENSE:
    * license/LICENSE.compress-lzf.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/ning/compress

This product optionally depends on 'lz4', a LZ4 Java compression
and decompression library written by Adrien Grand. It can be obtained at:

  * LICENSE:
    * license/LICENSE.lz4.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/jpountz/lz4-java

This product optionally depends on 'lzma-java', a LZMA Java compression
and decompression library, which can be obtained at:

  * LICENSE:
    * license/LICENSE.lzma-java.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/jponge/lzma-java

This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression
and decompression library written by William Kinney. It can be obtained at:

  * LICENSE:
    * license/LICENSE.jfastlz.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/jfastlz/

This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data
interchange format, which can be obtained at:

  * LICENSE:
    * license/LICENSE.protobuf.txt (New BSD License)
  * HOMEPAGE:
    * https://github.com/google/protobuf

This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
a temporary self-signed X.509 certificate when the JVM does not provide the
equivalent functionality.  It can be obtained at:

  * LICENSE:
    * license/LICENSE.bouncycastle.txt (MIT License)
  * HOMEPAGE:
    * http://www.bouncycastle.org/

This product optionally depends on 'Snappy', a compression library produced
by Google Inc, which can be obtained at:

  * LICENSE:
    * license/LICENSE.snappy.txt (New BSD License)
  * HOMEPAGE:
    * https://github.com/google/snappy

This product optionally depends on 'JBoss Marshalling', an alternative Java
serialization API, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1)
  * HOMEPAGE:
    * http://www.jboss.org/jbossmarshalling

This product optionally depends on 'Caliper', Google's micro-
benchmarking framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.caliper.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/google/caliper

This product optionally depends on 'Apache Commons Logging', a logging
framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://commons.apache.org/logging/

This product optionally depends on 'Apache Log4J', a logging framework, which
can be obtained at:

  * LICENSE:
    * license/LICENSE.log4j.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://logging.apache.org/log4j/

This product optionally depends on 'Aalto XML', an ultra-high performance
non-blocking XML processor, which can be obtained at:

  * LICENSE:
    * license/LICENSE.aalto-xml.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://wiki.fasterxml.com/AaltoHome

This product contains a modified version of 'HPACK', a Java implementation of
the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at:

  * LICENSE:
    * license/LICENSE.hpack.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/twitter/hpack

This product contains a modified portion of 'Apache Commons Lang', a Java library
provides utilities for the java.lang API, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-lang.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://commons.apache.org/proper/commons-lang/


This product contains the Maven wrapper scripts from 'Maven Wrapper', that provides an easy way to ensure a user has everything necessary to run the Maven build.

  * LICENSE:
    * license/LICENSE.mvn-wrapper.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/takari/maven-wrapper




================= objenesis-2.6.jar =================
// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for Objenesis
// ------------------------------------------------------------------

Objenesis
Copyright 2006-2017 Joe Walnes, Henri Tremblay, Leonardo Mesquita




================= plexus-utils-3.0.15.jar =================
This product includes software developed by the Indiana University
  Extreme! Lab (http://www.extreme.indiana.edu/).

This product includes software developed by
ThoughtWorks (http://www.thoughtworks.com).

This product includes software developed by
javolution (http://javolution.org/).

This product includes software developed by
Rome (https://rome.dev.java.net/).




================= sigar-1.6.5.132.jar =================
Copyright (c) 2004-2011 VMware, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

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

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

ADDITIONAL LICENSE INFORMATION:

Hyperic SIGAR includes some third-party open source components
in its distribution. The list below identifies the community or
organization and links to their appropriate license terms.

The Hyperic team would like to thank all the communities
of the projects listed below for their contributions.

----------------------------------------------------------
Components under the Apache License 2.0:
----------------------------------------------------------

The following components are included without modification:

- log4j -
Information: http://logging.apache.org/
License: http://www.apache.org/licenses/LICENSE-2.0

The following components are included with modification:

- cpptasks -
Information: http://ant-contrib.sourceforge.net/
License: http://www.apache.org/licenses/LICENSE-2.0

- (portions of) APR -
Information: http://apr.apache.org/
License: http://www.apache.org/licenses/LICENSE-2.0

----------------------------------------------------------
Components under BSD/MIT Style Licenses:
----------------------------------------------------------

The following components are included with modification:

- solaris get_mib2 -
Information: ftp://vic.cc.purdue.edu/pub/tools/unix/solaris/get_mib2/
License: within src/os/solaris/get_mib2.[ch]

Copyright 1995 Purdue Research Foundation, West Lafayette, Indiana
47907.  All rights reserved.

Written by Victor A. Abell <abe@cc.purdue.edu>

This software is not subject to any license of the American Telephone
and Telegraph Company or the Regents of the University of California.

Permission is granted to anyone to use this software for any purpose on
any computer system, and to alter it and redistribute it freely, subject
to the following restrictions:

1. Neither Victor A  Abell nor Purdue University are responsible for
   any consequences of the use of this software.

2. The origin of this software must not be misrepresented, either by
   explicit claim or by omission.  Credit to Victor A. Abell and Purdue
   University must appear in documentation and sources.

3. Altered versions must be plainly marked as such, and must not be
   misrepresented as being the original software.

4. This notice may not be removed or altered.

- getline by Chris Thewalt -
Information: http://tinyurl.com/r438r
License: within src/sigar_getline.c

Copyright (C) 1991, 1992 by Chris Thewalt (thewalt@ce.berkeley.edu)

Permission to use, copy, modify, and distribute this software
for any purpose and without fee is hereby granted, provided
that the above copyright notices appear in all copies and that both the
copyright notice and this permission notice appear in supporting
documentation.  This software is provided "as is" without express or
implied warranty.

- PrintfFormat.java -
Information: http://java.sun.com/developer/technicalArticles/Programming/sprintf/PrintfFormat.java
License: within bindings/java/src/org/hyperic/sigar/util/PrintfFormat.java

(c) 2000 Sun Microsystems, Inc.
ALL RIGHTS RESERVED

License Grant-

Permission to use, copy, modify, and distribute this Software and its
documentation for NON-COMMERCIAL or COMMERCIAL purposes and without fee is
hereby granted.

This Software is provided "AS IS".  All express warranties, including any
implied warranty of merchantability, satisfactory quality, fitness for a
particular purpose, or non-infringement, are disclaimed, except to the extent
that such disclaimers are held to be legally invalid.

You acknowledge that Software is not designed, licensed or intended for use in
the design, construction, operation or maintenance of any nuclear facility
("High Risk Activities").  Sun disclaims any express or implied warranty of
fitness for such uses.

Please refer to the file http://www.sun.com/policies/trademarks/ for further
important trademark information and to
http://java.sun.com/nav/business/index.html for further important licensing
information for the Java Technology.




================= wagon-provider-api-2.4.jar =================
Apache Maven Wagon :: API
Copyright 2003-2013 The Apache Software Foundation




================= zookeeper-3.4.11.jar =================
Apache ZooKeeper
Copyright 2009-2017 The Apache Software Foundation









############ BINARY/HADOOP-CLIENT ############

================= apacheds-i18n-2.0.0-M15.jar =================
ApacheDS I18n
Copyright 2003-2013 The Apache Software Foundation




================= apacheds-kerberos-codec-2.0.0-M15.jar =================
ApacheDS Protocol Kerberos Codec
Copyright 2003-2013 The Apache Software Foundation




================= api-asn1-api-1.0.0-M20.jar =================
Apache Directory API ASN.1 API
Copyright 2003-2013 The Apache Software Foundation




================= api-util-1.0.0-M20.jar =================
Apache Directory LDAP API Utilities
Copyright 2003-2013 The Apache Software Foundation




================= avro-1.7.4.jar =================
Apache Avro
Copyright 2009-2013 The Apache Software Foundation




================= commons-beanutils-1.7.0.jar =================
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).




================= commons-beanutils-core-1.8.0.jar =================
Apache Commons BeanUtils
Copyright 2000-2008 The Apache Software Foundation




================= commons-codec-1.4.jar =================
Apache Commons Codec
Copyright 2002-2009 The Apache Software Foundation

--------------------------------------------------------------------------------
src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java contains
test data from http://aspell.sourceforge.net/test/batch0.tab.

Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org). Verbatim copying
and distribution of this entire article is permitted in any medium,
provided this notice is preserved.
--------------------------------------------------------------------------------




================= commons-compress-1.4.1.jar =================
Apache Commons Compress
Copyright 2002-2012 The Apache Software Foundation




================= commons-configuration-1.6.jar =================
Apache Commons Configuration
Copyright 2001-2008 The Apache Software Foundation




================= commons-digester-1.8.jar =================
Apache Jakarta Commons Digester
Copyright 2001-2006 The Apache Software Foundation




================= commons-io-2.4.jar =================
Apache Commons IO
Copyright 2002-2012 The Apache Software Foundation




================= commons-logging-1.1.3.jar =================
Apache Commons Logging
Copyright 2003-2013 The Apache Software Foundation




================= commons-math3-3.1.1.jar =================
Apache Commons Math
Copyright 2001-2012 The Apache Software Foundation

===============================================================================

The BracketFinder (package org.apache.commons.math3.optimization.univariate)
and PowellOptimizer (package org.apache.commons.math3.optimization.general)
classes are based on the Python code in module "optimize.py" (version 0.5)
developed by Travis E. Oliphant for the SciPy library (http://www.scipy.org/)
Copyright © 2003-2009 SciPy Developers.
===============================================================================

The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
RelationShip, SimplexSolver and SimplexTableau classes in package
org.apache.commons.math3.optimization.linear include software developed by
Benjamin McCann (http://www.benmccann.com) and distributed with
the following copyright: Copyright 2009 Google Inc.
===============================================================================

This product includes software developed by the
University of Chicago, as Operator of Argonne National
Laboratory.
The LevenbergMarquardtOptimizer class in package
org.apache.commons.math3.optimization.general includes software
translated from the lmder, lmpar and qrsolv Fortran routines
from the Minpack package
Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
===============================================================================

The GraggBulirschStoerIntegrator class in package
org.apache.commons.math3.ode.nonstiff includes software translated
from the odex Fortran routine developed by E. Hairer and G. Wanner.
Original source copyright:
Copyright (c) 2004, Ernst Hairer
===============================================================================

The EigenDecompositionImpl class in package
org.apache.commons.math3.linear includes software translated
from some LAPACK Fortran routines.  Original source copyright:
Copyright (c) 1992-2008 The University of Tennessee.  All rights reserved.
===============================================================================

The MersenneTwister class in package org.apache.commons.math3.random
includes software translated from the 2002-01-26 version of
the Mersenne-Twister generator written in C by Makoto Matsumoto and Takuji
Nishimura. Original source copyright:
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved
===============================================================================

The LocalizedFormatsTest class in the unit tests is an adapted version of
the OrekitMessagesTest class from the orekit library distributed under the
terms of the Apache 2 licence. Original source copyright:
Copyright 2010 CS Systèmes d'Information
===============================================================================

The HermiteInterpolator class and its corresponding test have been imported from
the orekit library distributed under the terms of the Apache 2 licence. Original
source copyright:
Copyright 2010-2012 CS Systèmes d'Information
===============================================================================

The creation of the package "o.a.c.m.analysis.integration.gauss" was inspired
by an original code donated by Sébastien Brisard.
===============================================================================


The complete text of licenses and disclaimers associated with the the original
sources enumerated above at the time of code translation are in the LICENSE.txt
file.




================= commons-net-3.1.jar =================
Apache Commons Net
Copyright 2001-2012 The Apache Software Foundation




================= curator-client-2.7.1.jar =================
Curator Client
Copyright 2011-2015 The Apache Software Foundation




================= curator-framework-2.7.1.jar =================
Curator Framework
Copyright 2011-2015 The Apache Software Foundation




================= curator-recipes-2.7.1.jar =================
Curator Recipes
Copyright 2011-2015 The Apache Software Foundation




================= Hadoop 2.8.3 =================
hadoop-annotations-2.8.3.jar
hadoop-auth-2.8.3.jar
hadoop-client-2.8.3.jar
hadoop-common-2.8.3.jar
hadoop-hdfs-client-2.8.3.jar
hadoop-mapreduce-client-app-2.8.3.jar
hadoop-mapreduce-client-common-2.8.3.jar
hadoop-mapreduce-client-core-2.8.3.jar
hadoop-mapreduce-client-jobclient-2.8.3.jar
hadoop-mapreduce-client-shuffle-2.8.3.jar
hadoop-yarn-api-2.8.3.jar
hadoop-yarn-client-2.8.3.jar
hadoop-yarn-common-2.8.3.jar
hadoop-yarn-server-common-2.8.3.jar
=================
The binary distribution of this product bundles binaries of
org.iq80.leveldb:leveldb-api (https://github.com/dain/leveldb), which has the
following notices:
* Copyright 2011 Dain Sundstrom <dain@iq80.com>
* Copyright 2011 FuseSource Corp. http://fusesource.com

The binary distribution of this product bundles binaries of
org.fusesource.hawtjni:hawtjni-runtime (https://github.com/fusesource/hawtjni),
which has the following notices:
* This product includes software developed by FuseSource Corp.
  http://fusesource.com
* This product includes software developed at
  Progress Software Corporation and/or its  subsidiaries or affiliates.
* This product includes software developed by IBM Corporation and others.

The binary distribution of this product bundles binaries of
AWS Java SDK 1.10.6,
which has the following notices:
 * This software includes third party software subject to the following
 copyrights: - XML parsing and utility functions from JetS3t - Copyright
 2006-2009 James Murty. - JSON parsing and utility functions from JSON.org -
 Copyright 2002 JSON.org. - PKCS#1 PEM encoded private key parsing and utility
 functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.

The binary distribution of this product bundles binaries of
Gson 2.2.4,
which has the following notices:

                            The Netty Project
                            =================

Please visit the Netty web site for more information:

  * http://netty.io/

Copyright 2014 The Netty Project

The Netty Project licenses this file to you under the Apache License,
version 2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at:

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

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

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

-------------------------------------------------------------------------------
This product contains the extensions to Java Collections Framework which has
been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  * LICENSE:
    * license/LICENSE.jsr166y.txt (Public Domain)
  * HOMEPAGE:
    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

This product contains a modified version of Robert Harder's Public Domain
Base64 Encoder and Decoder, which can be obtained at:

  * LICENSE:
    * license/LICENSE.base64.txt (Public Domain)
  * HOMEPAGE:
    * http://iharder.sourceforge.net/current/java/base64/

This product contains a modified portion of 'Webbit', an event based
WebSocket and HTTP server, which can be obtained at:

  * LICENSE:
    * license/LICENSE.webbit.txt (BSD License)
  * HOMEPAGE:
    * https://github.com/joewalnes/webbit

This product contains a modified portion of 'SLF4J', a simple logging
facade for Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.slf4j.txt (MIT License)
  * HOMEPAGE:
    * http://www.slf4j.org/

This product contains a modified portion of 'ArrayDeque', written by Josh
Bloch of Google, Inc:

  * LICENSE:
    * license/LICENSE.deque.txt (Public Domain)

This product contains a modified portion of 'Apache Harmony', an open source
Java SE, which can be obtained at:

  * LICENSE:
    * license/LICENSE.harmony.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://archive.apache.org/dist/harmony/

This product contains a modified version of Roland Kuhn's ASL2
AbstractNodeQueue, which is based on Dmitriy Vyukov's non-intrusive MPSC queue.
It can be obtained at:

  * LICENSE:
    * license/LICENSE.abstractnodequeue.txt (Public Domain)
  * HOMEPAGE:
    * https://github.com/akka/akka/blob/wip-2.2.3-for-scala-2.11/akka-actor/src/main/java/akka/dispatch/AbstractNodeQueue.java

This product contains a modified portion of 'jbzip2', a Java bzip2 compression
and decompression library written by Matthew J. Francis. It can be obtained at:

  * LICENSE:
    * license/LICENSE.jbzip2.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/jbzip2/

This product contains a modified portion of 'libdivsufsort', a C API library to construct
the suffix array and the Burrows-Wheeler transformed string for any input string of
a constant-size alphabet written by Yuta Mori. It can be obtained at:

  * LICENSE:
    * license/LICENSE.libdivsufsort.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/libdivsufsort/

This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM,
 which can be obtained at:

  * LICENSE:
    * license/LICENSE.jctools.txt (ASL2 License)
  * HOMEPAGE:
    * https://github.com/JCTools/JCTools

This product optionally depends on 'JZlib', a re-implementation of zlib in
pure Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jzlib.txt (BSD style License)
  * HOMEPAGE:
    * http://www.jcraft.com/jzlib/

This product optionally depends on 'Compress-LZF', a Java library for encoding and
decoding data in LZF format, written by Tatu Saloranta. It can be obtained at:

  * LICENSE:
    * license/LICENSE.compress-lzf.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/ning/compress

This product optionally depends on 'lz4', a LZ4 Java compression
and decompression library written by Adrien Grand. It can be obtained at:

  * LICENSE:
    * license/LICENSE.lz4.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/jpountz/lz4-java

This product optionally depends on 'lzma-java', a LZMA Java compression
and decompression library, which can be obtained at:

  * LICENSE:
    * license/LICENSE.lzma-java.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/jponge/lzma-java

This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression
and decompression library written by William Kinney. It can be obtained at:

  * LICENSE:
    * license/LICENSE.jfastlz.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/jfastlz/

This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data
interchange format, which can be obtained at:

  * LICENSE:
    * license/LICENSE.protobuf.txt (New BSD License)
  * HOMEPAGE:
    * http://code.google.com/p/protobuf/

This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
a temporary self-signed X.509 certificate when the JVM does not provide the
equivalent functionality.  It can be obtained at:

  * LICENSE:
    * license/LICENSE.bouncycastle.txt (MIT License)
  * HOMEPAGE:
    * http://www.bouncycastle.org/

This product optionally depends on 'Snappy', a compression library produced
by Google Inc, which can be obtained at:

  * LICENSE:
    * license/LICENSE.snappy.txt (New BSD License)
  * HOMEPAGE:
    * http://code.google.com/p/snappy/

This product optionally depends on 'JBoss Marshalling', an alternative Java
serialization API, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1)
  * HOMEPAGE:
    * http://www.jboss.org/jbossmarshalling

This product optionally depends on 'Caliper', Google's micro-
benchmarking framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.caliper.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://code.google.com/p/caliper/

This product optionally depends on 'Apache Commons Logging', a logging
framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://commons.apache.org/logging/

This product optionally depends on 'Apache Log4J', a logging framework, which
can be obtained at:

  * LICENSE:
    * license/LICENSE.log4j.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://logging.apache.org/log4j/

This product optionally depends on 'Aalto XML', an ultra-high performance
non-blocking XML processor, which can be obtained at:

  * LICENSE:
    * license/LICENSE.aalto-xml.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://wiki.fasterxml.com/AaltoHome

This product contains a modified version of 'HPACK', a Java implementation of
the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at:

  * LICENSE:
    * license/LICENSE.hpack.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/twitter/hpack

This product contains a modified portion of 'Apache Commons Lang', a Java library
provides utilities for the java.lang API, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-lang.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://commons.apache.org/proper/commons-lang/

The binary distribution of this product bundles binaries of
Commons Codec 1.4,
which has the following notices:
 * src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.javacontains test data from http://aspell.net/test/orig/batch0.tab.Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)
  ===============================================================================
  The content of package org.apache.commons.codec.language.bm has been translated
  from the original php source code available at http://stevemorse.org/phoneticinfo.htm
  with permission from the original authors.
  Original source copyright:Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

The binary distribution of this product bundles binaries of
Commons Lang 2.6,
which has the following notices:
 * This product includes software from the Spring Framework,under the Apache License 2.0 (see: StringUtils.containsWhitespace())

The binary distribution of this product bundles binaries of
Apache Log4j 1.2.17,
which has the following notices:
 * ResolverUtil.java
    Copyright 2005-2006 Tim Fennell
  Dumbster SMTP test server
    Copyright 2004 Jason Paul Kitchen
  TypeUtil.java
    Copyright 2002-2012 Ramnivas Laddad, Juergen Hoeller, Chris Beams

The binary distribution of this product bundles binaries of
Java Concurrency in Practice book annotations 1.0,
which has the following notices:
 * Copyright (c) 2005 Brian Goetz and Tim Peierls Released under the Creative
  Commons Attribution License (http://creativecommons.org/licenses/by/2.5)
  Official home: http://www.jcip.net Any republication or derived work
  distributed in source code form must include this copyright and license
  notice.

The binary distribution of this product bundles binaries of
Jetty 6.1.26,
which has the following notices:
 * ==============================================================
    Jetty Web Container
    Copyright 1995-2016 Mort Bay Consulting Pty Ltd.
   ==============================================================

   The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
   unless otherwise noted.

   Jetty is dual licensed under both

     * The Apache 2.0 License
       http://www.apache.org/licenses/LICENSE-2.0.html

         and

     * The Eclipse Public 1.0 License
       http://www.eclipse.org/legal/epl-v10.html

   Jetty may be distributed under either license.

   ------
   Eclipse

   The following artifacts are EPL.
    * org.eclipse.jetty.orbit:org.eclipse.jdt.core

   The following artifacts are EPL and ASL2.
    * org.eclipse.jetty.orbit:javax.security.auth.message


   The following artifacts are EPL and CDDL 1.0.
    * org.eclipse.jetty.orbit:javax.mail.glassfish


   ------
   Oracle

   The following artifacts are CDDL + GPLv2 with classpath exception.
   https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

    * javax.servlet:javax.servlet-api
    * javax.annotation:javax.annotation-api
    * javax.transaction:javax.transaction-api
    * javax.websocket:javax.websocket-api

   ------
   Oracle OpenJDK

   If ALPN is used to negotiate HTTP/2 connections, then the following
   artifacts may be included in the distribution or downloaded when ALPN
   module is selected.

    * java.sun.security.ssl

   These artifacts replace/modify OpenJDK classes.  The modififications
   are hosted at github and both modified and original are under GPL v2 with
   classpath exceptions.
   http://openjdk.java.net/legal/gplv2+ce.html


   ------
   OW2

   The following artifacts are licensed by the OW2 Foundation according to the
   terms of http://asm.ow2.org/license.html

   org.ow2.asm:asm-commons
   org.ow2.asm:asm


   ------
   Apache

   The following artifacts are ASL2 licensed.

   org.apache.taglibs:taglibs-standard-spec
   org.apache.taglibs:taglibs-standard-impl


   ------
   MortBay

   The following artifacts are ASL2 licensed.  Based on selected classes from
   following Apache Tomcat jars, all ASL2 licensed.

   org.mortbay.jasper:apache-jsp
     org.apache.tomcat:tomcat-jasper
     org.apache.tomcat:tomcat-juli
     org.apache.tomcat:tomcat-jsp-api
     org.apache.tomcat:tomcat-el-api
     org.apache.tomcat:tomcat-jasper-el
     org.apache.tomcat:tomcat-api
     org.apache.tomcat:tomcat-util-scan
     org.apache.tomcat:tomcat-util

   org.mortbay.jasper:apache-el
     org.apache.tomcat:tomcat-jasper-el
     org.apache.tomcat:tomcat-el-api


   ------
   Mortbay

   The following artifacts are CDDL + GPLv2 with classpath exception.

   https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

   org.eclipse.jetty.toolchain:jetty-schemas

   ------
   Assorted

   The UnixCrypt.java code implements the one way cryptography used by
   Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
   modified April 2001  by Iris Van den Broeke, Daniel Deville.
   Permission to use, copy, modify and distribute UnixCrypt
   for non-commercial or commercial purposes and without fee is
   granted provided that the copyright notice appears in all copies./

The binary distribution of this product bundles binaries of
Snappy for Java 1.0.4.1,
which has the following notices:
 * This product includes software developed by Google
    Snappy: http://code.google.com/p/snappy/ (New BSD License)

   This product includes software developed by Apache
    PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
    (Apache 2.0 license)

   This library containd statically linked libstdc++. This inclusion is allowed by
   "GCC RUntime Library Exception"
   http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

   == Contributors ==
     * Tatu Saloranta
       * Providing benchmark suite
     * Alec Wysoker
       * Performance and memory usage improvement

The binary distribution of this product bundles binaries of
Xerces2 Java Parser 2.9.1,
which has the following notices:
 * =========================================================================
   ==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
   ==  Version 2.0, in this case for the Apache Xerces Java distribution. ==
   =========================================================================

   Apache Xerces Java
   Copyright 1999-2007 The Apache Software Foundation

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

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




================= htrace-core4-4.0.1-incubating.jar =================
htrace-core4
Copyright 2015 The Apache Software Foundation




================= httpclient-4.5.2.jar =================
Apache HttpClient
Copyright 1999-2016 The Apache Software Foundation




================= Jackson 1.9.13 =================
jackson-jaxrs-1.9.13.jar
jackson-xc-1.9.13.jar
=================
This product currently only contains code developed by authors
of specific components, as identified by the source code files;
if such notes are missing files have been created by
Tatu Saloranta.

For additional credits (generally to people who reported problems)
see CREDITS file.




================= Jetty 6.1.26 =================
jetty-sslengine-6.1.26.jar
jetty-util-6.1.26.jar
=================
==============================================================
 Jetty Web Container
 Copyright 1995-2009 Mort Bay Consulting Pty Ltd
==============================================================

The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
unless otherwise noted. It is dual licensed under the apache 2.0
license and eclipse 1.0 license. Jetty may be distributed under
either license.

The javax.servlet package used was sourced from the Apache
Software Foundation and is distributed under the apache 2.0
license.

The UnixCrypt.java code implements the one way cryptography used by
Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
modified April 2001  by Iris Van den Broeke, Daniel Deville.
Permission to use, copy, modify and distribute UnixCrypt
for non-commercial or commercial purposes and without fee is
granted provided that the copyright notice appears in all copies.




================= log4j-1.2.17.jar =================
Apache log4j
Copyright 2007 The Apache Software Foundation




================= netty-3.6.2.Final.jar =================
                            The Netty Project
                            =================

Please visit the Netty web site for more information:

  * http://netty.io/

Copyright 2011 The Netty Project

The Netty Project licenses this file to you under the Apache License,
version 2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at:

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

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

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

-------------------------------------------------------------------------------
This product contains the extensions to Java Collections Framework which has
been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  * LICENSE:
    * license/LICENSE.jsr166y.txt (Public Domain)
  * HOMEPAGE:
    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

This product contains a modified version of Robert Harder's Public Domain
Base64 Encoder and Decoder, which can be obtained at:

  * LICENSE:
    * license/LICENSE.base64.txt (Public Domain)
  * HOMEPAGE:
    * http://iharder.sourceforge.net/current/java/base64/

This product contains a modified version of 'JZlib', a re-implementation of
zlib in pure Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jzlib.txt (BSD Style License)
  * HOMEPAGE:
    * http://www.jcraft.com/jzlib/

This product optionally depends on 'Protocol Buffers', Google's data
interchange format, which can be obtained at:

  * LICENSE:
    * license/LICENSE.protobuf.txt (New BSD License)
  * HOMEPAGE:
    * http://code.google.com/p/protobuf/

This product optionally depends on 'SLF4J', a simple logging facade for Java,
which can be obtained at:

  * LICENSE:
    * license/LICENSE.slf4j.txt (MIT License)
  * HOMEPAGE:
    * http://www.slf4j.org/

This product optionally depends on 'Apache Commons Logging', a logging
framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://commons.apache.org/logging/

This product optionally depends on 'Apache Log4J', a logging framework,
which can be obtained at:

  * LICENSE:
    * license/LICENSE.log4j.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://logging.apache.org/log4j/

This product optionally depends on 'JBoss Logging', a logging framework,
which can be obtained at:

  * LICENSE:
    * license/LICENSE.jboss-logging.txt (GNU LGPL 2.1)
  * HOMEPAGE:
    * http://anonsvn.jboss.org/repos/common/common-logging-spi/

This product optionally depends on 'Apache Felix', an open source OSGi
framework implementation, which can be obtained at:

  * LICENSE:
    * license/LICENSE.felix.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://felix.apache.org/

This product optionally depends on 'Webbit', a Java event based
WebSocket and HTTP server:

  * LICENSE:
    * license/LICENSE.webbit.txt (BSD License)
  * HOMEPAGE:
    * https://github.com/joewalnes/webbit




================= snappy-1.0.4.1.jar =================
This product includes software developed by Google
 Snappy: http://code.google.com/p/snappy/ (New BSD License)


This library containd statically linked libstdc++. This inclusion is allowed by
"GCC RUntime Library Exception"
http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

== Contributors ==
  * Tatu Saloranta
    * Providing benchmark suite
  * Alec Wysoker
    * Performance and memory usage improvement





================= zookeeper-3.4.6.jar =================
Apache ZooKeeper
Copyright 2009-2012 The Apache Software Foundation







############ BINARY/EXTENSIONS/druid-avro-extensions ############

================= avro-1.8.2.jar =================
Apache Avro
Copyright 2009-2017 The Apache Software Foundation




================= avro-ipc-1.8.2.jar =================
Apache Avro IPC
Copyright 2009-2017 The Apache Software Foundation




================= avro-mapred-1.8.2-hadoop2.jar =================
Apache Avro
Copyright 2010 The Apache Software Foundation

Based upon the representations of upstream licensors, it is understood that
portions of the mapreduce API included in the Java implementation are licensed
from various contributors under one or more contributor license agreements to
Odiago, Inc. and were then contributed by Odiago to Apache Avro, which has now
made them available under the Apache 2.0 license. The original file header text
is:

| Licensed to Odiago, Inc. under one or more contributor license
| agreements.  See the NOTICE file distributed with this work for
| additional information regarding copyright ownership.  Odiago, Inc.
| licenses this file to you under the Apache License, Version 2.0
| (the "License"); you may not use this file except in compliance
| with the License.  You may obtain a copy of the License at
|
|     http://www.apache.org/licenses/LICENSE-2.0
|
| Unless required by applicable law or agreed to in writing, software
| distributed under the License is distributed on an "AS IS" BASIS,
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
| implied.  See the License for the specific language governing
| permissions and limitations under the License.

The Odiago NOTICE at the time of the contribution:

| This product includes software developed by Odiago, Inc.
| (http://www.wibidata.com).




================= commons-collections-3.2.1.jar =================
Apache Commons Collections
Copyright 2001-2008 The Apache Software Foundation




================= snappy-1.1.1.3.jar =================
This product includes software developed by Google
 Snappy: http://code.google.com/p/snappy/ (New BSD License)

This product includes software developed by Apache
 PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
 (Apache 2.0 license)

This library containd statically linked libstdc++. This inclusion is allowed by
"GCC RUntime Library Exception"
http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

== Contributors ==
  * Tatu Saloranta
    * Providing benchmark suite
  * Alec Wysoker
    * Performance and memory usage improvement




================= velocity-1.7.jar =================
Apache Velocity

Copyright (C) 2000-2007 The Apache Software Foundation




############ BINARY/EXTENSIONS/druid-bloom-filter ############

================= hive-storage-api-2.7.0.jar =================
Hive Storage API
Copyright 2018 The Apache Software Foundation




############ BINARY/EXTENSIONS/druid-examples ############

================= commons-beanutils-1.8.3.jar =================
Apache Commons BeanUtils
Copyright 2000-2010 The Apache Software Foundation




================= commons-validator-1.4.0.jar =================
Apache Commons Validator
Copyright 2001-2012 The Apache Software Foundation




############ BINARY/EXTENSIONS/druid-kafka-eight ############

================= kafka-clients-0.8.2.1.jar =================
Apache Kafka
Copyright 2012 The Apache Software Foundation.




================= kafka_2.10-0.8.2.1.jar =================
Apache Kafka
Copyright 2012 The Apache Software Foundation.




================= metrics-core-2.2.0.jar =================
Metrics
Copyright 2010-2012 Coda Hale and Yammer, Inc.

This product includes software developed by Coda Hale and Yammer, Inc.

This product includes code derived from the JSR-166 project (ThreadLocalRandom), which was released
with the following comments:

    Written by Doug Lea with assistance from members of JCP JSR-166
    Expert Group and released to the public domain, as explained at
    http://creativecommons.org/publicdomain/zero/1.0/




================= snappy-1.1.1.6.jar =================
This product includes software developed by Google
 Snappy: http://code.google.com/p/snappy/ (New BSD License)

This product includes software developed by Apache
 PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
 (Apache 2.0 license)

This library containd statically linked libstdc++. This inclusion is allowed by
"GCC RUntime Library Exception"
http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

== Contributors ==
  * Tatu Saloranta
    * Providing benchmark suite
  * Alec Wysoker
    * Performance and memory usage improvement




############ BINARY/EXTENSIONS/druid-kafka-indexing-service ############

================= kafka-clients-0.10.2.2.jar =================
Apache Kafka
Copyright 2018 The Apache Software Foundation.

This distribution has a binary dependency on jersey, which is available under the CDDL
License. The source code of jersey can be found at https://github.com/jersey/jersey/.




================= Jackson 1.9.2 =================
jackson-jaxrs-1.9.2.jar
jackson-xc-1.9.2.jar
=================
This product currently only contains code developed by authors
of specific components, as identified by the source code files;
if such notes are missing files have been created by
Tatu Saloranta.

For additional credits (generally to people who reported problems)
see CREDITS file.




================= snappy-1.1.2.6.jar =================
This product includes software developed by Google
 Snappy: http://code.google.com/p/snappy/ (New BSD License)

This product includes software developed by Apache
 PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
 (Apache 2.0 license)

This library containd statically linked libstdc++. This inclusion is allowed by
"GCC RUntime Library Exception"
http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

== Contributors ==
  * Tatu Saloranta
    * Providing benchmark suite
  * Alec Wysoker
    * Performance and memory usage improvement




############ BINARY/EXTENSIONS/druid-kerberos ############

================= jets3t-0.9.0.jar =================
  =========================================================================
   ==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
   ==  Version 2.0, in this case for the distribution of jets3t.          ==
   =========================================================================

   This product includes software developed by:

   The Apache Software Foundation (http://www.apache.org/).

   The ExoLab Project (http://www.exolab.org/)

   Sun Microsystems (http://www.sun.com/)

   Codehaus (http://castor.codehaus.org)

   Safehaus (http://jug.safehaus.org/Home)

   Tatu Saloranta (http://wiki.fasterxml.com/TatuSaloranta)




############ BINARY/EXTENSIONS/druid-parquet ############

================= parquet-avro-1.10.0.jar =================
Apache Parquet MR (Incubating)
Copyright 2014-2015 The Apache Software Foundation

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

This product includes code from Apache Avro, which includes the following in
its NOTICE file:

  Apache Avro
  Copyright 2010-2015 The Apache Software Foundation

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




================= parquet-format-2.4.0.jar =================
Apache Parquet Format
Copyright 2017 The Apache Software Foundation




================= parquet-jackson-1.10.0.jar =================
This product currently only contains code developed by authors
of specific components, as identified by the source code files;
if such notes are missing files have been created by
Tatu Saloranta.

For additional credits (generally to people who reported problems)
see CREDITS file.




================= snappy-1.1.7.2.jar =================
This product includes software developed by Google
 Snappy: http://code.google.com/p/snappy/ (New BSD License)

This product includes software developed by Apache
 PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
 (Apache 2.0 license)

This library containd statically linked libstdc++. This inclusion is allowed by
"GCC RUntime Library Exception"
http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

== Contributors ==
  * Tatu Saloranta
    * Providing benchmark suite
  * Alec Wysoker
    * Performance and memory usage improvement
