Apache NiFi
Copyright 2014-2019 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 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

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

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

  (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) Dropwizard Metrics
    The following NOTICE information applies:
	Copyright (c) 2010-2013 Coda Hale, Yammer.com

  (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 4.x,5.x.RELEASE
      Copyright (c) 2002-2015 Pivotal, Inc.

  (ASLv2) Spring Security
    The following NOTICE information applies:
          Spring Framework 4.0.3.RELEASE
          Copyright (c) 2002-2015 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

  (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 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-2017 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) Yammer Metrics
    The following NOTICE information applies:
      Metrics
      Copyright 2010-2012 Coda Hale and Yammer, Inc.

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

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

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

  (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 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) 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) 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:jar:2.4.5 - http://www.groovy-lang.org)
      The following NOTICE information applies:
          Groovy Language
             Copyright 2003-2015 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) 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) Metrics
    The following NOTICE information applies:
      Metrics
      Copyright 2010-2012 Coda Hale and Yammer, Inc.

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

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

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

  (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

************************
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)


************************
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.8.5 - http://www.eclipse.org/aspectj/)
    (EPL 1.0) AspectJ Runtime (org.aspectj:aspectjrt:jar:1.8.0 - 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)

*****************
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)

******************
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)
