// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for Apache Abdera2
// ------------------------------------------------------------------

Apache Abdera2
Copyright 2006-2011 Apache Software Foundation

This product includes/uses software(s) developed by 'an unknown organization'
  - ICU4J (http://icu-project.org/)

This product includes/uses software(s) developed by 'Apache Software Foundation' (http://www.apache.org/)
  - Abdera2 Common Library (http://abdera.apache.org)

This product includes/uses software(s) developed by 'Google, Inc.' (http://www.google.com)
  - Gson (http://code.google.com/p/google-gson/)

This product includes/uses software(s) developed by 'The Apache Software Foundation' (http://www.apache.org)
  - Activation 1.1 (http://geronimo.apache.org/maven/specs/geronimo-activation_1.1_spec/1.1)

This product includes/uses software(s) developed by 'The Apache Software Foundation' (http://www.apache.org/)
  - Commons Codec (http://commons.apache.org/codec/)
  - Commons Logging (http://commons.apache.org/logging)


