Apache CouchDB
Copyright 2009 The Apache Software Foundation

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

This product also includes the following third-party components:

 * ac_check_icu.m4 (http://autoconf-archive.cryp.to/ac_check_icu.html)

   Copyright 2005, Akos Maroy <darkeye@tyrell.hu>

 * jQuery (http://jquery.com/)

   Copyright 2009, John Resig

 * json2.js (http://www.json.org/)

   In the public domain

 * MochiWeb (http://code.google.com/p/mochiweb/)

   Copyright 2007, Mochi Media Coporation

 * ibrowse
 (http://jungerl.cvs.sourceforge.net/viewvc/jungerl/jungerl/lib/ibrowse/)

   Copyright 2008, Chandrashekhar Mullaparthi
   This ASF redistribution is consistent with the terms of the BSD License.
