Apache Spark
Copyright 2014 and onwards The Apache Software Foundation.

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


Export Control Notice
---------------------

This distribution includes cryptographic software. The country in which you currently reside may have
restrictions on the import, possession, use, and/or re-export to another country, of encryption software.
BEFORE using any encryption software, please check your country's laws, regulations and policies concerning
the import, possession, or use, and re-export of encryption software, to see if this is permitted. See
<http://www.wassenaar.org/> for more information.

The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this
software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software
using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache
Software Foundation distribution makes it eligible for export under the License Exception ENC Technology
Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for
both object code and source code.

The following provides more details on the included cryptographic software:

This software uses Apache Commons Crypto (https://commons.apache.org/proper/commons-crypto/) to
support authentication, and encryption and decryption of data sent across the network between
services.


// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for
// ------------------------------------------------------------------

Hive Beeline
Copyright 2016 The Apache Software Foundation

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

Apache Avro
Copyright 2009-2014 The Apache Software Foundation

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.

Apache Commons Compress
Copyright 2002-2012 The Apache Software Foundation

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

Apache Avro Mapred API
Copyright 2009-2014 The Apache Software Foundation

Apache Avro IPC
Copyright 2009-2014 The Apache Software Foundation

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

Apache XBean :: ASM 5 shaded (repackaged)
Copyright 2005-2015 The Apache Software Foundation

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

This product includes software developed at
OW2 Consortium (http://asm.ow2.org/)

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

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
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
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 contains 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.

Apache Commons Collections
Copyright 2001-2015 The Apache Software Foundation

Apache Commons Configuration
Copyright 2001-2008 The Apache Software Foundation

Apache Jakarta Commons Digester
Copyright 2001-2006 The Apache Software Foundation

Apache Commons BeanUtils
Copyright 2000-2008 The Apache Software Foundation

ApacheDS Protocol Kerberos Codec
Copyright 2003-2013 The Apache Software Foundation

ApacheDS I18n
Copyright 2003-2013 The Apache Software Foundation

Apache Directory API ASN.1 API
Copyright 2003-2013 The Apache Software Foundation

Apache Directory LDAP API Utilities
Copyright 2003-2013 The Apache Software Foundation

Curator Client
Copyright 2011-2015 The Apache Software Foundation

htrace-core
Copyright 2015 The Apache Software Foundation

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

   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.

# 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.

Apache HttpCore
Copyright 2005-2017 The Apache Software Foundation

Curator Recipes
Copyright 2011-2015 The Apache Software Foundation

Curator Framework
Copyright 2011-2015 The Apache Software Foundation

Apache Commons Lang
Copyright 2001-2016 The Apache Software Foundation

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

Apache Commons Math
Copyright 2001-2015 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

Apache log4j
Copyright 2007 The Apache Software Foundation

# 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.

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.

Apache Commons Net
Copyright 2001-2012 The Apache Software Foundation

Copyright 2011 The Netty Project

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

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:

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

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

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

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/

Jackson core and extension components may be 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).

Apache Ivy (TM)
Copyright 2007-2014 The Apache Software Foundation

Portions of Ivy were originally developed at
Jayasoft SARL (http://www.jayasoft.fr/)
and are licensed to the Apache Software Foundation under the
"Software Grant License Agreement"

SSH and SFTP support is provided by the JCraft JSch package,
which is open source software, available under
the terms of a BSD style license.
The original software and related information is available
at http://www.jcraft.com/jsch/.


ORC Core
Copyright 2013-2018 The Apache Software Foundation

Apache Commons Lang
Copyright 2001-2011 The Apache Software Foundation

ORC MapReduce
Copyright 2013-2018 The Apache Software Foundation

Apache Parquet Format
Copyright 2017 The Apache Software Foundation

Arrow Vectors
Copyright 2017 The Apache Software Foundation

Arrow Format
Copyright 2017 The Apache Software Foundation

Arrow Memory
Copyright 2017 The Apache Software Foundation

Apache Commons CLI
Copyright 2001-2009 The Apache Software Foundation

Google Guice - Extensions - Servlet
Copyright 2006-2011 Google, Inc.

Apache Commons IO
Copyright 2002-2012 The Apache Software Foundation

Google Guice - Core Library
Copyright 2006-2011 Google, Inc.

mesos
Copyright 2017 The Apache Software Foundation

Apache Parquet Hadoop Bundle (Incubating)
Copyright 2015 The Apache Software Foundation

Hive Query Language
Copyright 2016 The Apache Software Foundation

Apache Extras Companion for log4j 1.2.
Copyright 2007 The Apache Software Foundation

Hive Metastore
Copyright 2016 The Apache Software Foundation

Apache Commons Logging
Copyright 2003-2013 The Apache Software Foundation

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

===================================================================
This product includes software developed by many individuals,
including the following:
===================================================================
Erik Bengtson
Andy Jefferson

===================================================================
This product has included contributions from some individuals,
including the following:
===================================================================

===================================================================
This product includes software developed by many individuals,
including the following:
===================================================================
Andy Jefferson
Erik Bengtson
Joerg von Frantzius
Marco Schulze

===================================================================
This product has included contributions from some individuals,
including the following:
===================================================================
Barry Haddow
Ralph Ullrich
David Ezzio
Brendan de Beer
David Eaves
Martin Taal
Tony Lai
Roland Szabo
Anton Troshin (Timesten)

===================================================================
This product also includes software developed by the TJDO project
(http://tjdo.sourceforge.net/).
===================================================================

===================================================================
This product also includes software developed by the Apache Commons project
(http://commons.apache.org/).
===================================================================

Apache Commons Pool
Copyright 1999-2009 The Apache Software Foundation

Apache Commons DBCP
Copyright 2001-2010 The Apache Software Foundation

Apache Java Data Objects (JDO)
Copyright 2005-2006 The Apache Software Foundation

Apache Jakarta HttpClient
Copyright 1999-2007 The Apache Software Foundation

Calcite Avatica
Copyright 2012-2015 The Apache Software Foundation

Calcite Core
Copyright 2012-2015 The Apache Software Foundation

Calcite Linq4j
Copyright 2012-2015 The Apache Software Foundation

Apache HttpClient
Copyright 1999-2017 The Apache Software Foundation

Apache Commons Codec
Copyright 2002-2014 The Apache Software Foundation

src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
contains 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.

=============================================================================
= 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/).

===================================================================
This product has included contributions from some individuals,
including the following:
===================================================================
Joerg von Frantzius
Thomas Marti
Barry Haddow
Marco Schulze
Ralph Ullrich
David Ezzio
Brendan de Beer
David Eaves
Martin Taal
Tony Lai
Roland Szabo
Marcus Mennemeier
Xuan Baldauf
Eric Sultan

Apache Thrift
Copyright 2006-2010 The Apache Software Foundation.

=========================================================================
==  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-2015 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

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.

The Derby build relies on a jar file supplied by the JSON Simple
project, hosted at https://code.google.com/p/json-simple/.
The JSON simple jar file is licensed under the Apache 2.0 License.

Hive CLI
Copyright 2016 The Apache Software Foundation

Hive JDBC
Copyright 2016 The Apache Software Foundation


Chill is a set of Scala extensions for Kryo.
Copyright 2012 Twitter, Inc.

Third Party Dependencies:

Kryo 2.17
BSD 3-Clause License
http://code.google.com/p/kryo

Commons-Codec 1.7
Apache Public License 2.0
http://hadoop.apache.org



Breeze is distributed under an Apache License V2.0 (See LICENSE)

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

Proximal algorithms outlined in Proximal.scala (package breeze.optimize.proximal)
are based on https://github.com/cvxgrp/proximal (see LICENSE for details) and distributed with
Copyright (c) 2014 by Debasish Das (Verizon), all rights reserved.

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

QuadraticMinimizer class in package breeze.optimize.proximal is distributed with Copyright (c)
2014, Debasish Das (Verizon), all rights reserved.

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

NonlinearMinimizer class in package breeze.optimize.proximal is distributed with Copyright (c)
2015, Debasish Das (Verizon), all rights reserved.


stream-lib
Copyright 2016 AddThis

This product includes software developed by AddThis.

This product also includes code adapted from:

Apache Solr (http://lucene.apache.org/solr/)
Copyright 2014 The Apache Software Foundation

Apache Mahout (http://mahout.apache.org/)
Copyright 2014 The Apache Software Foundation
