Apache Marmotta Webapp
Copyright 2012-2014 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:

    Copyright 2008-2012 Salzburg Research Forschungsgesellschaft mbH

These have been licensed to the Apache Software Foundation under a software grant.

This product also includes some third-party binary components:

 * H2 Database, Copyright (c) 2013 H2 Group, is licensed under the Eclipse Public 
   License (EPL) 1.0. The original software is available from http://www.h2database.com

 * Logback, Copyright (C) 2012 QOS.ch, is licensed under the Eclipse Public 
   License (EPL) 1.0. The original software is available from http://logback.qos.ch

 * Javassist, Copyright (c) 2013 Shigeru Chiba, is licensed under the Mozilla 
   Public License (MPL) 1.1. The original software is available from 
   http://www.jboss.org/javassist

 * Java Activation, Copyright (c) 2012 Oracle Corporation, is licensed under the
   Common Development and Distribution License (CDDL) v1.0. The original software 
   is available from http://www.oracle.com

 * Java Servlet API, Copyright (c) 2012 Oracle Corporation, is licensed under the
   Common Development and Distribution License (CDDL) v1.0. The original software 
   is available from http://www.oracle.com

 * Common Annotations (JSR-250), Copyright (c) 2012 Oracle Corporation, is licensed 
   under the Common Development and Distribution License (CDDL) v1.0. The original 
   software is available from http://www.oracle.com

 * Expression Language, Copyright (c) 2012 Oracle Corporation, is licensed under
   the Common Development and Distribution License (CDDL) v1.0. The original 
   software is available from http://www.oracle.com

 * Javolution, Copyright (c) 2012 Javolution, is licensed under BSD license. The
   original source code is available from http://javolution.org

 * Joda-Time, which includes software developed by Joda.org (http://www.joda.org/).
   The original source code is available from https://github.com/JodaOrg/joda-time
