Apache Druid
Copyright 2018-2021 The Apache Software Foundation

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


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

================= Apache Calcite 1.10.0 =================
Apache Calcite
Copyright 2012-2016 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 Flink 1.8.1 =================
Apache Flink
Copyright 2014-2019 The Apache Software Foundation




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




================= Apache Hive 2.0.0 =================
Apache Hive
Copyright 2008-2015 The Apache Software Foundation




================= Apache Hive 2.0.1 =================
Apache Hive
Copyright 2008-2016 The Apache Software Foundation




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




================= Apache Kafka 2.7.0 =================
Apache Kafka
Copyright 2020 The Apache Software Foundation.




================= Apache Lucene 6.2.0 =================
Apache Lucene
Copyright 2014 The Apache Software Foundation




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




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




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

================= Apache Commons DBCP2 2.0.1 =================

Apache Commons DBCP
Copyright 2001-2020 The Apache Software Foundation

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

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

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.




================= Apache Spark 2.4.7 =================

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.

