Apache CouchDB
Copyright 2009-2019 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:

* jQuery (http://jquery.org/)		
		
   Copyright 2012 jQuery Foundation and other contributors

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

   Public domain

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

   Copyright 2007, Mochi Media Coporation

 * ibrowse (http://github.com/cmullaparthi/ibrowse/tree/master)

   Copyright 2005-2012, Chandrashekhar Mullaparthi

 * mimeparse.js (http://code.google.com/p/mimeparse/)

   Copyright 2009, Chris Anderson <jchris@apache.org>

 * base64.js

   Copyright 1999, Masanao Izumo <iz@onicos.co.jp>

 * jspec.js (http://visionmedia.github.com/jspec/)

  Copyright 2010 TJ Holowaychuk <tj@vision-media.ca>

 * yajl (http://lloyd.github.com/yajl/)

  Copyright 2010, Lloyd Hilaiel

 * snappy (http://code.google.com/p/snappy/)

  Copyright 2005, Google Inc.

 * snappy-erlang-nif (https://github.com/fdmanana/snappy-erlang-nif)

  Copyright 2011, Filipe David Manana <fdmanana@apache.org>

 * CoffeeScript (http://coffeescript.org/)

  Copyright 2011, Jeremy Ashkenas

 * Sphinx (http://sphinx-doc.org/)
 
   Copyright 2011, the Sphinx team

 * Sizzle (http://sizzlejs.com/)
 
   Copyright 2010, The Dojo Foundation
 
 * Underscore.js 1.4.2 (http://underscorejs.org)

   Copyright 2012, Jeremy Ashkenas

 * backbone.js (http://backbonejs.org/)

  Copyright 2012, Jeremy Ashkenas, DocumentCloud Inc.

 * Bootstrap (http://twitter.github.com/bootstrap/)

  Copyright 2012, Twitter, Inc.

 * d3.js (http://d3js.org)

  Copyright 2012, Michael Bostock

 * Lodash (http://lodash.com/)

  Copyright 2012, John-David Dalton <http://allyoucanleet.com/>

 * nvd3.js (http://nvd3.org/)

  Copyright 2012, Novus Partners, Inc.

 * backbone.layoutmanager.js (https://github.com/tbranyen/backbone.layoutmanager)

  Copyright 2012, Tim Branyen (@tbranyen)

 * prettify.js (http://code.google.com/p/google-code-prettify/)

  Copyright 2011, Mike Samuel et al

 * PouchDB (https://github.com/daleharvey/pouchdb)

  Copyright 2012, Dale Harvey et al

 * require.js (https://github.com/jrburke/requirejs)

   Copyright (c) 2010-2011, The Dojo Foundation

 * mocha.js (https://github.com/visionmedia/mocha)
  
   Copyright (c) 2011-2013 TJ Holowaychuk <tj@vision-media.ca>

 * chaijs https://github.com/chaijs
   
   Copyright (c) 2011-2013 Jake Luer jake@alogicalparadox.com

 * sinon-chai

   Copyright © 2012–2013 Domenic Denicola <domenic@domenicdenicola.com>
 
 * spin.js

   Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de]
 
 * font-awesome http://fortawesome.github.io/Font-Awesome/

   Copyright (c) 2013 Dave Gandy

 * sandbox.js https://github.com/KlausTrainer/sandbox.js

   (c) 2013 Klaus Trainer

 * ace editor https://github.com/ajaxorg/ace

   Copyright (c) 2010, Ajax.org B.V.

 * src/fauxton/asserts/js/plugins/cloudant.pagingcollection.js

   Copyright (c) 2014, Cloudant http://cloudant.com

 * velocity.js (https://github.com/julianshapiro/velocity)

   Copyright (c) 2014 Julian Shapiro

* is_base_dir function in eunit_plugin.erl (https://github.com/ChicagoBoss/ChicagoBoss/blob/master/skel/priv/rebar/boss_plugin.erl)

   Copyright (c) 2009-2011 Evan Miller

* ?assertNotMatch in couch_eunit.hrl (https://github.com/richcarl/eunit/blob/master/include/eunit.hrl#L200-L219)

   Copyright (C) 2004-2006 Mickaël Rémond, Richard Carlsson

* src/fauxton/test/nightwatch_tests/custom-commands/waitForAttribute.js

   Copyright (c) 2014 Dave Koo

* moment.js

   Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, moment.js contributors

* React.js

  Copyright (c) 2013-2017, Facebook, Inc.

* Flux.js

  Copyright (c) 2014, Facebook, Inc. All rights reserved.

* es5-shim.js

  Copyright (C) 2009-2014 Kristopher Michael Kowal and contributors

* CSS.escape (https://github.com/mathiasbynens/CSS.escape/)

  Copyright Mathias Bynens

* Papaparse.js

  Copyright (c) 2015 Matthew Holt

* react-bootstrap.js

  Copyright (c) 2014 Stephen J. Collings, Matthew Honnibal, Pieter Vanderwerff

* velocity-react

  Copyright (c) 2015 Twitter, Inc.

* hyper

  Copyright (c) 2014 Game Analytics ApS
