Apache NiFi
Copyright 2014-2021 The Apache Software Foundation

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

This product includes the following work from the Apache Hadoop project under Apache Software License V2:
  BoundedByteArrayOutputStream.java adapted to SoftLimitBoundedByteArrayOutputStream.java

This product includes derived works from Apache Commons Lang (ASLv2 licensed)
  Copyright 2019 The Apache Software Foundation
  The derived work is adapted from the class StringUtils:
    https://github.com/apache/commons-lang/blob/465e6becd8beda9569fbdc9ff44fac7dc3c5d1c6/src/main/java/org/apache/commons/lang3/StringUtils.java

This product includes derived works from the Apache Software License V2 library python-evtx (https://github.com/williballenthin/python-evtx)
  Copyright 2012, 2013 Willi Ballenthin william.ballenthin@mandiant.com
  while at Mandiant http://www.mandiant.com
  The derived work is adapted from Evtx/Evtx.py, Evtx/BinaryParser.py, Evtx/Nodes.py, Evtx/Views.py
  and can be found in the org.apache.nifi.processors.evtx.parser package.

This includes derived works from the Apache Storm (ASLv2 licensed) project (https://github.com/apache/storm):
  Copyright 2015 The Apache Software Foundation
  The derived work is adapted from
    org/apache/storm/hive/common/HiveWriter.java
    org/apache/storm/hive/common/HiveOptions.java
  and can be found in the org.apache.nifi.util.hive package

This includes derived works from the Apache Hadoop (ASLv2 licensed) project (https://github.com/apache/hadoop):
  Copyright 2014 The Apache Software Foundation
  The derived work is adapted from
    org/apache/hadoop/security/authentication/client/KerberosAuthenticator.java
  and can be found in the org.apache.nifi.hadoop package

This includes derived works from the Apache Hive (ASLv2 licensed) project (https://github.com/apache/hive):
  Copyright 2008-2016 The Apache Software Foundation
  The derived work is adapted from
    release-1.2.1/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java
  and can be found in the org.apache.hadoop.hive.ql.io.orc package
  The derived work is adapted from
    release-3.0.0/serde/src/java/org/apache/hadoop/hive/serde2/JsonSerDe.java
  and can be found in the org.apache.hive.streaming.NiFiRecordSerDe class

This includes derived works from the Apache Software License V2 library Jolt (https://github.com/bazaarvoice/jolt)
  Copyright 2013-2014 Bazaarvoice, Inc
  The derived work is adapted from com.bazaarvoice.jolt.chainr.ChainrBuilder.java, com.bazaarvoice.jolt.chainr.spec.ChainrSpec.java,
  com.bazaarvoice.jolt.chainr.spec.ChainrEntry.java and can be found in the org.apache.nifi.processors.standard.util.jolt.TransformFactory.java class.

This includes derived works from Elastic Logstash (https://github.com/elastic/logstash/tree/v1.4.0/) and modified by Anthony Corbacho, and contributors
  available under an Apache Software License V2.
  Copyright 2009-2013 Jordan Sissel, Pete Fritchman, and contributors.
  Copyright 2014 Anthony Corbacho, and contributors.
  The derived work consists in modifications from patterns/grok-patterns
  and can be found in the file nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestExtractGrok/patterns

This includes derived works from Dropwizard Metrics available under Apache Software License V2 (https://github.com/dropwizard/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/

  The derived work in the nifi-metrics module is adapted from
    https://github.com/dropwizard/metrics/blob/v2.2.0/metrics-core/src/main/java/com/yammer/metrics/core/VirtualMachineMetrics.java
  and can be found in
    nifi-commons/nifi-metrics/src/main/java/org/apache/nifi/metrics/jvm/JvmMetrics.java
    nifi-commons/nifi-metrics/src/main/java/org/apache/nifi/metrics/jvm/JmxJvmMetrics.java

===========================================
Apache Software License v2
===========================================

The following binary components are provided under the Apache Software License v2

  (ASLv2) Apache Ant
    The following NOTICE information applies:
      Copyright 1999-2018 The Apache Software Foundation

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

      The <sync> task is based on code Copyright (c) 2002, Landmark
      Graphics Corp that has been kindly donated to the Apache Software
      Foundation.

  (ASLv2) Apache BVal Project
    The following NOTICE information applies:
      Apache BVal project
     Copyright 2010-2016 The Apache Software Foundation.

     This product includes software developed by Agimatec GmbH.
     Copyright 2007-2010 Agimatec GmbH. All rights reserved.

  (ASLv2) Apache Commons IO
    The following NOTICE information applies:
      Apache Commons IO
      Copyright 2002-2016 The Apache Software Foundation

  (ASLv2) Apache Commons Net
    The following NOTICE information applies:
      Apache Commons Net
      Copyright 2001-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Collections
    The following NOTICE information applies:
      Apache Commons Collections
      Copyright 2001-2016 The Apache Software Foundation

  (ASLv2) Apache Commons Compress
    The following NOTICE information applies:
      Apache Commons Compress
      Copyright 2002-2017 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)

 (ASLv2) Apache Commons Crypto
    The following NOTICE information applies:
      Apache Commons Crypto
      Copyright 2016-2016 The Apache Software Foundation

  (ASLv2) Jettison
    The following NOTICE information applies:
         Copyright 2006 Envoi Solutions LLC

  (ASLv2) Jets3t
    The following NOTICE information applies:

         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)

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

  (ASLv2) Apache POI
    The following NOTICE information applies:

    This product contains parts that were originally based on software from BEA.
    Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

    This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
    World Wide Web Consortium (Massachusetts Institute of Technology, European
    Research Consortium for Informatics and Mathematics, Keio University)

    This product contains the Piccolo XML Parser for Java
    (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.

    This product contains the chunks_parse_cmds.tbl file from the vsdump program.
    Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)

    This product contains parts of the eID Applet project
    (http://eid-applet.googlecode.com). Copyright (c) 2009-2014
    FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
    Bart Hanssens from FedICT

    CurvesAIP is BSD-licensed software (https://github.com/virtuald/curvesapi/)
    Copyright (c) 2005, Graph Builder

  (ASLv2) Apache Commons Codec
    The following NOTICE information applies:
      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.

  (ASLv2) Apache HttpComponents
    The following NOTICE information applies:
      Apache HttpClient
      Copyright 1999-2015 The Apache Software Foundation

      Apache HttpCore
      Copyright 2005-2015 The Apache Software Foundation

      Apache HttpMime
      Copyright 1999-2013 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

  (ASLv2) Apache Jakarta HttpClient
    The following NOTICE information applies:
      Apache Jakarta HttpClient
      Copyright 1999-2007 The Apache Software Foundation

  (ASLv2) Apache Commons Logging
    The following NOTICE information applies:
      Apache Commons Logging
      Copyright 2003-2016 The Apache Software Foundation

    (ASLv2) Apache Commons VFS
      The following NOTICE information applies:
        Apache Commons VFS
        Copyright 2002-2010 The Apache Software Foundation

    (ASLv2) Apache Commons CSV
      The following NOTICE information applies:
        Apache Commons CSV
        Copyright 2005-2016 The Apache Software Foundation

    (ASLv2) Apache JAMES Mime4j
      The following NOTICE information applies:
       Apache JAMES Mime4j
       Copyright 2004-2010 The Apache Software Foundation

       This product test suite includes data (mimetools-testmsgs folder) developed
       by Eryq and ZeeGee Software Inc as part of the "MIME-tools" Perl5 toolkit
       and licensed under the Artistic License

    (ASLv2) Apache PDFBox
      The following NOTICE information applies:
       Apache PDFBox
       Copyright 2014 The Apache Software Foundation

       Based on source code originally developed in the PDFBox, JempBox and
       FontBox projects.
       Copyright (c) 2002-2007, www.pdfbox.org
       Copyright (c) 2006-2007, www.jempbox.org

       Based on source code originally developed in the PaDaF project.
       Copyright (c) 2010 Atos Worldline SAS

    (ASLv2) Apache FontBox
      The following NOTICE information applies:
        Apache FontBox
        Copyright 2008-2017 The Apache Software Foundation

    (ASLv2) Apache SIS
      The following NOTICE information applies:
        Apache SIS
        Copyright 2010-2017 The Apache Software Foundation

    (ASLv2) Apache JempBox
      The following NOTICE information applies:
        Apache JempBox
        Copyright 2008-2017 The Apache Software Foundation

    (ASLv2) Apache XMLBeans
      The following NOTICE information applies:
        Portions of this software were originally based on the following:
        - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

        Aside from contributions to the Apache XMLBeans project, this
        software also includes:

        - one or more source files from the Apache Xerces-J and Apache Axis
        products, Copyright (c) 1999-2003 Apache Software Foundation

        - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
        Consortium (Massachusetts Institute of Technology, European Research
        Consortium for Informatics and Mathematics, Keio University)

        - resolver.jar from Apache Xml Commons project,
        Copyright (c) 2001-2003 Apache Software Foundation

        - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
        Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0

        - JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/,
        Copyright 2005 BEA under the terms of the Apache Software License 2.0

    (ASLv2) Vorbis Java
      The following NOTICE information applies:
        Ogg and Vorbis Tools for Java
        Copyright 2012 Nick Burch

        The Apache Tika Plugin includes developed at
        The Apache Software Foundation (http://www.apache.org/).

    (ASLv2) Quartz
      The following NOTICE information applies:
        Copyright Declaration:
        Copyright © 2003-2016 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.

        Trademark and Patent declaration
        The name Software AG and all Software AG product names are either trademarks or registered trademarks of Software AG and/or Software AG USA Inc. and/or its subsidiaries and/or its affiliates
        and/or their licensors. Other company and product names mentioned herein may be trademarks of their respective owners.

        Detailed information on trademarks and patents owned by Software AG and/or its subsidiaries is located at http://softwareag.com/licenses.

        Third Party declaration
        This software may include portions of third-party products. For third-party copyright notices, license terms, additional rights or restrictions, please refer to "License Texts, Copyright
        Notices and Disclaimers of Third Party Products". For certain specific third-party license restrictions, please refer to section E of the Legal Notices available under "License Terms and
        Conditions for Use of Software AG Products / Copyright and Trademark Notices of Software AG Products". These documents are part of the product documentation, located at
        http://softwareag.com/licenses and/or in the root installation directory of the licensed product(s).

        Confidentiality Disclaimer:
        Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG.
        Contact GitHub API Training Shop Blog About

    (ASLv2) JCommander
      The following NOTICE information applies:
        JCommander Copyright Notices
        Copyright 2010 Cedric Beust cedric@beust.com

    (ASLv2) Rome
      The following NOTICE information applies:
        Rome Copyright Notices
        Copyright 2004 Sun Microsystems, Inc.
        Copyright 2011 The ROME Team
  
    (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      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())

  (ASLv2) Apache Commons Text
    The following NOTICE information applies:
      Apache Commons Text
      Copyright 2001-2018 The Apache Software Foundation

  (ASLv2) Apache Commons Configuration
    The following NOTICE information applies:
      Apache Commons Configuration
      Copyright 2001-2008 The Apache Software Foundation

  (ASLv2) Apache Commons JEXL
    The following NOTICE information applies:
      Apache Commons JEXL
      Copyright 2001-2011 The Apache Software Foundation

  (ASLv2) Spring Framework
    The following NOTICE information applies:
      Spring Framework 5
      Copyright (c) 2002-2021 Pivotal, Inc.

  (ASLv2) Spring Security
    The following NOTICE information applies:
          Spring Security 5
          Copyright (c) 2002-2021 Pivotal, Inc.

  (ASLv2) Apache Flume
    The following NOTICE information applies:
      Apache Flume
      Copyright 2011-2015 Apache Software Foundation

      asynchbase is BSD-licensed software (https://github.com/OpenTSDB/asynchbase)

      async is BSD-licensed software (https://github.com/stumbleupon/async)

      jopt-simple is MIT licensed software (http://pholser.github.io/jopt-simple/license.html)

      scala-library is BSD-like licensed software (http://www.scala-lang.org/license.html)

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

      Portions of this software was originally based on the following:

        - software copyright (c) 1999-2002, Lotus Development Corporation., http://www.lotus.com.
        - software copyright (c) 2001-2002, Sun Microsystems., http://www.sun.com.
        - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
        - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the
          Apache Software Foundation and was originally developed at Hewlett Packard Company.

  (ASLv2) Apache XML Commons XML APIs
    Copyright 2006 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.
      - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org

  (ASLv2) IRClib
    The following NOTICE information applies:
      IRClib -- A Java Internet Relay Chat library --
      Copyright (C) 2002 - 2006 Christoph Schwering <schwering@gmail.com>

  (ASLv2) Jackson JSON processor
    The following NOTICE information applies:
      # 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.

  (ASLv2) Apache Thrift
    The following NOTICE information applies:
      Apache Thrift
      Copyright 2006-2010 The Apache Software Foundation.

  (ASLv2) Apache MINA
    The following NOTICE information applies:
      Apache MINA Core
      Copyright 2004-2011 Apache MINA Project

      Apache MINA Core 2.0.16
      Copyright 2004-2016 Apache MINA Project

  (ASLv2) opencsv (net.sf.opencsv:opencsv:2.3)

  (ASLv2) Apache Velocity
    The following NOTICE information applies:
      Apache Velocity
      Copyright (C) 2000-2007 The Apache Software Foundation

  (ASLv2) ZkClient
    The following NOTICE information applies:
      ZkClient
      Copyright 2009 Stefan Groschupf

  (ASLv2) Apache Commons CLI
    The following NOTICE information applies:
      Apache Commons CLI
      Copyright 2001-2009 The Apache Software Foundation

  (ASLv2) Apache Commons CLI
    The following NOTICE information applies:
        Apache Commons CLI
        Copyright 2001-2017 The Apache Software Foundation

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

  (ASLv2) Apache Commons Math
    The following NOTICE information applies:
      Apache Commons Math
      Copyright 2001-2012 The Apache Software Foundation

  (ASLv2) Java Native Access Platform
    The following NOTICE information applies:
      Java Native Access Platform
      Copyright 2013 Timothy Wall, Matthias Bläsing

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

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

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

  (ASLv2) Apache log4j
    The following NOTICE information applies:
      Apache log4j
      Copyright 2007 The Apache Software Foundation

  (ASLv2) Apache Tika
    The following NOTICE information applies:
      Apache Tika
      Copyright 2015 The Apache Software Foundation

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

      Copyright 1993-2010 University Corporation for Atmospheric Research/Unidata
      This software contains code derived from UCAR/Unidata's NetCDF library.

      Tika-server component uses CDDL-licensed dependencies: jersey (http://jersey.java.net/) and
      Grizzly (http://grizzly.java.net/)

      Tika-parsers component uses CDDL/LGPL dual-licensed dependency: jhighlight (https://github.com/codelibs/jhighlight)

      OpenCSV: Copyright 2005 Bytecode Pty Ltd. Licensed under the Apache License, Version 2.0

      IPTC Photo Metadata descriptions Copyright 2010 International Press Telecommunications Council.


  (ASLv2) Apache Calcite -- Avatica
    The following NOTICE information applies:
		Apache Calcite -- Avatica
		Copyright 2012-2017 The Apache Software Foundation

  (ASLv2) Apache Calcite
    The following NOTICE information applies:
		Apache Calcite
		Copyright 2012-2017 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.

  (ASLv2) Apache Jakarta Commons Digester
    The following NOTICE information applies:
      Apache Jakarta Commons Digester
      Copyright 2001-2006 The Apache Software Foundation

  (ASLv2) Apache Commons BeanUtils
    The following NOTICE information applies:
      Apache Commons BeanUtils
      Copyright 2000-2014 The Apache Software Foundation

  (ASLv2) Apache Avro
    The following NOTICE information applies:
      Apache Avro
      Copyright 2009-2017 The Apache Software Foundation

  (ASLv2) Snappy Java
    The following NOTICE information applies:
      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

  (ASLv2) ApacheDS
    The following NOTICE information applies:
      ApacheDS
      Copyright 2003-2013 The Apache Software Foundation

  (ASLv2) Apache ZooKeeper
    The following NOTICE information applies:
      Apache ZooKeeper
      Copyright 2009-2012 The Apache Software Foundation

  (ASLv2) Apache Commons Daemon
    The following NOTICE information applies:
      Apache Commons Daemon
      Copyright 1999-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Exec
    The following NOTICE information applies:
      Apache Commons Exec
      Copyright 2005-2016 The Apache Software Foundation

  (ASLv2) Apache Commons EL
    The following NOTICE information applies:
      Apache Commons EL
      Copyright 1999-2007 The Apache Software Foundation

      EL-8 patch - Copyright 2004-2007 Jamie Taylor
      http://issues.apache.org/jira/browse/EL-8

  (ASLv2) Jetty
    The following NOTICE information applies:
       Jetty Web Container
       Copyright 1995-2019 Mort Bay Consulting Pty Ltd.

  (ASLv2) Apache Tomcat
    The following NOTICE information applies:
      Apache Tomcat
      Copyright 2007 The Apache Software Foundation

        Java Management Extensions (JMX) support is provided by
        the MX4J package, which is open source software.  The
        original software and related information is available
        at http://mx4j.sourceforge.net.

        Java compilation software for JSP pages is provided by Eclipse,
        which is open source software.  The orginal software and
        related infomation is available at
        http://www.eclipse.org.

  (ASLv2) Apache Kafka
    The following NOTICE information applies:
      Apache Kafka
      Copyright 2012 The Apache Software Foundation.

  (ASLv2) Apache POI
      The following NOTICE information applies:
        Apache POI
        Copyright 2012 The Apache Software Foundation.
        
        This product contains parts that were originally based on software from BEA.
        Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead link),
        which was acquired by Oracle Corporation in 2008.
        <http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
        <https://en.wikipedia.org/wiki/BEA_Systems>
        
        This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
        World Wide Web Consortium (Massachusetts Institute of Technology, European
        Research Consortium for Informatics and Mathematics, Keio University)

        This product contains the Piccolo XML Parser for Java
        (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.

        This product contains the chunks_parse_cmds.tbl file from the vsdump program.
        Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)

        This product contains parts of the eID Applet project 
        <http://eid-applet.googlecode.com> and <https://github.com/e-Contract/eid-applet>.
        Copyright (c) 2009-2014
        FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
        Bart Hanssens from FedICT

  (ASLv2) Apache CXF
    The following NOTICE information applies:
      Apache CXF
      Copyright 2008-2017 The Apache Software Foundation

  (ASLv2) Apache Lucene
    The following NOTICE information applies:
      Apache Lucene
      Copyright 2014 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.

  (ASLv2) Apache Solr
    The following NOTICE information applies:
      Apache Solrj
      Copyright 2006-2014 The Apache Software Foundation

  (ASLv2) Joda Time
    The following NOTICE information applies:
      This product includes software developed by
      Joda.org (http://www.joda.org/).

  (ASLv2) Apache ActiveMQ
    The following NOTICE information applies:
      ActiveMQ :: Client
      Copyright 2005-2017 The Apache Software Foundation

  (ASLv2) Apache Geronimo
    The following NOTICE information applies:
      Apache Geronimo
      Copyright 2003-2008 The Apache Software Foundation

  (ASLv2) Swagger Core
    The following NOTICE information applies:
      Swagger Core 1.5.3-M1
      Copyright 2015 Reverb Technologies, Inc.

  (ASLv2) Google GSON
    The following NOTICE information applies:
      Copyright 2008 Google Inc.

  (ASLv2) Google OAuth Client Library
    The following NOTICE information applies:
      Copyright 2012 Google Inc.

  (ASLv2) Google HTTP Client Library for Java
    The following NOTICE information applies:
      Copyright 2011 Google Inc.

  (ASLv2) Google Guice
    The following NOTICE information applies:
      Google Guice - Core Library
      Copyright 2006-2011 Google, Inc.

  (ASLv2) Google Cloud Client Library for Java
    The following NOTICE information applies:
      Google Cloud Client Library for Java
      Copyright 2016-2021 Google Inc. All Rights Reserved.

  (ASLv2) Guava
    The following NOTICE information applies:
      Guava
      Copyright 2015 The Guava Authors

  (ASLv2) Apache Commons FileUpload
    The following NOTICE information applies:
      Apache Commons FileUpload
      Copyright 2002-2014 The Apache Software Foundation

  (ASLv2) JSON-SMART
    The following NOTICE information applies:
      Copyright 2011 JSON-SMART authors

   (ASLv2) JsonPath
     The following NOTICE information applies:
       Copyright 2011 JsonPath authors

  (ASLv2) Kite SDK
    The following NOTICE information applies:
      This product includes software developed by Cloudera, Inc.
      (http://www.cloudera.com/).

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

      This product includes software developed by
      Saxonica (http://www.saxonica.com/).

  (ASLv2) MongoDB Java Driver
    The following NOTICE information applies:
      Copyright (C) 2008-2013 10gen, Inc.

  (ASLv2) Parquet MR
    The following NOTICE information applies:
      Parquet MR
      Copyright 2012 Twitter, Inc.

      This project includes code from https://github.com/lemire/JavaFastPFOR
      parquet-column/src/main/java/parquet/column/values/bitpacking/LemireBitPacking.java
      Apache License Version 2.0 http://www.apache.org/licenses/.
      (c) Daniel Lemire, http://lemire.me/en/

  (ASLv2) JOAuth
    The following NOTICE information applies:
      JOAuth
      Copyright 2010-2013 Twitter, Inc

  (ASLv2) Hosebird Client
    The following NOTICE information applies:
      Hosebird Client (hbc)
      Copyright 2013 Twitter, Inc.

  (ASLv2) GeoIP2 Java API
    The following NOTICE information applies:
      GeoIP2 Java API
      This software is Copyright (c) 2013 by MaxMind, Inc.

    (ASLv2) Apache XMLBeans
      The following NOTICE information applies:
        Portions of this software were originally based on the following:
        - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

        Aside from contributions to the Apache XMLBeans project, this
        software also includes:

        - one or more source files from the Apache Xerces-J and Apache Axis
        products, Copyright (c) 1999-2003 Apache Software Foundation

        - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
        Consortium (Massachusetts Institute of Technology, European Research
        Consortium for Informatics and Mathematics, Keio University)

        - resolver.jar from Apache Xml Commons project,
        Copyright (c) 2001-2003 Apache Software Foundation

        - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
        Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0

        - JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/,
        Copyright 2005 BEA under the terms of the Apache Software License 2.0

  (ASLv2) Woodstox Core ASL
    The following NOTICE information applies:
      This product currently only contains code developed by authors
      of specific components, as identified by the source code files.

      Since product implements StAX API, it has dependencies to StAX API
      classes.

  (ASLv2) AWS SDK for Java 2.0
      The following NOTICE information applies:
        Copyright 2010-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.

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

  (ASLv2) Amazon Web Services SDK
    The following NOTICE information applies:
      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.

   (ASLv2) Apache Commons DBCP
      The following NOTICE information applies:
        Apache Commons DBCP
        Copyright 2001-2015 The Apache Software Foundation.

   (ASLv2) Apache Commons Pool
      The following NOTICE information applies:
        Apache Commons Pool
        Copyright 1999-2009 The Apache Software Foundation.

    (ASLv2) Objenesis
      The following NOTICE information applies:
        Objenesis
        Copyright 2006-2013 Joe Walnes, Henri Tremblay, Leonardo Mesquita

   (ASLv2) Apache Maven
      The following NOTICE information applies:
        Apache Maven
        Copyright 2003-2017 The Apache Software Foundation.

    (ASLv2) Apache Derby
      The following NOTICE information applies:
        Apache Derby
        Copyright 2004-2014 Apache, Apache DB, Apache Derby, Apache Torque, Apache JDO, Apache DDLUtils,
        the Derby hat logo, the Apache JDO logo, and the Apache feather logo are trademarks of The Apache Software Foundation.

    (ASLv2) Apache Directory Server
      The following NOTICE information applies:
        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

    (ASLv2) Apache Curator
      The following NOTICE information applies:
        Curator Framework
        Copyright 2011-2014 The Apache Software Foundation

        Curator Client
        Copyright 2011-2014 The Apache Software Foundation

        Curator Recipes
        Copyright 2011-2014 The Apache Software Foundation

    (ASLv2) Apache Xerces Java
      The following NOTICE information applies:
        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.

    (ASLv2) Metadata-Extractor
      The following NOTICE information applies:
        Metadata-Extractor
        Copyright 2002-2015 Drew Noakes

    (ASLv2) Couchbase Java SDK
      The following NOTICE information applies:
        Couchbase Java SDK
        Copyright 2014 Couchbase, Inc.

    (ASLv2) Hazelcast
      The following NOTICE information applies:
        Core Hazelcast Module 4.0.1
        Copyright (c) 2008-2020, Hazelcast, Inc. All Rights Reserved.

    (ASLv2) RxJava
      The following NOTICE information applies:
        Couchbase Java SDK
        Copyright 2012 Netflix, Inc.

    (ASLv2) HBase Common
      The following NOTICE information applies:
        This product includes portions of the Guava project v14 and v21, specifically
          'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java'
          'hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java'
          'hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferUtils.java'

        Copyright (C) 2007 The Guava Authors

        Licensed under the Apache License, Version 2.0

    (ASLv2) Java Native Access
      The following NOTICE information applies:
         Java Native Access
         Copyright 2015 Java Native Access

    (ASLv2) Apache HTrace Core
      The following NOTICE information applies:
        Copyright 2016 The Apache Software Foundation

        Apache HTrace includes an Apache Thrift connector to Zipkin. Zipkin
        is a distributed tracing system that is Apache 2.0 Licensed.
        Copyright 2012 Twitter, Inc.

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:pom:2.5.4 and its submodules included as transitive dependencies - http://www.groovy-lang.org)
        groovy
        groovy-ant
        groovy-cli-commons
        groovy-cli-picocli
        groovy-console
        groovy-datetime
        groovy-docgenerator
        groovy-groovydoc
        groovy-groovysh
        groovy-jmx
        groovy-json
        groovy-jsr223
        groovy-macro
        groovy-nio
        groovy-servlet
        groovy-sql
        groovy-swing
        groovy-templates
        groovy-test
        groovy-test-junit5
        groovy-testng
        groovy-xml
    The following NOTICE information applies:
      Groovy Language
         Copyright 2003-2018 The respective authors and developers
         Developers and Contributors are listed in the project POM file
         and Gradle build file

         This product includes software developed by
         The Groovy community (http://groovy.codehaus.org/).

         This product bundles icons from the famfamfam.com silk icons set
         http://www.famfamfam.com/lab/icons/silk/
         Licensed under the Creative Commons Attribution Licence v2.5
         http://creativecommons.org/licenses/by/2.5/

  (ASLv2) Groovy 2.4.16 (http://www.groovy-lang.org)
        groovy-2.4.16-indy
        groovy-json-2.4.16-indy
        groovy-sql-2.4.16-indy
    The following NOTICE information applies:
        Apache Groovy
        Copyright 2003-2018 The Apache Software Foundation

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

        This product includes/uses ANTLR (http://www.antlr2.org/)
        developed by Terence Parr 1989-2006

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:jar:2.4.11 - http://www.groovy-lang.org)
     The following NOTICE information applies:
       Apache Groovy
       Copyright 2003-2017 The Apache Software Foundation

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

       This product includes/uses ANTLR (http://www.antlr2.org/)
       developed by Terence Parr 1989-2006

       This product bundles icons from the famfamfam.com silk icons set
       http://www.famfamfam.com/lab/icons/silk/
       Licensed under the Creative Commons Attribution Licence v2.5
       http://creativecommons.org/licenses/by/2.5/

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:jar:2.1.6 - http://www.groovy-lang.org)
    The following NOTICE information applies:
      Groovy Language
         Copyright 2003-2012 The respective authors and developers
         Developers and Contributors are listed in the project POM file
         and Gradle build file

     This product includes software developed by
     The Groovy community (http://groovy.codehaus.org/).

    (ASLv2) Apache Ignite
      The following NOTICE information applies:
        Apache Ignite
        Copyright 2015 The Apache Software Foundation

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


        This software includes code from IntelliJ IDEA Community Edition
        Copyright (C) JetBrains s.r.o.
        https://www.jetbrains.com/idea/
        Licensed under Apache License, Version 2.0.
        http://search.maven.org/#artifactdetails%7Corg.jetbrains%7Cannotations%7C13.0%7Cjar

    (ASLv2) Apache Geronimo JSR-107 JCache Spec API
      The following NOTICE information applies:
        Apache Geronimo JSR-107 JCache Spec API
        Copyright 2009-2014 The Apache Software Foundation

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

    (ASLv2) RethinkDB Java Driver
      The following NOTICE information applies:
      RethinkDB Language Drivers

      Copyright 2010-2012 RethinkDB

    (ASLv2) Neo4j Java Driver
      Neo4j
      Copyright © 2002-2018 Neo4j Sweden AB (referred to in this notice as "Neo4j")
      [http://neo4j.com]

    (ASLv2) Carrotsearch HPPC
      The following NOTICE information applies:
      HPPC borrowed code, ideas or both from:

       * Apache Lucene, http://lucene.apache.org/
         (Apache license)
       * Fastutil, http://fastutil.di.unimi.it/
         (Apache license)
       * Koloboke, https://github.com/OpenHFT/Koloboke
         (Apache license)

    (ASLv2) t-digest
       The following NOTICE information applies:
       The code for the t-digest was originally authored by Ted Dunning
       A number of small but very helpful changes have been contributed by Adrien Grand (https://github.com/jpountz)

    (ASLv2) subethasmtp
       The following NOTICE information applies:
       Copyright (C) 2006-2007 SubEthaMail.org

    (ASLv2) Apache OpenNLP Tools
      Apache OpenNLP Tools
      Copyright 2015 The Apache Software Foundation

    (ASLv2) Apache Commons Email
       The following NOTICE information applies:
       Apache Commons Email
       Copyright 2002-2015 The Apache Software Foundation

    (ASLv2) Apache Hive
       The following NOTICE information applies:
       Apache Hive
       Copyright 2008-2015 The Apache Software Foundation

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

       This product includes Jersey (https://jersey.java.net/)
       Copyright (c) 2010-2014 Oracle and/or its affiliates.

       This project includes software copyrighted by Microsoft Corporation and
       licensed under the Apache License, Version 2.0.

       This project includes software copyrighted by Dell SecureWorks and
       licensed under the Apache License, Version 2.0.

    (ASLv2) BoneCP
       The following NOTICE information applies:
       BoneCP
       Copyright 2010 Wallace Wadge

  (ASLv2) Apache Hadoop
    The following NOTICE information applies:
      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.

  (ASLv2) ParCEFone
    The following NOTICE information applies:
      ParCEFone
      Copyright 2016 Fluenda

  (ASLv2) Grok
    The following NOTICE information applies:
      Grok
      Copyright 2014 Anthony Corbacho, and contributors.

  (ASLv2) gRPC-Java
    The following NOTICE information applies:
	Copyright 2014, gRPC Authors 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

	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.

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

	This product contains a modified portion of 'OkHttp', an open source
	HTTP & SPDY client for Android and Java applications, which can be obtained
	at:

	  * LICENSE:
	    * okhttp/third_party/okhttp/LICENSE (Apache License 2.0)
	  * HOMEPAGE:
	    * https://github.com/square/okhttp
	  * LOCATION_IN_GRPC:
	    * okhttp/third_party/okhttp

	This product contains a modified portion of 'Netty', an open source
	networking library, which can be obtained at:

	  * LICENSE:
	    * netty/third_party/netty/LICENSE.txt (Apache License 2.0)
	  * HOMEPAGE:
	    * https://netty.io
	  * LOCATION_IN_GRPC:
    * netty/third_party/netty

  (ASLv2) Ehcache 2.x
    The following NOTICE information applies:
      Copyright 2003-2010 Terracotta, Inc.

  (ASLv2) The Netty Project
      The following NOTICE information applies:
  	Copyright 2014 The Netty Project
  	-------------------------------------------------------------------------------
  	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:

  	  * 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 a forked and modified version of Tomcat Native

        * LICENSE:
          * ASL2
        * HOMEPAGE:
          * http://tomcat.apache.org/native-doc/
          * https://svn.apache.org/repos/asf/tomcat/native/

  (ASLv2) Error Prone
    The following NOTICE information applies:
      Copyright 2017 Google Inc.

  (ASLv2) Instrumentation
    The following NOTICE information applies:
      Copyright 2016 Google Inc.

  (ASLv2) Google APIs
    The following NOTICE information applies:
      Copyright 2016 Google Inc.

  (ASLv2) Android JSON library
    The following NOTICE information applies:
      Copyright (C) 2010 The Android Open Source Project

  (ASLv2) tlsh
    The following NOTICE information applies:
       Java port of Trend Locality Sensitive Hash (TLSH)
       Copyright 2000-2016 Idealista, S.A

       This product includes software developed at
       Idealista, S.A (http://www.idealista.com/)

       Based on the algorithms described in Trend Micro's TLSH official
       repository, available in:

         https://github.com/trendmicro/tlsh

       Refer to the following publication for more information:

         Jonathan Oliver, Chun Cheng and Yanggui Chen, “TLSH - A Locality
         Sensitive Hash” - 4th Cybercrime and Trustworthy Computing Workshop,
         Sydney, November 2013

         https://drive.google.com/file/d/0B6FS3SVQ1i0GTXk5eDl3Y29QWlk/edit?usp=sharing

       This software is inspired in the previous Java port developed by TripleCheck:

         https://github.com/triplecheck/TLSH

  (ASLv2) Apache Parquet
    The following NOTICE information applies:
      Apache Parquet MR (Incubating)
      Copyright 2014 The Apache Software Foundation

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

  (ASLv2) Hortonworks Schema Registry
    The following NOTICE information applies:
      Hortonworks Schema Registry
      Copyright 2016-2017 Hortonworks, Inc.

  (ASLv2) Aggregate Designer
    The following NOTICE information applies:

        Aggregate Designer

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

  (ASLv2) Classmate
    The following NOTICE information applies
        Java ClassMate library was originally written by Tatu Saloranta (tatu.saloranta@iki.fi)

        Other developers who have contributed code are:

        * Brian Langel

    (ASLv2) Boilerpipe
      The following NOTICE information applies:
          Copyright (c) 2009-2011 Christian Kohlschütter

    (ASLv2) Apache Ivy
        The following NOTICE information applies:
           Copyright 2007-2017 The Apache Software Foundation

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

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

    (ASLv2) DataStax Java Driver for Apache Cassandra - Core
        The following NOTICE information applies:
          DataStax Java Driver for Apache Cassandra - Core
          Copyright (C) 2012-2017 DataStax Inc.
    (ASLv2) bytebuffer-collections
        The following NOTICE information applies:
          bytebuffer-collections
          Copyright 2011-2015 Metamarkets Group Inc.

    (ASLv2) Druid
        The following NOTICE information applies:
          Druid - a distributed column store.
          Copyright 2012-2016 Metamarkets Group Inc.
          Copyright 2015-2016 Yahoo! Inc.
          Copyright 2015-2016 Imply Data, Inc.

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

          This product contains a modified version of Andrew Duffy's java-alphanum library
            * LICENSE:
              * https://github.com/amjjd/java-alphanum/blob/5c036e2e492cc7f3b7bcdebd46b8f9e2a87927e5/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/amjjd/java-alphanum

          This product contains conjunctive normal form conversion code and a variance aggregator algorithm adapted from Apache Hive
            * LICENSE:
              * https://github.com/apache/hive/blob/branch-2.0/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/apache/hive

          This product contains variable length long deserialization code adapted from Apache Lucene
            * LICENSE:
              * https://github.com/apache/lucene-solr/blob/master/lucene/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/apache/lucene-solr

          This product contains a modified version of Metamarkets java-util library
            * LICENSE:
              * https://github.com/metamx/java-util/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/java-util
            * COMMIT TAG:
              * https://github.com/metamx/java-util/commit/826021f

          This product contains a modified version of TestNG 6.8.7
            * LICENSE:
              * http://testng.org/license/ (Apache License, Version 2.0)
            * HOMEPAGE:
              * http://testng.org/

          This product contains a modified version of Metamarkets bytebuffer-collections library
            * LICENSE:
              * https://github.com/metamx/bytebuffer-collections/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/bytebuffer-collections
            * COMMIT TAG:
              * https://github.com/metamx/bytebuffer-collections/commit/3d1e7c8

          This product contains SQL query planning code adapted from Apache Calcite
            * LICENSE:
              * https://github.com/apache/calcite/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://calcite.apache.org/

          This product contains a modified version of Metamarkets extendedset library
            * LICENSE:
              * https://github.com/metamx/extendedset/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/extendedset
            * COMMIT TAG:
              * https://github.com/metamx/extendedset/commit/c9d647d

          This product contains a modified version of Alessandro Colantonio's CONCISE
          (COmpressed 'N' Composable Integer SEt) library, extending the functionality of
          ConciseSet to use IntBuffers.
            * (c) 2010 Alessandro Colantonio
            * <mailto:colanton@mat.uniroma3.it>
            * <http://ricerca.mat.uniroma3.it/users/colanton>
            * LICENSE:
              * Apache License, Version 2.0
            * HOMEPAGE:
              * https://sourceforge.net/projects/concise/

          This product contains a modified version of The Guava Authors's Closer class from Guava library:
           * LICENSE:
             * https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c/COPYING (Apache License, Version 2.0)
           * HOMEPAGE:
             * https://github.com/google/guava
           * COMMIT TAG:
             * https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c

          This product contains code adapted from Apache Hadoop
            * LICENSE:
              * https://github.com/apache/hadoop/blob/trunk/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * http://hadoop.apache.org/

      (ASLv2) Emitter
        The following NOTICE information applies:
          emitter
          Copyright 2012-2015 Metamarkets Group Inc.

      (ASLv2) Finagle
        The following NOTICE information applies:
          Copyright 2017, Twitter Inc.
          This software contains portions of code from other open-source projects, including:
          >>>>>>>>>>>>>>
          Apache Thrift
          Copyright 2006-2010 The Apache Software Foundation.

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

  (ASLv2) java-util
    The following NOTICE information applies:
       java-util
       Copyright 2011-2017 Metamarkets Group Inc.

  (ASLv2) jdbi
    The following NOTICE information applies:
      This product includes software developed by Brian McCallister

  (ASLv2) Joda Convert
       The following NOTICE information applies:
         Joda Convert
         Copyright 2010-present Stephen Colebourne

         This product includes software developed by
         Joda.org (http://www.joda.org/).


         Joda-Convert includes code from Google Guava, which is licensed as follows:

         Copyright (C) 2011 The Guava Authors

         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.

  (ASLv2) loglady
    The following NOTICE information applies:
       Copyright (c) 2013 Daniel Lundin

  (ASLv2) scala_util
    The following NOTICE information applies:
      Copyright 2012 Metamarkets Group Inc.

  (ASLv2) server-metrics
    The following NOTICE information applies:
      server-metrics
      Copyright 2011-2015 Metamarkets Group Inc.

  (ASLv2) simple-syslog-5424
    The following NOTICE information applies:

        simple-syslog-5424
        https://github.com/palindromicity/simple-syslog-5424

        Copyright 2018 simple-syslog-5424 authors.

  (ASLv2) Audience Annotations
    The following NOTICE information applies:
      Apache Yetus
      Copyright 2008-2018 The Apache Software Foundation

  (ASLv2) sshj
    The following NOTICE information applies:

      sshj - SSHv2 library for Java
      Copyright 2010-2012 sshj contributors

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

      - Apache MINA SSHD
      - Apache Commons-Net

  (ASLv2) Nimbus Language Tags
      The following NOTICE information applies:
        Nimbus Language Tags
        Copyright 2012-2016, Connect2id Ltd.

  (ASLv2) Nimbus OAuth 2.0 SDK with OpenID Connect extensions
    The following NOTICE information applies:
      Nimbus OAuth 2.0 SDK with OpenID Connect extensions
      Copyright 2012-2020, Connect2id Ltd and contributors.

  (ASLv2) Okio
    The following NOTICE information applies:
      Okio
      Copyright 2013 Square, Inc.

  (ASLv2) Apache Qpid Proton-J
    The following NOTICE information applies:
      Apache Qpid Proton-J
      Copyright 2012-2020 The Apache Software Foundation

  (ASLv2) Retrofit
    The following NOTICE information applies:
      Retrofit
      Copyright 2013 Square, Inc.

  (ASLv2) RxJava
    The following NOTICE information applies:
      RxJava
      Copyright (c) 2016-present, RxJava Contributors.

  (ASLv2) ASM Based Accessors Helper Used By JSON Smart (net.minidev:accessors-smart:jar:1.2 - http://www.minidev.net/)
    The following NOTICE information applies:
      ASM Based Accessors Helper Used By JSON Smart 1.2
      Copyright 2017, Uriel Chemouni

  (ASLv2) Adapter: RxJava (com.squareup.retrofit2:adapter-rxjava:jar:2.6.2)
    The following NOTICE information applies:
      Adapter: RxJava 2.6.2
      Copyright 2019, Jake Wharton

  (ASLv2) BCrypt Password Hashing Function (at.favre.lib:bcrypt:jar:0.9.0 - https://github.com/patrickfav/bcrypt)
    The following NOTICE information applies:
      BCrypt Password Hashing Function 0.9.0
      Copyright 2018 Patrick Favre-Bulle

  (ASLv2) Bytes Utility Library (at.favre.lib:bytes:jar:1.3.0 - https://github.com/patrickfav/bytes-java)
    The following NOTICE information applies:
      Bytes Utility Library 1.3.0
      Copyright 2017 Patrick Favre-Bulle

  (ASLv2) Converter: Jackson (com.squareup.retrofit2:converter-jackson:jar:2.5.0)
    The following NOTICE information applies:
      Converter: Jackson 2.5.0
      Copyright 2018, Jake Wharton

  (ASLv2) Nimbus JOSE+JWT (com.nimbusds:nimbus-jose-jwt - https://connect2id.com/products/nimbus-jose-jwt)
    The following NOTICE information applies:
      Nimbus JOSE+JWT
      Copyright 2021, Connect2id Ltd.

  (ASLv2) OkHttp Logging Interceptor (com.squareup.okhttp3:logging-interceptor:jar:3.12.2)
    The following NOTICE information applies:
      OkHttp Logging Interceptor 3.12.2
      Copyright 2019 Square, Inc.

  (ASLv2) OkHttp (com.squareup.okhttp3:okhttp:jar:3.12.6)
    The following NOTICE information applies:
      OkHttp 3.12.6
      Copyright 2019 Square, Inc.

  (ASLv2) OkHttp URLConnection (com.squareup.okhttp3:okhttp-urlconnection:jar:3.12.2)
    The following NOTICE information applies:
      OkHttp 3.12.2
      Copyright 2019 Square, Inc.

  (ASLv2) Woodstox (com.fasterxml.woodstox:woodstox-core:jar:6.1.1 - https://github.com/FasterXML/woodstox)
    The following NOTICE information applies:
      Woodstox Core 6.1.1
      Copyright 2015, FasterXML, LLC

  (ASLv2) Non Blocking Reactive Foundation For The JVM (io.projectreactor:reactor-core:jar:3.3.5.RELEASE - https://github.com/reactor/reactor-core)
    The following NOTICE information applies:
      Non Blocking Reactive Foundation For The JVM
      Copyright 2020, Project Reactor

  (ASLv2) Reactive Streams Netty Driver (io.projectreactor.netty:reactor-netty:jar:0.9.7.RELEASE - https://github.com/reactor/reactor-netty)
    The following NOTICE information applies:
       Reactive Streams Netty Driver
       Copyright 2020, Project Reactor

  (ALSv2) smbj
    The following NOTICE information applies:
      Copyright (C)2016 - SMBJ Contributors

  (ASLv2) asn-one
    The following NOTICE information applies:
      Copyright 2016 Jeroen van Erp <jeroen@hierynomus.com>

  (ASLv2) Apache Ftplet API
    The following NOTICE information applies:
      Apache Ftplet API 1.1.1
      Copyright 2003-2017 The Apache Software Foundation

  (ASLv2) Apache FtpServer Core
    The following NOTICE information applies:
      Apache FtpServer Core 1.1.1
      Copyright 2003-2017 The Apache Software Foundation

  (ASLv2) Zip4j
    The following NOTICE information applies:
      Zip4j 2
      Copyright 2021 Srikanth Reddy Lingala

  (ASLv2) QuestDB (org.questdb:core:core-4.2.1.jar - https://github.com/questdb/questdb)
    The following NOTICE information applies:
      Copyright (c) 2014-2019 Appsicle
      Copyright (c) 2019-2020 QuestDB

************************
Common Development and Distribution License 1.1
************************

The following binary components are provided under the Common Development and Distribution License 1.1. See project link for details.

    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-container-servlet-core (org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-entity-filtering (org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-hk2 (org.glassfish.jersey.inject:jersey-hk2:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-jaxb (org.glassfish.jersey.media:jersey-media-jaxb:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-json-jackson (org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (org.glassfish.jersey.core:jersey-server:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2 (org.glassfish.hk2:hk2:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-api (org.glassfish.hk2:hk2-api:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-utils (org.glassfish.hk2:hk2-utils:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-locator (org.glassfish.hk2:hk2-locator:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-config (org.glassfish.hk2:hk2-config:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-core (org.glassfish.hk2:hk2-core:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-runlevel (org.glassfish.hk2:hk2-runlevel:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) config-types (org.glassfish.hk2:config-types:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) class-model (org.glassfish.hk2:class-model:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) asm-all-repackaged (org.glassfish.hk2.external:asm-all-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance-repackaged (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.4.0-b25 - https://hk2.java.net/external/javax.inject)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.9 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.9 - https://jersey.java.net/jersey-core/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-json (com.sun.jersey:jersey-json:jar:1.9 - https://jersey.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (com.sun.jersey:jersey-server:jar:1.9 - https://jersey.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guice (com.sun.jersey.contribs:jersey-guice:jar:1.9 - https://jersey.java.net/)


    (CDDL 1.1) (GPL2 w/ CPE) Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:jar:2.2.3-1 - http://jaxb.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) Java Architecture For XML Binding (javax.xml.bind:jaxb-api:jar:2.2.2 - https://jaxb.dev.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) MIME Streaming Extension (org.jvnet.mimepull:mimepull:jar:1.9.3 - http://mimepull.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - http://kenai.com/projects/javamail/mail)
    (CDDL 1.1) (GPL2 w/ CPE) JSP Implementation (org.glassfish.web:javax.servlet.jsp:jar:2.3.2 - http://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages (TM) TagLib Implementation (org.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.2 - http://jstl.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 (org.glassfish:javax.el:jar:3.0.0 - http://el-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) API (javax.servlet.jsp:javax.servlet.jsp-api:jar:2.3.1 - http://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 API  (javax.el:javax.el-api:jar:3.0.0 - http://uel-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) Standard Tag Library API  (javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:jar:1.2.1 - http://jcp.org/en/jsr/detail?id=52)
    (CDDL 1.1) (GPL2 w/ CPE) Java Servlet API  (javax.servlet:javax.servlet-api:jar:3.1.0 - http://servlet-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Javax JMS Api (javax.jms:javax.jms-api:jar:2.0.1 - http://java.net/projects/jms-spec/pages/Home)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing API (javax.json:javax.json-api:jar:1.0 - http://json-processing-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing Default Provider (org.glassfish:javax.json:jar:1.0.4 - https://jsonp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) OSGi resource locator bundle (org.glassfish.hk2:osgi-resource-locator:jar:1.0.1 - http://glassfish.org/osgi-resource-locator)
    (CDDL 1.1) (GPL2 w/ CPE) javax.annotation API (javax.annotation:javax.annotation-api:jar:1.2 - http://jcp.org/en/jsr/detail?id=250)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.4.0-b25 - https://hk2.java.net/external/javax.inject)
    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.0.1 - http://jax-rs-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.1 - http://jax-rs-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (com.sun.mail:javax.mail:jar:1.6.1)

************************
Common Development and Distribution License 1.0
************************

The following binary components are provided under the Common Development and Distribution License 1.0.  See project link for details.

    (CDDL 1.0) JavaServlet(TM) Specification (javax.servlet:servlet-api:jar:2.5 - no url available)
    (CDDL 1.0) (GPL3) Streaming API For XML (javax.xml.stream:stax-api:jar:1.0-2 - no url provided)
    (CDDL 1.0) JavaBeans Activation Framework (JAF) (javax.activation:activation:jar:1.1 - http://java.sun.com/products/javabeans/jaf/index.jsp)
    (CDDL 1.0) JHighlight (org.codelibs:jhighlight:1.0.2 - https://github.com/codelibs/jhighlight)
    (CDDL 1.0) Javax Transaction API (javax.transaction:transaction-api:jar:1.1 - no url available)

************************
Creative Commons Attribution-ShareAlike 3.0
************************

The following binary components are provided under the Creative Commons Attribution-ShareAlike 3.0.  See project link for details.

	(CCAS 3.0) MaxMind DB (https://github.com/maxmind/MaxMind-DB)

************************
Eclipse Public License 1.0
************************

The following binary components are provided under the Eclipse Public License 1.0.  See project link for details.

    (EPL 1.0) Model-Driven Health Tools ( org.openehealth.ipf.oht.mdht ) https://projects.eclipse.org/proposals/model-driven-health-tools
    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.9.6 - http://www.eclipse.org/aspectj/)
    (EPL 1.0) AspectJ Runtime (org.aspectj:aspectjrt:jar:1.9.6 - http://www.eclipse.org/aspectj/)
    (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - http://www.h2database.com/html/license.html)
    (EPL 1.0)(LGPL 2.1) Logback Classic (ch.qos.logback:logback-classic:jar:1.2.3 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.2.3 - http://logback.qos.ch/)
    (EPLv1.0)(GPL 2)(LGPL 2.1) JRuby (org.jruby:jruby-complete:9.1.9.0 - http://jruby.org).
    (EPL 1.0) Eclipse Paho MQTT Client (org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0 - https://github.com/eclipse/paho.mqtt.java)
    (EPL 1.0) Eclipse Link (org.eclipse.persistence:eclipselink:2.5.2 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) Common Service Data Objects (org.eclipse.persistence:commonj.sdo:2.1.1 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) Java Persistence API (org.eclipse.persistence:javax.persistence:2.1.0 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) JaCoCo Java Code Coverage Library ( org.jacoco ) http://www.eclemma.org/jacoco
    (EPLv1.0) Clojure (org.clojure:clojure:1.8.0 - http://clojure.org)

************************
Eclipse Public License 2.0
************************

The following binary components are provided under the Eclipse Public License 2.0.

    (EPL 2.0) Jakarta Mail API (jakarta.mail:jakarta.mail-api:jar:2.0.1)
    (EPL 2.0) Jakarta Mail (com.sun.mail:jakarta.mail:jar:2.0.1)

************************
Eclipse Distribution License 1.0
************************

The following binary components are provided under the Eclipse Distribution License 1.0.

    (EDL 1.0) Jakarta Activation API (jakarta.activation:jakarta.activation-api:jar:2.0.1)
    (EDL 1.0) Jakarta Activation (com.sun.activation:jakarta.activation:jar:2.0.1)
    (EDL 1.0) Jakarta XML Binding API (jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3)
    (EDL 1.0) JAXB (JSR 222) Reference Implementation (org.glassfish.jaxb:jaxb-runtime:jar:2.3.5)
    (EDL 1.0) Istack Common Utility Code Runtime (com.sun.istack:istack-commons-runtime:jar:3.0.12)
    (EDL 1.0) TXW2 Runtime (org.glassfish.jaxb:txw2:jar:2.3.5)

************************
The MIT License
************************

   (MIT) Azure SDK for Java
     The following NOTICE information applies:
       Copyright 2021 Microsoft Corporation or its affiliates. All Rights Reserved.

       This product includes software developed by
       Microsoft Corporation (https://www.microsoft.com/).

*****************
Mozilla Public License v2.0
*****************

The following binary components are provided under the Mozilla Public License v2.0.  See project link for details.

    (MPL 2.0) Saxon HE (net.sf.saxon:Saxon-HE:jar:9.6.0-5 - http://www.saxonica.com/)
    (MPL 2.0) Rhino (org.mozilla:rhino:jar:1.7R5 - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Download_Rhino)

*****************
Mozilla Public License v1.1
*****************

The following binary components are provided under the Mozilla Public License v1.1.  See project link for details.

    (MPL 1.1) HAPI Base (ca.uhn.hapi:hapi-base:2.2 - http://hl7api.sourceforge.net/)
    (MPL 1.1) HAPI Structures (ca.uhn.hapi:hapi-structures-v*:2.2 - http://hl7api.sourceforge.net/)
    (MPL 1.1) Java port of universalchardet (com.googlecode.juniversalchardet:juniversalchardet:1.0.3 - https://code.google.com/archive/p/juniversalchardet/)

******************
Python Software Foundation License v2
******************

The following binary components are provided under the Python Software Foundation License v2

  (PSFLv2) Jython (org.python:jython-standalone:2.7.0 - http://www.jython.org/)

*****************
Public Domain
*****************

The following binary components are provided to the 'Public Domain'.  See project link for details.

    (Public Domain) XZ for Java (org.tukaani:xz:jar:1.5 - http://tukaani.org/xz/java.html
    (Public Domain) AOP Alliance 1.0 (http://aopalliance.sourceforge.net/)

The following binary components are provided under the Creative Commons Zero license version 1.0.  See project link for details.

    (CC0v1.0) JSR166e for Twitter (com.twitter:jsr166e:jar:1.1.0 - https://github.com/twitter/jsr166e)
    (CC0v1.0) Reactive Streams (org.reactivestreams:reactive-streams:jar:1.0.3 - http://www.reactive-streams.org/)

******************
SIL OFL 1.1
******************

The following binary components are provided under the SIL Open Font License 1.1
  (SIL OFL 1.1) FontAwesome (4.7.0 - https://fontawesome.com/license/free)
