Apache Shindig
Copyright 2014 The Apache Software Foundation

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

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

This product includes software (Gadget Server, Gadget Container)
originally developed by Google Inc. (http://code.google.com/) and licensed
to the ASF as initial contribution for Shindig.

This product includes software (JSUnit) developed by
Joerg Schaible (http://jsunit.berlios.de/).

This product contains software (sha1 JS impl) developed by Google Inc.

This product includes software (wave) developed by Google, Inc
Copyright 2010 Google Inc.

This product includes software (OAuth2 Support) developed by IBM Corporation
Copyright 2011 IBM Corp.