Apache Jena
Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Apache Software Foundation

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

This product includes software developed by
PluggedIn Software and under a BSD license.

Portions of this software were originally based on the following:
  - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP
  - Copyright 2010, 2011 Epimorphics Ltd.
  - Copyright 2010, 2011 Talis Systems Ltd.
These have been licensed to the Apache Software Foundation under a software grant.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

From Apache HttpComponents Client:

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

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

  Apache Xerces Java
   Copyright 1999-2013 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.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Simple Logging Facade for Java (SLF4J)
http://slf4j.org/

Copyright (c) 2004-2008 QOS.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Dexx Collections
Copyright (c) 2014 Andrew O'Malley
https://github.com/andrewoma/dexx
BSD-Style License
  https://github.com/andrewoma/dexx/blob/master/LICENSE.txt
  
and includes the following NOTICE
----------
Portions based on code from the Scala standard library.
Copyright (c) 2002-2014 EPFL
Copyright (c) 2011-2014 Typesafe, Inc.
Licensed under BSD-style license (see licenses/LICENSE_Scala.txt)
----------

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
