aboutsummaryrefslogtreecommitdiff
path: root/node_modules/superagent
diff options
context:
space:
mode:
authorAlee14 <alee14498@gmail.com>2017-03-26 15:18:10 -0400
committerAlee14 <alee14498@gmail.com>2017-03-26 15:18:10 -0400
commit29433e2f7dbd0e4a73d3c78ffe1005b922fb5982 (patch)
treeaa0ad3fe59468cbe452ee597e914839b68c01436 /node_modules/superagent
parent878fefb4c4e1f12b804ae5c0def433fa873f4c8b (diff)
downloadAleeBot-29433e2f7dbd0e4a73d3c78ffe1005b922fb5982.tar.gz
AleeBot-29433e2f7dbd0e4a73d3c78ffe1005b922fb5982.tar.bz2
AleeBot-29433e2f7dbd0e4a73d3c78ffe1005b922fb5982.zip
Don't mind me i'm adding the discord.js files
Diffstat (limited to 'node_modules/superagent')
-rw-r--r--node_modules/superagent/.npmignore7
-rw-r--r--node_modules/superagent/.travis.yml16
-rw-r--r--node_modules/superagent/.zuul.yml14
-rw-r--r--node_modules/superagent/Contributing.md7
-rw-r--r--node_modules/superagent/History.md674
-rw-r--r--node_modules/superagent/LICENSE22
-rw-r--r--node_modules/superagent/Makefile57
-rw-r--r--node_modules/superagent/Readme.md124
-rw-r--r--node_modules/superagent/changelog.sh7
-rw-r--r--node_modules/superagent/docs/head.html10
-rw-r--r--node_modules/superagent/docs/images/bg.pngbin0 -> 8856 bytes
-rw-r--r--node_modules/superagent/docs/index.md612
-rw-r--r--node_modules/superagent/docs/style.css82
-rw-r--r--node_modules/superagent/docs/tail.html29
-rw-r--r--node_modules/superagent/docs/test.html2082
-rw-r--r--node_modules/superagent/lib/client.js933
-rw-r--r--node_modules/superagent/lib/is-function.js15
-rw-r--r--node_modules/superagent/lib/is-object.js13
-rw-r--r--node_modules/superagent/lib/node/agent.js90
-rw-r--r--node_modules/superagent/lib/node/index.js1053
-rw-r--r--node_modules/superagent/lib/node/parsers/image.js10
-rw-r--r--node_modules/superagent/lib/node/parsers/index.js8
-rw-r--r--node_modules/superagent/lib/node/parsers/json.js19
-rw-r--r--node_modules/superagent/lib/node/parsers/text.js7
-rw-r--r--node_modules/superagent/lib/node/parsers/urlencoded.js19
-rw-r--r--node_modules/superagent/lib/node/response.js123
-rw-r--r--node_modules/superagent/lib/node/unzip.js69
-rw-r--r--node_modules/superagent/lib/request-base.js591
-rw-r--r--node_modules/superagent/lib/response-base.js133
-rw-r--r--node_modules/superagent/lib/should-retry.js23
-rw-r--r--node_modules/superagent/lib/utils.js68
-rw-r--r--node_modules/superagent/package.json178
-rw-r--r--node_modules/superagent/superagent.js1956
-rw-r--r--node_modules/superagent/yarn.lock3658
34 files changed, 12709 insertions, 0 deletions
diff --git a/node_modules/superagent/.npmignore b/node_modules/superagent/.npmignore
new file mode 100644
index 0000000..c44fd57
--- /dev/null
+++ b/node_modules/superagent/.npmignore
@@ -0,0 +1,7 @@
+support
+test
+examples
+*.sock
+lib-cov
+coverage.html
+bower.json
diff --git a/node_modules/superagent/.travis.yml b/node_modules/superagent/.travis.yml
new file mode 100644
index 0000000..07c3dcf
--- /dev/null
+++ b/node_modules/superagent/.travis.yml
@@ -0,0 +1,16 @@
+sudo: false
+language: node_js
+node_js:
+ - "7.1"
+ - "6.9"
+ - "4.6"
+
+env:
+ global:
+ - SAUCE_USERNAME='shtylman-superagent'
+ - SAUCE_ACCESS_KEY='39a45464-cb1d-4b8d-aa1f-83c7c04fa673'
+
+matrix:
+ include:
+ - node_js: "4.6"
+ env: BROWSER=1
diff --git a/node_modules/superagent/.zuul.yml b/node_modules/superagent/.zuul.yml
new file mode 100644
index 0000000..7d5899c
--- /dev/null
+++ b/node_modules/superagent/.zuul.yml
@@ -0,0 +1,14 @@
+ui: mocha-bdd
+server: ./test/support/server.js
+tunnel_host: http://focusaurus.com
+browsers:
+ - name: chrome
+ version: latest
+ - name: firefox
+ version: latest
+ - name: safari
+ version: latest
+ - name: iphone
+ version: latest
+ - name: ie
+ version: 9..latest
diff --git a/node_modules/superagent/Contributing.md b/node_modules/superagent/Contributing.md
new file mode 100644
index 0000000..1eca592
--- /dev/null
+++ b/node_modules/superagent/Contributing.md
@@ -0,0 +1,7 @@
+When submitting a PR, your chance of acceptance increases if you do the following:
+
+* Code style is consistent with existing in the file.
+* Tests are passing (client and server).
+* You add a test for the failing issue you are fixing.
+* Code changes are focused on the area of discussion.
+* Do not rebuild the distribution files or increment version numbers.
diff --git a/node_modules/superagent/History.md b/node_modules/superagent/History.md
new file mode 100644
index 0000000..83b69a6
--- /dev/null
+++ b/node_modules/superagent/History.md
@@ -0,0 +1,674 @@
+# 3.5.1 (2017-03-18)
+
+ * Allow crossDomain errors to be retried (#1194) (Michael Olson)
+ * Read responseType property from the correct object (Julien Dupouy)
+ * Check for ownProperty before adding header (Lucas Vieira)
+
+# 3.5.0 (2017-02-23)
+
+ * Add errno to distinguish between request timeout and body download timeout (#1184) (Kornel Lesiński)
+ * Warn about bogus timeout options (#1185) (Kornel Lesiński)
+
+# 3.4.4 (2017-02-17)
+
+ * Treat videos like images (Kornel Lesiński)
+ * Avoid renaming module (Kornel Lesiński)
+
+# 3.4.3 (2017-02-14)
+
+ * Fixed being able to define own parsers when their mime type starts with `text/` (Damien Clark)
+ * `withCredentials(false)` (Andy Woods)
+ * Use `formData.on` instead of `.once` (Kornel Lesiński)
+ * Ignore `attach("file",null)` (Kornel Lesiński)
+
+# 3.4.1 (2017-01-29)
+
+ * Allow `retry()` and `retry(0)` (Alexander Pope)
+ * Allow optional body/data in DELETE requests (Alpha Shuro)
+ * Fixed query string on retried requests (Kornel Lesiński)
+
+# 3.4.0 (2017-01-25)
+
+ * New `.retry(n)` method and `err.retries` (Alexander Pope)
+ * Docs for HTTPS request (Jun Wan Goh)
+
+# 3.3.1 (2016-12-17)
+
+ * Fixed "double callback bug" warning on timeouts of gzipped responses
+
+# 3.3.0 (2016-12-14)
+
+ * Added `.ok(callback)` that allows customizing which responses are errors (Kornel Lesiński)
+ * Added `.responseType()` to Node version (Kornel Lesiński)
+ * Added `.parse()` to browser version (jakepearson)
+ * Fixed parse error when using `responseType('blob')` (Kornel Lesiński)
+
+# 3.2.0 (2016-12-11)
+
+ * Added `.timeout({response:ms})`, which allows limiting maximum response time independently from total download time (Kornel Lesiński)
+ * Added warnings when `.end()` is called more than once (Kornel Lesiński)
+ * Added `response.links` to browser version (Lukas Eipert)
+ * `btoa` is no longer required in IE9 (Kornel Lesiński)
+ * Fixed `.sortQuery()` on URLs without query strings (Kornel Lesiński)
+ * Refactored common response code into `ResponseBase` (Lukas Eipert)
+
+# 3.1.0 (2016-11-28)
+
+ * Added `.sortQuery()` (vicanso)
+ * Added support for arrays and bools in `.field()` (Kornel Lesiński)
+ * Made `superagent.Request` subclassable without need to patch all static methods (Kornel Lesiński)
+
+# 3.0.0 (2016-11-19)
+
+ * Dropped support for Node 0.x. Please upgrade to at least Node 4.
+ * Dropped support for componentjs (Damien Caselli)
+ * Removed deprecated `.part()`/`superagent.Part` APIs.
+ * Removed unreliable `.body` property on internal response object used by unbuffered parsers.
+ Note: the normal `response.body` is unaffected.
+ * Multiple `.send()` calls mixing `Buffer`/`Blob` and JSON data are not possible and will now throw instead of messing up the data.
+ * Improved `.send()` data object type check (Fernando Mendes)
+ * Added common prototype for Node and browser versions (Andreas Helmberger)
+ * Added `http+unix:` schema to support Unix sockets (Yuki KAN)
+ * Added full `attach` options parameter in the Node version (Lapo Luchini)
+ * Added `pfx` TLS option with new `pfx()` method. (Reid Burke)
+ * Internally changed `.on` to `.once` to prevent possible memory leaks (Matt Blair)
+ * Made all errors reported as an event (Kornel Lesiński)
+
+# 2.3.0 (2016-09-20)
+
+ * Enabled `.field()` to handle objects (Affan Shahid)
+ * Added authentication with client certificates (terusus)
+ * Added `.catch()` for more Promise-like interface (Maxim Samoilov, Kornel Lesiński)
+ * Silenced errors from incomplete gzip streams for compatibility with web browsers (Kornel Lesiński)
+ * Fixed `event.direction` in uploads (Kornel Lesiński)
+ * Fixed returned value of overwritten response object's `on()` method (Juan Dopazo)
+
+# 2.2.0 (2016-08-13)
+
+ * Added `timedout` property to node Request instance (Alexander Pope)
+ * Unified `null` querystring values in node and browser environments. (George Chung)
+
+# 2.1.0 (2016-06-14)
+
+ * Refactored async parsers. Now the `end` callback waits for async parsers to finish (Kornel Lesiński)
+ * Errors thrown in `.end()` callback don't cause the callback to be called twice (Kornel Lesiński)
+ * Added `headers` to `toJSON()` (Tao)
+
+# 2.0.0 (2016-05-29)
+
+## Breaking changes
+
+Breaking changes are in rarely used functionality, so we hope upgrade will be smooth for most users.
+
+ * Browser: The `.parse()` method has been renamed to `.serialize()` for consistency with NodeJS version.
+ * Browser: Query string keys without a value used to be parsed as `'undefined'`, now their value is `''` (empty string) (shura, Kornel Lesiński).
+ * NodeJS: The `redirect` event is called after new query string and headers have been set and is allowed to override the request URL (Kornel Lesiński)
+ * `.then()` returns a real `Promise`. Note that use of superagent with promises now requires a global `Promise` object.
+ If you target Internet Explorer or Node 0.10, you'll need `require('es6-promise').polyfill()` or similar.
+ * Upgraded all dependencies (Peter Lyons)
+ * Renamed properties documented as `@api private` to have `_prefixed` names (Kornel Lesiński)
+
+## Probably not breaking changes:
+
+ * Extracted common functions to request-base (Peter Lyons)
+ * Fixed race condition in pipe tests (Peter Lyons)
+ * Handle `FormData` error events (scriptype)
+ * Fixed wrong jsdoc of Request#attach (George Chung)
+ * Updated and improved tests (Peter Lyons)
+ * `request.head()` supports `.redirects(5)` call (Kornel Lesiński)
+ * `response` event is also emitted when using `.pipe()`
+
+# 1.8.2 (2016-03-20)
+
+ * Fixed handling of HTTP status 204 with content-encoding: gzip (Andrew Shelton)
+ * Handling of FormData error events (scriptype)
+ * Fixed parsing of `vnd+json` MIME types (Kornel Lesiński)
+ * Aliased browser implementation of `.parse()` as `.serialize()` for forward compatibility
+
+# 1.8.1 (2016-03-14)
+
+ * Fixed form-data incompatibility with IE9
+
+# 1.8.0 (2016-03-09)
+
+ * Extracted common code into request-base class (Peter Lyons)
+ * It does not affect the public API, but please let us know if you notice any plugins/subclasses breaking!
+ * Added option `{type:'auto'}` to `auth` method, which enables browser-native auth types (Jungle, Askar Yusupov)
+ * Added `responseType()` to set XHR `responseType` (chris)
+ * Switched to form-data for browserify-compatible `FormData` (Peter Lyons)
+ * Added `statusCode` to error response when JSON response is malformed (mattdell)
+ * Prevented TCP port conflicts in all tests (Peter Lyons)
+ * Updated form-data dependency
+
+# 1.7.2 (2016-01-26)
+
+ * Fix case-sensitivity of header fields introduced by a4ddd6a. (Edward J. Jinotti)
+ * bump extend dependency, as former version did not contain any license information (Lukas Eipert)
+
+# 1.7.1 (2016-01-21)
+
+ * Fixed a conflict with express when using npm 3.x (Glenn)
+ * Fixed redirects after a multipart/form-data POST request (cyclist2)
+
+# 1.7.0 (2016-01-18)
+
+ * When attaching files, read default filename from the `File` object (JD Isaacks)
+ * Add `direction` property to `progress` events (Joseph Dykstra)
+ * Update component-emitter & formidable (Kornel Lesiński)
+ * Don't re-encode query string needlessly (Ruben Verborgh)
+ * ensure querystring is appended when doing `stream.pipe(request)` (Keith Grennan)
+ * change set header function, not call `this.request()` until call `this.end()` (vicanso)
+ * Add no-op `withCredentials` to Node API (markdalgleish)
+ * fix `delete` breaking on ie8 (kenjiokabe)
+ * Don't let request error override responses (Clay Reimann)
+ * Increased number of tests shared between node and client (Kornel Lesiński)
+
+# 1.6.0/1.6.1 (2015-12-09)
+
+ * avoid misleading CORS error message
+ * added 'progress' event on file/form upload in Node (Olivier Lalonde)
+ * return raw response if the response parsing fails (Rei Colina)
+ * parse content-types ending with `+json` as JSON (Eiryyy)
+ * fix to avoid throwing errors on aborted requests (gjurgens)
+ * retain cookies on redirect when hosts match (Tom Conroy)
+ * added Bower manifest (Johnny Freeman)
+ * upgrade to latest cookiejar (Andy Burke)
+
+# 1.5.0 (2015-11-30)
+
+ * encode array values as `key=1&key=2&key=3` etc... (aalpern, Davis Kim)
+ * avoid the error which is omitted from 'socket hang up'
+ * faster JSON parsing, handling of zlib errors (jbellenger)
+ * fix IE11 sends 'undefined' string if data was undefined (Vadim Goncharov)
+ * alias `del()` method as `delete()` (Aaron Krause)
+ * revert Request#parse since it was actually Response#parse
+
+# 1.4.0 (2015-09-14)
+
+ * add Request#parse method to client library
+ * add missing statusCode in client response
+ * don't apply JSON heuristics if a valid parser is found
+ * fix detection of root object for webworkers
+
+# 1.3.0 (2015-08-05)
+
+ * fix incorrect content-length of data set to buffer
+ * serialize request data takes into account charsets
+ * add basic promise support via a `then` function
+
+# 1.2.0 (2015-04-13)
+
+ * add progress events to downlodas
+ * make usable in webworkers
+ * add support for 308 redirects
+ * update node-form-data dependency
+ * update to work in react native
+ * update node-mime dependency
+
+# 1.1.0 (2015-03-13)
+
+ * Fix responseType checks without xhr2 and ie9 tests (rase-)
+ * errors have .status and .response fields if applicable (defunctzombie)
+ * fix end callback called before saving cookies (rase-)
+
+1.0.0 / 2015-03-08
+==================
+
+ * All non-200 responses are treated as errors now. (The callback is called with an error when the response has a status < 200 or >= 300 now. In previous versions this would not have raised an error and the client would have to check the `res` object. See [#283](https://github.com/visionmedia/superagent/issues/283).
+ * keep timeouts intact across redirects (hopkinsth)
+ * handle falsy json values (themaarten)
+ * fire response events in browser version (Schoonology)
+ * getXHR exported in client version (KidsKilla)
+ * remove arity check on `.end()` callbacks (defunctzombie)
+ * avoid setting content-type for host objects (rexxars)
+ * don't index array strings in querystring (travisjeffery)
+ * fix pipe() with redirects (cyrilis)
+ * add xhr2 file download (vstirbu)
+ * set default response type to text/plain if not specified (warrenseine)
+
+0.21.0 / 2014-11-11
+==================
+
+ * Trim text before parsing json (gjohnson)
+ * Update tests to express 4 (gaastonsr)
+ * Prevent double callback when error is thrown (pgn-vole)
+ * Fix missing clearTimeout (nickdima)
+ * Update debug (TooTallNate)
+
+0.20.0 / 2014-10-02
+==================
+
+ * Add toJSON() to request and response instances. (yields)
+ * Prevent HEAD requests from getting parsed. (gjohnson)
+ * Update debug. (TooTallNate)
+
+0.19.1 / 2014-09-24
+==================
+
+ * Fix basic auth issue when password is falsey value. (gjohnson)
+
+0.19.0 / 2014-09-24
+==================
+
+ * Add unset() to browser. (shesek)
+ * Prefer XHR over ActiveX. (omeid)
+ * Catch parse errors. (jacwright)
+ * Update qs dependency. (wercker)
+ * Add use() to node. (Financial-Times)
+ * Add response text to errors. (yields)
+ * Don't send empty cookie headers. (undoZen)
+ * Don't parse empty response bodies. (DveMac)
+ * Use hostname when setting cookie host. (prasunsultania)
+
+0.18.2 / 2014-07-12
+==================
+
+ * Handle parser errors. (kof)
+ * Ensure not to use default parsers when there is a user defined one. (kof)
+
+0.18.1 / 2014-07-05
+==================
+
+ * Upgrade cookiejar dependency (juanpin)
+ * Support image mime types (nebulade)
+ * Make .agent chainable (kof)
+ * Upgrade debug (TooTallNate)
+ * Fix docs (aheckmann)
+
+0.18.0 / 2014-04-29
+===================
+
+* Use "form-data" module for the multipart/form-data implementation. (TooTallNate)
+* Add basic `field()` and `attach()` functions for HTML5 FormData. (TooTallNate)
+* Deprecate `part()`. (TooTallNate)
+* Set default user-agent header. (bevacqua)
+* Add `unset()` method for removing headers. (bevacqua)
+* Update cookiejar. (missinglink)
+* Fix response error formatting. (shesek)
+
+0.17.0 / 2014-03-06
+===================
+
+ * supply uri malformed error to the callback (yields)
+ * add request event (yields)
+ * allow simple auth (yields)
+ * add request event (yields)
+ * switch to component/reduce (visionmedia)
+ * fix part content-disposition (mscdex)
+ * add browser testing via zuul (defunctzombie)
+ * adds request.use() (johntron)
+
+0.16.0 / 2014-01-07
+==================
+
+ * remove support for 0.6 (superjoe30)
+ * fix CORS withCredentials (wejendorp)
+ * add "test" script (superjoe30)
+ * add request .accept() method (nickl-)
+ * add xml to mime types mappings (nickl-)
+ * fix parse body error on HEAD requests (gjohnson)
+ * fix documentation typos (matteofigus)
+ * fix content-type + charset (bengourley)
+ * fix null values on query parameters (cristiandouce)
+
+0.15.7 / 2013-10-19
+==================
+
+ * pin should.js to 1.3.0 due to breaking change in 2.0.x
+ * fix browserify regression
+
+0.15.5 / 2013-10-09
+==================
+
+ * add browser field to support browserify
+ * fix .field() value number support
+
+0.15.4 / 2013-07-09
+==================
+
+ * node: add a Request#agent() function to set the http Agent to use
+
+0.15.3 / 2013-07-05
+==================
+
+ * fix .pipe() unzipping on more recent nodes. Closes #240
+ * fix passing an empty object to .query() no longer appends "?"
+ * fix formidable error handling
+ * update formidable
+
+0.15.2 / 2013-07-02
+==================
+
+ * fix: emit 'end' when piping.
+
+0.15.1 / 2013-06-26
+==================
+
+ * add try/catch around parseLinks
+
+0.15.0 / 2013-06-25
+==================
+
+ * make `Response#toError()` have a more meaningful `message`
+
+0.14.9 / 2013-06-15
+==================
+
+ * add debug()s to the node client
+ * add .abort() method to node client
+
+0.14.8 / 2013-06-13
+==================
+
+ * set .agent = false always
+ * remove X-Requested-With. Closes #189
+
+0.14.7 / 2013-06-06
+==================
+
+ * fix unzip error handling
+
+0.14.6 / 2013-05-23
+==================
+
+ * fix HEAD unzip bug
+
+0.14.5 / 2013-05-23
+==================
+
+ * add flag to ensure the callback is __never__ invoked twice
+
+0.14.4 / 2013-05-22
+==================
+
+ * add superagent.js build output
+ * update qs
+ * update emitter-component
+ * revert "add browser field to support browserify" see GH-221
+
+0.14.3 / 2013-05-18
+==================
+
+ * add browser field to support browserify
+
+0.14.2/ 2013-05-07
+==================
+
+ * add host object check to fix serialization of File/Blobs etc as json
+
+0.14.1 / 2013-04-09
+==================
+
+ * update qs
+
+0.14.0 / 2013-04-02
+==================
+
+ * add client-side basic auth
+ * fix retaining of .set() header field case
+
+0.13.0 / 2013-03-13
+==================
+
+ * add progress events to client
+ * add simple example
+ * add res.headers as alias of res.header for browser client
+ * add res.get(field) to node/client
+
+0.12.4 / 2013-02-11
+==================
+
+ * fix get content-type even if can't get other headers in firefox. fixes #181
+
+0.12.3 / 2013-02-11
+==================
+
+ * add quick "progress" event support
+
+0.12.2 / 2013-02-04
+==================
+
+ * add test to check if response acts as a readable stream
+ * add ReadableStream in the Response prototype.
+ * add test to assert correct redirection when the host changes in the location header.
+ * add default Accept-Encoding. Closes #155
+ * fix req.pipe() return value of original stream for node parity. Closes #171
+ * remove the host header when cleaning headers to properly follow the redirection.
+
+0.12.1 / 2013-01-10
+==================
+
+ * add x-domain error handling
+
+0.12.0 / 2013-01-04
+==================
+
+ * add header persistence on redirects
+
+0.11.0 / 2013-01-02
+==================
+
+ * add .error Error object. Closes #156
+ * add forcing of res.text removal for FF HEAD responses. Closes #162
+ * add reduce component usage. Closes #90
+ * move better-assert dep to development deps
+
+0.10.0 / 2012-11-14
+==================
+
+ * add req.timeout(ms) support for the client
+
+0.9.10 / 2012-11-14
+==================
+
+ * fix client-side .query(str) support
+
+0.9.9 / 2012-11-14
+==================
+
+ * add .parse(fn) support
+ * fix socket hangup with dates in querystring. Closes #146
+ * fix socket hangup "error" event when a callback of arity 2 is provided
+
+0.9.8 / 2012-11-03
+==================
+
+ * add emission of error from `Request#callback()`
+ * add a better fix for nodes weird socket hang up error
+ * add PUT/POST/PATCH data support to client short-hand functions
+ * add .license property to component.json
+ * change client portion to build using component(1)
+ * fix GET body support [guille]
+
+0.9.7 / 2012-10-19
+==================
+
+ * fix `.buffer()` `res.text` when no parser matches
+
+0.9.6 / 2012-10-17
+==================
+
+ * change: use `this` when `window` is undefined
+ * update to new component spec [juliangruber]
+ * fix emission of "data" events for compressed responses without encoding. Closes #125
+
+0.9.5 / 2012-10-01
+==================
+
+ * add field name to .attach()
+ * add text "parser"
+ * refactor isObject()
+ * remove wtf isFunction() helper
+
+0.9.4 / 2012-09-20
+==================
+
+ * fix `Buffer` responses [TooTallNate]
+ * fix `res.type` when a "type" param is present [TooTallNate]
+
+0.9.3 / 2012-09-18
+==================
+
+ * remove __GET__ `.send()` == `.query()` special-case (__API__ change !!!)
+
+0.9.2 / 2012-09-17
+==================
+
+ * add `.aborted` prop
+ * add `.abort()`. Closes #115
+
+0.9.1 / 2012-09-07
+==================
+
+ * add `.forbidden` response property
+ * add component.json
+ * change emitter-component to 0.0.5
+ * fix client-side tests
+
+0.9.0 / 2012-08-28
+==================
+
+ * add `.timeout(ms)`. Closes #17
+
+0.8.2 / 2012-08-28
+==================
+
+ * fix pathname relative redirects. Closes #112
+
+0.8.1 / 2012-08-21
+==================
+
+ * fix redirects when schema is specified
+
+0.8.0 / 2012-08-19
+==================
+
+ * add `res.buffered` flag
+ * add buffering of text/*, json and forms only by default. Closes #61
+ * add `.buffer(false)` cancellation
+ * add cookie jar support [hunterloftis]
+ * add agent functionality [hunterloftis]
+
+0.7.0 / 2012-08-03
+==================
+
+ * allow `query()` to be called after the internal `req` has been created [tootallnate]
+
+0.6.0 / 2012-07-17
+==================
+
+ * add `res.send('foo=bar')` default of "application/x-www-form-urlencoded"
+
+0.5.1 / 2012-07-16
+==================
+
+ * add "methods" dep
+ * add `.end()` arity check to node callbacks
+ * fix unzip support due to weird node internals
+
+0.5.0 / 2012-06-16
+==================
+
+ * Added "Link" response header field parsing, exposing `res.links`
+
+0.4.3 / 2012-06-15
+==================
+
+ * Added 303, 305 and 307 as redirect status codes [slaskis]
+ * Fixed passing an object as the url
+
+0.4.2 / 2012-06-02
+==================
+
+ * Added component support
+ * Fixed redirect data
+
+0.4.1 / 2012-04-13
+==================
+
+ * Added HTTP PATCH support
+ * Fixed: GET / HEAD when following redirects. Closes #86
+ * Fixed Content-Length detection for multibyte chars
+
+0.4.0 / 2012-03-04
+==================
+
+ * Added `.head()` method [browser]. Closes #78
+ * Added `make test-cov` support
+ * Added multipart request support. Closes #11
+ * Added all methods that node supports. Closes #71
+ * Added "response" event providing a Response object. Closes #28
+ * Added `.query(obj)`. Closes #59
+ * Added `res.type` (browser). Closes #54
+ * Changed: default `res.body` and `res.files` to {}
+ * Fixed: port existing query-string fix (browser). Closes #57
+
+0.3.0 / 2012-01-24
+==================
+
+ * Added deflate/gzip support [guillermo]
+ * Added `res.type` (Content-Type void of params)
+ * Added `res.statusCode` to mirror node
+ * Added `res.headers` to mirror node
+ * Changed: parsers take callbacks
+ * Fixed optional schema support. Closes #49
+
+0.2.0 / 2012-01-05
+==================
+
+ * Added url auth support
+ * Added `.auth(username, password)`
+ * Added basic auth support [node]. Closes #41
+ * Added `make test-docs`
+ * Added guillermo's EventEmitter. Closes #16
+ * Removed `Request#data()` for SS, renamed to `send()`
+ * Removed `Request#data()` from client, renamed to `send()`
+ * Fixed array support. [browser]
+ * Fixed array support. Closes #35 [node]
+ * Fixed `EventEmitter#emit()`
+
+0.1.3 / 2011-10-25
+==================
+
+ * Added error to callback
+ * Bumped node dep for 0.5.x
+
+0.1.2 / 2011-09-24
+==================
+
+ * Added markdown documentation
+ * Added `request(url[, fn])` support to the client
+ * Added `qs` dependency to package.json
+ * Added options for `Request#pipe()`
+ * Added support for `request(url, callback)`
+ * Added `request(url)` as shortcut for `request.get(url)`
+ * Added `Request#pipe(stream)`
+ * Added inherit from `Stream`
+ * Added multipart support
+ * Added ssl support (node)
+ * Removed Content-Length field from client
+ * Fixed buffering, `setEncoding()` to utf8 [reported by stagas]
+ * Fixed "end" event when piping
+
+0.1.1 / 2011-08-20
+==================
+
+ * Added `res.redirect` flag (node)
+ * Added redirect support (node)
+ * Added `Request#redirects(n)` (node)
+ * Added `.set(object)` header field support
+ * Fixed `Content-Length` support
+
+0.1.0 / 2011-08-09
+==================
+
+ * Added support for multiple calls to `.data()`
+ * Added support for `.get(uri, obj)`
+ * Added GET `.data()` querystring support
+ * Added IE{6,7,8} support [alexyoung]
+
+0.0.1 / 2011-08-05
+==================
+
+ * Initial commit
+
diff --git a/node_modules/superagent/LICENSE b/node_modules/superagent/LICENSE
new file mode 100644
index 0000000..1b188ba
--- /dev/null
+++ b/node_modules/superagent/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/superagent/Makefile b/node_modules/superagent/Makefile
new file mode 100644
index 0000000..31f3ef3
--- /dev/null
+++ b/node_modules/superagent/Makefile
@@ -0,0 +1,57 @@
+
+NODETESTS ?= test/*.js test/node/*.js
+BROWSERTESTS ?= test/*.js test/client/*.js
+REPORTER = spec
+
+all: superagent.js
+
+test:
+ @if [ "x$(BROWSER)" = "x" ]; then make test-node; else make test-browser; fi
+
+test-node:
+ @NODE_ENV=test NODE_TLS_REJECT_UNAUTHORIZED=0 ./node_modules/.bin/mocha \
+ --require should \
+ --reporter $(REPORTER) \
+ --timeout 5000 \
+ --growl \
+ $(NODETESTS)
+
+test-cov: lib-cov
+ SUPERAGENT_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html
+
+test-browser:
+ SAUCE_APPIUM_VERSION=1.6 ./node_modules/.bin/zuul -- $(BROWSERTESTS)
+
+test-browser-local:
+ ./node_modules/.bin/zuul --no-coverage --local 4000 -- $(BROWSERTESTS)
+
+lib-cov:
+ jscoverage lib lib-cov
+
+superagent.js: lib/node/*.js lib/node/parsers/*.js
+ @./node_modules/.bin/browserify \
+ --standalone superagent \
+ --outfile superagent.js .
+
+test-server:
+ @node test/server
+
+docs: index.html test-docs docs/index.md
+
+index.html: docs/index.md docs/head.html docs/tail.html
+ marked < $< \
+ | cat docs/head.html - docs/tail.html \
+ > $@
+
+docclean:
+ rm -f index.html test.html
+
+test-docs: docs/head.html docs/tail.html
+ make test REPORTER=doc \
+ | cat docs/head.html - docs/tail.html \
+ > test.html
+
+clean:
+ rm -fr superagent.js components
+
+.PHONY: test-cov test docs test-docs clean test-browser-local
diff --git a/node_modules/superagent/Readme.md b/node_modules/superagent/Readme.md
new file mode 100644
index 0000000..b6516c2
--- /dev/null
+++ b/node_modules/superagent/Readme.md
@@ -0,0 +1,124 @@
+# SuperAgent [![Build Status](https://travis-ci.org/visionmedia/superagent.svg?branch=master)](https://travis-ci.org/visionmedia/superagent)
+
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/shtylman-superagent.svg)](https://saucelabs.com/u/shtylman-superagent)
+
+SuperAgent is a small progressive __client-side__ HTTP request library, and __Node.js__ module with the same API, sporting many high-level HTTP client features. View the [docs](http://visionmedia.github.io/superagent/).
+
+![super agent](http://f.cl.ly/items/3d282n3A0h0Z0K2w0q2a/Screenshot.png)
+
+## Installation
+
+node:
+
+```
+$ npm install superagent
+```
+
+Works with [browserify](https://github.com/substack/node-browserify) and should work with [webpack](https://github.com/visionmedia/superagent/wiki/SuperAgent-for-Webpack)
+
+```js
+request
+ .post('/api/pet')
+ .send({ name: 'Manny', species: 'cat' })
+ .set('X-API-Key', 'foobar')
+ .set('Accept', 'application/json')
+ .end(function(err, res){
+ // Calling the end function will send the request
+ });
+```
+
+## Supported browsers and Node versions
+
+Tested browsers:
+
+- Latest Firefox, Chrome, Safari
+- Latest Android, iPhone
+- IE10 through latest. IE9 with polyfills.
+
+Even though IE9 is supported, a polyfill for `window.FormData` is required for `.field()`.
+
+Node 4 or later is required.
+
+# Plugins
+
+SuperAgent is easily extended via plugins.
+
+```js
+var nocache = require('superagent-no-cache');
+var request = require('superagent');
+var prefix = require('superagent-prefix')('/static');
+
+request
+ .get('/some-url')
+ .query({ action: 'edit', city: 'London' }) // query string
+ .use(prefix) // Prefixes *only* this request
+ .use(nocache) // Prevents caching of *only* this request
+ .end(function(err, res){
+ // Do something
+ });
+```
+
+Existing plugins:
+ * [superagent-no-cache](https://github.com/johntron/superagent-no-cache) - prevents caching by including Cache-Control header
+ * [superagent-prefix](https://github.com/johntron/superagent-prefix) - prefixes absolute URLs (useful in test environment)
+ * [superagent-suffix](https://github.com/timneutkens1/superagent-suffix) - suffix URLs with a given path
+ * [superagent-mock](https://github.com/M6Web/superagent-mock) - simulate HTTP calls by returning data fixtures based on the requested URL
+ * [superagent-mocker](https://github.com/shuvalov-anton/superagent-mocker) — simulate REST API
+ * [superagent-cache](https://github.com/jpodwys/superagent-cache) - A global SuperAgent patch with built-in, flexible caching (compatible with SuperAgent `1.x`)
+ * [superagent-cache-plugin](https://github.com/jpodwys/superagent-cache-plugin) - A SuperAgent plugin with built-in, flexible caching (compatible with SuperAgent `1.x`)
+ * [superagent-jsonapify](https://github.com/alex94puchades/superagent-jsonapify) - A lightweight [json-api](http://jsonapi.org/format/) client addon for superagent
+ * [superagent-serializer](https://github.com/zzarcon/superagent-serializer) - Converts server payload into different cases
+ * [superagent-use](https://github.com/koenpunt/superagent-use) - A client addon to apply plugins to all requests.
+ * [superagent-httpbackend](https://www.npmjs.com/package/superagent-httpbackend) - stub out requests using AngularJS' $httpBackend syntax
+ * [superagent-throttle](https://github.com/leviwheatcroft/superagent-throttle) - queues and intelligently throttles requests
+ * [superagent-charset](https://github.com/magicdawn/superagent-charset) - add charset support for node's SuperAgent
+
+Please prefix your plugin with `superagent-*` so that it can easily be found by others.
+
+For SuperAgent extensions such as couchdb and oauth visit the [wiki](https://github.com/visionmedia/superagent/wiki).
+
+## Running node tests
+
+Install dependencies:
+
+```shell
+$ npm install
+```
+Run em!
+
+```shell
+$ make test
+```
+
+## Running browser tests
+
+Install dependencies:
+
+```shell
+$ npm install
+```
+
+Start the test runner:
+
+```shell
+$ make test-browser-local
+```
+
+Visit `http://localhost:4000/__zuul` in your browser.
+
+Edit tests and refresh your browser. You do not have to restart the test runner.
+
+
+## Packaging Notes for Developers
+
+**npm (for node)** is configured via the `package.json` file and the `.npmignore` file. Key metadata in the `package.json` file is the `version` field which should be changed according to semantic versioning and have a 1-1 correspondence with git tags. So for example, if you were to `git show v1.5.0:package.json | grep version`, you should see `"version": "1.5.0",` and this should hold true for every release. This can be handled via the `npm version` command. Be aware that when publishing, npm will presume the version being published should also be tagged in npm as `latest`, which is OK for normal incremental releases. For betas and minor/patch releases to older versions, be sure to include `--tag` appropriately to avoid an older release getting tagged as `latest`.
+
+**npm (for browser standalone)** When we publish versions to npm, we run `make superagent.js` which generates the standalone `superagent.js` file via `browserify`, and this file is included in the package published to npm (but this file is never checked into the git repository). If users want to install via npm but serve a single `.js` file directly to the browser, the `node_modules/superagent/superagent.js` is a standalone browserified file ready to go for that purpose. It is not minified.
+
+**npm (for browserify)** is handled via the `package.json` `browser` field which allows users to install SuperAgent via npm, reference it from their browser code with `require('superagent')`, and then build their own application bundle via `browserify`, which will use `lib/client.js` as the SuperAgent entrypoint.
+
+**bower** is configured via the `bower.json` file. Bower installs files directly from git/github without any transformation, so you *must* use Browserify or Webpack (or use npm).
+
+## License
+
+MIT
diff --git a/node_modules/superagent/changelog.sh b/node_modules/superagent/changelog.sh
new file mode 100644
index 0000000..82e2d6f
--- /dev/null
+++ b/node_modules/superagent/changelog.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+VER=$(git tag -l v[0-9].[0-9]*.[0-9]* | tail -n 1)
+echo "# ($(date +%Y-%m-%d))"
+echo
+git log $VER...HEAD --no-merges --topo-order --format=' * %s (%an)'
+echo
+echo "# $VER"
diff --git a/node_modules/superagent/docs/head.html b/node_modules/superagent/docs/head.html
new file mode 100644
index 0000000..b4479e9
--- /dev/null
+++ b/node_modules/superagent/docs/head.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf8">
+ <title>SuperAgent — elegant API for AJAX in Node and browsers</title>
+ <link rel="stylesheet" href="docs/style.css">
+ </head>
+ <body>
+ <ul id="menu"></ul>
+ <div id="content">
diff --git a/node_modules/superagent/docs/images/bg.png b/node_modules/superagent/docs/images/bg.png
new file mode 100644
index 0000000..ca3d267
--- /dev/null
+++ b/node_modules/superagent/docs/images/bg.png
Binary files differ
diff --git a/node_modules/superagent/docs/index.md b/node_modules/superagent/docs/index.md
new file mode 100644
index 0000000..3e14633
--- /dev/null
+++ b/node_modules/superagent/docs/index.md
@@ -0,0 +1,612 @@
+
+# SuperAgent
+
+ SuperAgent is light-weight progressive ajax API crafted for flexibility, readability, and a low learning curve after being frustrated with many of the existing request APIs. It also works with Node.js!
+
+ request
+ .post('/api/pet')
+ .send({ name: 'Manny', species: 'cat' })
+ .set('X-API-Key', 'foobar')
+ .set('Accept', 'application/json')
+ .end(function(err, res){
+ if (err || !res.ok) {
+ alert('Oh no! error');
+ } else {
+ alert('yay got ' + JSON.stringify(res.body));
+ }
+ });
+
+## Test documentation
+
+ The following [test documentation](docs/test.html) was generated with [Mocha's](http://mochajs.org/) "doc" reporter, and directly reflects the test suite. This provides an additional source of documentation.
+
+## Request basics
+
+ A request can be initiated by invoking the appropriate method on the `request` object, then calling `.end()` to send the request. For example a simple __GET__ request:
+
+ request
+ .get('/search')
+ .end(function(err, res){
+
+ });
+
+ A method string may also be passed:
+
+ request('GET', '/search').end(callback);
+
+ES6 promises are supported. *Instead* of `.end()` you can call `.then()`:
+
+ request('GET', '/search').then(success, failure);
+
+ The __Node__ client may also provide absolute URLs. In browsers absolute URLs won't work unless the server implements [CORS](#cors).
+
+ request
+ .get('http://example.com/search')
+ .end(function(err, res){
+
+ });
+
+ The __Node__ client supports making requests to [Unix Domain Sockets](http://en.wikipedia.org/wiki/Unix_domain_socket):
+
+ // pattern: https?+unix://SOCKET_PATH/REQUEST_PATH
+ // Use `%2F` as `/` in SOCKET_PATH
+ request
+ .get('http+unix://%2Fabsolute%2Fpath%2Fto%2Funix.sock/search')
+ .end(function(err, res){
+
+ });
+
+ __DELETE__, __HEAD__, __PATCH__, __POST__, and __PUT__ requests can also be used, simply change the method name:
+
+ request
+ .head('/favicon.ico')
+ .end(function(err, res){
+
+ });
+
+ __DELETE__ can be also called as `.del()` for compatibility with old IE where `delete` is a reserved word.
+
+ The HTTP method defaults to __GET__, so if you wish, the following is valid:
+
+ request('/search', function(err, res){
+
+ });
+
+## Setting header fields
+
+ Setting header fields is simple, invoke `.set()` with a field name and value:
+
+ request
+ .get('/search')
+ .set('API-Key', 'foobar')
+ .set('Accept', 'application/json')
+ .end(callback);
+
+ You may also pass an object to set several fields in a single call:
+
+ request
+ .get('/search')
+ .set({ 'API-Key': 'foobar', Accept: 'application/json' })
+ .end(callback);
+
+## `GET` requests
+
+ The `.query()` method accepts objects, which when used with the __GET__ method will form a query-string. The following will produce the path `/search?query=Manny&range=1..5&order=desc`.
+
+ request
+ .get('/search')
+ .query({ query: 'Manny' })
+ .query({ range: '1..5' })
+ .query({ order: 'desc' })
+ .end(function(err, res){
+
+ });
+
+ Or as a single object:
+
+ request
+ .get('/search')
+ .query({ query: 'Manny', range: '1..5', order: 'desc' })
+ .end(function(err, res){
+
+ });
+
+ The `.query()` method accepts strings as well:
+
+ request
+ .get('/querystring')
+ .query('search=Manny&range=1..5')
+ .end(function(err, res){
+
+ });
+
+ Or joined:
+
+ request
+ .get('/querystring')
+ .query('search=Manny')
+ .query('range=1..5')
+ .end(function(err, res){
+
+ });
+
+## `HEAD` requests
+
+You can also use the `.query()` method for HEAD requests. The following will produce the path `/users?email=joe@smith.com`.
+
+ request
+ .head('/users')
+ .query({ email: 'joe@smith.com' })
+ .end(function(err, res){
+
+ });
+
+## `POST` / `PUT` requests
+
+ A typical JSON __POST__ request might look a little like the following, where we set the Content-Type header field appropriately, and "write" some data, in this case just a JSON string.
+
+ request.post('/user')
+ .set('Content-Type', 'application/json')
+ .send('{"name":"tj","pet":"tobi"}')
+ .end(callback)
+
+ Since JSON is undoubtably the most common, it's the _default_! The following example is equivalent to the previous.
+
+ request.post('/user')
+ .send({ name: 'tj', pet: 'tobi' })
+ .end(callback)
+
+ Or using multiple `.send()` calls:
+
+ request.post('/user')
+ .send({ name: 'tj' })
+ .send({ pet: 'tobi' })
+ .end(callback)
+
+ By default sending strings will set the `Content-Type` to `application/x-www-form-urlencoded`,
+ multiple calls will be concatenated with `&`, here resulting in `name=tj&pet=tobi`:
+
+ request.post('/user')
+ .send('name=tj')
+ .send('pet=tobi')
+ .end(callback);
+
+ SuperAgent formats are extensible, however by default "json" and "form" are supported. To send the data as `application/x-www-form-urlencoded` simply invoke `.type()` with "form", where the default is "json". This request will __POST__ the body "name=tj&pet=tobi".
+
+ request.post('/user')
+ .type('form')
+ .send({ name: 'tj' })
+ .send({ pet: 'tobi' })
+ .end(callback)
+
+## Setting the `Content-Type`
+
+ The obvious solution is to use the `.set()` method:
+
+ request.post('/user')
+ .set('Content-Type', 'application/json')
+
+ As a short-hand the `.type()` method is also available, accepting
+ the canonicalized MIME type name complete with type/subtype, or
+ simply the extension name such as "xml", "json", "png", etc:
+
+ request.post('/user')
+ .type('application/json')
+
+ request.post('/user')
+ .type('json')
+
+ request.post('/user')
+ .type('png')
+
+## Serializing request body
+
+SuperAgent will automatically serialize JSON and forms. If you want to send the payload in a custom format, you can replace the built-in serialization with `.serialize()` method.
+
+## Retrying requests
+
+When given the `.retry()` method, SuperAgent will automatically retry requests, if they fail in a way that is transient or could be due to a flaky Internet connection. `.retry()` takes an optional argument which is the maximum number of times to retry failed requests; the default is 3 times.
+
+ request
+ .get('http://example.com/search')
+ .retry(2)
+ .end(callback);
+
+## Setting Accept
+
+In a similar fashion to the `.type()` method it is also possible to set the `Accept` header via the short hand method `.accept()`. Which references `request.types` as well allowing you to specify either the full canonicalized MIME type name as `type/subtype`, or the extension suffix form as "xml", "json", "png", etc. for convenience:
+
+ request.get('/user')
+ .accept('application/json')
+
+ request.get('/user')
+ .accept('json')
+
+ request.post('/user')
+ .accept('png')
+
+### Facebook and Accept JSON
+
+If you are calling Facebook's API, be sure to send an `Accept: application/json` header in your request. If you don't do this, Facebook will respond with `Content-Type: text/javascript; charset=UTF-8`, which SuperAgent will not parse and thus `res.body` will be undefined. You can do this with either `req.accept('json')` or `req.header('Accept', 'application/json')`. See [issue 1078](https://github.com/visionmedia/superagent/issues/1078) for details.
+
+## Query strings
+
+ `res.query(obj)` is a method which may be used to build up a query-string. For example populating `?format=json&dest=/login` on a __POST__:
+
+ request
+ .post('/')
+ .query({ format: 'json' })
+ .query({ dest: '/login' })
+ .send({ post: 'data', here: 'wahoo' })
+ .end(callback);
+
+ By default the query string is not assembled in any particular order. An asciibetically-sorted query string can be enabled with `req.sortQuery()`. You may also provide a custom sorting comparison function with `req.sortQuery(myComparisonFn)`. The comparison function should take 2 arguments and return a negative/zero/positive integer.
+
+```js
+ // default order
+ request.get('/user')
+ .query('name=Nick')
+ .query('search=Manny')
+ .sortQuery()
+ .end(callback)
+
+ // customized sort function
+ request.get('/user')
+ .query('name=Nick')
+ .query('search=Manny')
+ .sortQuery(function(a, b){
+ return a.length - b.length;
+ })
+ .end(callback)
+```
+
+## TLS options
+
+In Node.js SuperAgent supports methods to configure HTTPS requests:
+
+- `.ca()`: Set the CA certificate(s) to trust
+- `.cert()`: Set the client certificate chain(s)
+- `.key()`: Set the client private key(s)
+- `.pfx()`: Set the client PFX or PKCS12 encoded private key and certificate chain
+
+For more information, see Node.js [https.request docs](https://nodejs.org/api/https.html#https_https_request_options_callback).
+
+```js
+var key = fs.readFileSync('key.pem'),
+ cert = fs.readFileSync('cert.pem');
+
+request
+ .post('/client-auth')
+ .key(key)
+ .cert(cert)
+ .end(callback);
+```
+
+```js
+var ca = fs.readFileSync('ca.cert.pem');
+
+request
+ .post('https://localhost/private-ca-server')
+ .ca(ca)
+ .end(callback);
+```
+
+## Parsing response bodies
+
+ SuperAgent will parse known response-body data for you, currently supporting `application/x-www-form-urlencoded`, `application/json`, and `multipart/form-data`.
+
+ You can set a custom parser (that takes precedence over built-in parsers) with the `.buffer(true).parse(fn)` method. If response buffering is not enabled (`.buffer(false)`) then the `response` event will be emitted without waiting for the body parser to finish, so `response.body` won't be available.
+
+### JSON / Urlencoded
+
+ The property `res.body` is the parsed object, for example if a request responded with the JSON string '{"user":{"name":"tobi"}}', `res.body.user.name` would be "tobi". Likewise the x-www-form-urlencoded value of "user[name]=tobi" would yield the same result. Only one level of nesting is supported. If you need more complex data, send JSON instead.
+
+ Arrays are sent by repeating the key. `.send({color: ['red','blue']})` sends `color=red&color=blue`. If you want the array keys to contain `[]` in their name, you must add it yourself, as SuperAgent doesn't add it automatically.
+
+### Multipart
+
+ The Node client supports _multipart/form-data_ via the [Formidable](https://github.com/felixge/node-formidable) module. When parsing multipart responses, the object `res.files` is also available to you. Suppose for example a request responds with the following multipart body:
+
+ --whoop
+ Content-Disposition: attachment; name="image"; filename="tobi.png"
+ Content-Type: image/png
+
+ ... data here ...
+ --whoop
+ Content-Disposition: form-data; name="name"
+ Content-Type: text/plain
+
+ Tobi
+ --whoop--
+
+ You would have the values `res.body.name` provided as "Tobi", and `res.files.image` as a `File` object containing the path on disk, filename, and other properties.
+
+### Binary
+
+In browsers, you may use `.responseType('blob')` to request handling of binary response bodies. This API is unnecessary when running in node.js. The supported argument values for this method are
+
+- `'blob'` passed through to the XmlHTTPRequest `responseType` property
+- `'arraybuffer'` passed through to the XmlHTTPRequest `responseType` property
+
+```js
+req.get('/binary.data')
+ .responseType('blob')
+ .end(function (error, res) {
+ // res.body will be a browser native Blob type here
+ });
+```
+
+For more information, see the Mozilla Developer Network [xhr.responseType docs](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType).
+
+## Response properties
+
+ Many helpful flags and properties are set on the `Response` object, ranging from the response text, parsed response body, header fields, status flags and more.
+
+### Response text
+
+ The `res.text` property contains the unparsed response body string. This
+ property is always present for the client API, and only when the mime type
+ matches "text/*", "*/json", or "x-www-form-urlencoded" by default for node. The
+ reasoning is to conserve memory, as buffering text of large bodies such as multipart files or images is extremely inefficient.
+
+ To force buffering see the "Buffering responses" section.
+
+### Response body
+
+ Much like SuperAgent can auto-serialize request data, it can also automatically parse it. When a parser is defined for the Content-Type, it is parsed, which by default includes "application/json" and "application/x-www-form-urlencoded". The parsed object is then available via `res.body`.
+
+### Response header fields
+
+ The `res.header` contains an object of parsed header fields, lowercasing field names much like node does. For example `res.header['content-length']`.
+
+### Response Content-Type
+
+ The Content-Type response header is special-cased, providing `res.type`, which is void of the charset (if any). For example the Content-Type of "text/html; charset=utf8" will provide "text/html" as `res.type`, and the `res.charset` property would then contain "utf8".
+
+### Response status
+
+ The response status flags help determine if the request was a success, among other useful information, making SuperAgent ideal for interacting with RESTful web services. These flags are currently defined as:
+
+ var type = status / 100 | 0;
+
+ // status / class
+ res.status = status;
+ res.statusType = type;
+
+ // basics
+ res.info = 1 == type;
+ res.ok = 2 == type;
+ res.clientError = 4 == type;
+ res.serverError = 5 == type;
+ res.error = 4 == type || 5 == type;
+
+ // sugar
+ res.accepted = 202 == status;
+ res.noContent = 204 == status || 1223 == status;
+ res.badRequest = 400 == status;
+ res.unauthorized = 401 == status;
+ res.notAcceptable = 406 == status;
+ res.notFound = 404 == status;
+ res.forbidden = 403 == status;
+
+## Aborting requests
+
+ To abort requests simply invoke the `req.abort()` method.
+
+## Timeouts
+
+Sometimes networks and servers get "stuck" and never respond after accepting a request. Set timeouts to avoid requests waiting forever.
+
+ * `req.timeout({deadline:ms})` or `req.timeout(ms)` (where `ms` is a number of milliseconds > 0) sets a deadline for the entire request (including all redirects) to complete. If the response isn't fully downloaded within that time, the request will be aborted.
+
+ * `req.timeout({response:ms})` sets maximum time to wait for the first byte to arrive from the server, but it does not limit how long the entire download can take. Response timeout should be a few seconds longer than just the time it takes server to respond, because it also includes time to make DNS lookup, TCP/IP and TLS connections.
+
+You should use both `deadline` and `response` timeouts. This way you can use a short response timeout to detect unresponsive networks quickly, and a long deadline to give time for downloads on slow, but reliable, networks.
+
+ request
+ .get('/big-file?network=slow')
+ .timeout({
+ response: 5000, // Wait 5 seconds for the server to start sending,
+ deadline: 60000, // but allow 1 minute for the file to finish loading.
+ })
+ .end(function(err, res){
+ if (err.timeout) { /* timed out! */ }
+ });
+
+Timeout errors have a `.timeout` property.
+
+## Authentication
+
+ In both Node and browsers auth available via the `.auth()` method:
+
+ request
+ .get('http://local')
+ .auth('tobi', 'learnboost')
+ .end(callback);
+
+
+ In the _Node_ client Basic auth can be in the URL as "user:pass":
+
+ request.get('http://tobi:learnboost@local').end(callback);
+
+ By default only `Basic` auth is used. In browser you can add `{type:'auto'}` to enable all methods built-in in the browser (Digest, NTLM, etc.):
+
+ request.auth('digest', 'secret', {type:'auto'})
+
+## Following redirects
+
+ By default up to 5 redirects will be followed, however you may specify this with the `res.redirects(n)` method:
+
+ request
+ .get('/some.png')
+ .redirects(2)
+ .end(callback);
+
+## Preserving cookies
+
+ In Node SuperAgent does not save cookies by default, but you can use the `.agent()` method to create a copy of SuperAgent that saves cookies. Each copy has a separate cookie jar.
+
+ const agent = request.agent();
+ agent
+ .post('/login')
+ .then(() => {
+ return agent.get('/cookied-page');
+ });
+
+ In browsers cookies are managed automatically by the browser, and there is no `.agent()` method.
+
+## Piping data
+
+ The Node client allows you to pipe data to and from the request. For example piping a file's contents as the request:
+
+ const request = require('superagent');
+ const fs = require('fs');
+
+ const stream = fs.createReadStream('path/to/my.json');
+ const req = request.post('/somewhere');
+ req.type('json');
+ stream.pipe(req);
+
+ Or piping the response to a file:
+
+ const stream = fs.createWriteStream('path/to/my.json');
+ const req = request.get('/some.json');
+ req.pipe(stream);
+
+## Multipart requests
+
+ SuperAgent is also great for _building_ multipart requests for which it provides methods `.attach()` and `.field()`.
+
+### Attaching files
+
+ As mentioned a higher-level API is also provided, in the form of `.attach(name, [path], [filename])` and `.field(name, value)`/`.field(object)`. Attaching several files is simple, you can also provide a custom filename for the attachment, otherwise the basename of the attached file is used.
+
+ request
+ .post('/upload')
+ .attach('avatar', 'path/to/tobi.png', 'user.png')
+ .attach('image', 'path/to/loki.png')
+ .attach('file', 'path/to/jane.png')
+ .end(callback);
+
+### Field values
+
+ Much like form fields in HTML, you can set field values with the `.field(name, value)` method. Suppose you want to upload a few images with your name and email, your request might look something like this:
+
+ request
+ .post('/upload')
+ .field('user[name]', 'Tobi')
+ .field('user[email]', 'tobi@learnboost.com')
+ .field('friends[]', ['loki', 'jane'])
+ .attach('image', 'path/to/tobi.png')
+ .end(callback);
+
+## Compression
+
+ The node client supports compressed responses, best of all, you don't have to do anything! It just works.
+
+## Buffering responses
+
+ To force buffering of response bodies as `res.text` you may invoke `req.buffer()`. To undo the default of buffering for text responses such
+ as "text/plain", "text/html" etc you may invoke `req.buffer(false)`.
+
+ When buffered the `res.buffered` flag is provided, you may use this to
+ handle both buffered and unbuffered responses in the same callback.
+
+## CORS
+
+ For security reasons, browsers will block cross-origin requests unless the server opts-in using CORS headers. Browsers will also make extra __OPTIONS__ requests to check what HTTP headers and methods are allowed by the server. [Read more about CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS).
+
+ The `.withCredentials()` method enables the ability to send cookies
+ from the origin, however only when `Access-Control-Allow-Origin` is _not_ a wildcard ("*"), and `Access-Control-Allow-Credentials` is "true".
+
+ request
+ .get('http://api.example.com:4001/')
+ .withCredentials()
+ .then(function(res){
+ assert.equal(200, res.status);
+ assert.equal('tobi', res.text);
+ })
+
+## Error handling
+
+Your callback function will always be passed two arguments: error and response. If no error occurred, the first argument will be null:
+
+ request
+ .post('/upload')
+ .attach('image', 'path/to/tobi.png')
+ .end(function(err, res){
+
+ });
+
+An "error" event is also emitted, with you can listen for:
+
+ request
+ .post('/upload')
+ .attach('image', 'path/to/tobi.png')
+ .on('error', handle)
+ .end(function(err, res){
+
+ });
+
+ Note that a 4xx or 5xx response with super agent **are** considered an error by default. For example if you get a 500 or 403 response, this status information will be available via `err.status`. Errors from such responses also contain an `err.response` field with all of the properties mentioned in "[Response properties](#response-properties)". The library behaves in this way to handle the common case of wanting success responses and treating HTTP error status codes as errors while still allowing for custom logic around specific error conditions.
+
+ Network failures, timeouts, and other errors that produce no response will contain no `err.status` or `err.response` fields.
+
+ If you wish to handle 404 or other HTTP error responses, you can query the `err.status` property.
+ When an HTTP error occurs (4xx or 5xx response) the `res.error` property is an `Error` object,
+ this allows you to perform checks such as:
+
+ if (err && err.status === 404) {
+ alert('oh no ' + res.body.message);
+ }
+ else if (err) {
+ // all other error types we handle generically
+ }
+
+Alternatively, you can use the `.ok(callback)` method to decide whether a response is an error or not. The callback to the `ok` function gets a response and returns `true` if the response should be interpreted as success.
+
+ request.get('/404')
+ .ok(res => res.status < 500)
+ .then(response => {
+ // reads 404 page as a successful response
+ })
+
+## Progress tracking
+
+SuperAgent fires `progress` events on upload and download of large files.
+
+ request.post(url)
+ .attach(file)
+ .on('progress', event => {
+ /* the event is:
+ {
+ direction: "upload" or "download"
+ percent: 0 to 100 // may be missing if file size is unknown
+ total: // total file size, may be missing
+ loaded: // bytes downloaded or uploaded so far
+ } */
+ })
+ .end()
+
+## Promise and Generator support
+
+SuperAgent's request is a "thenable" object that's compatible with JavaScript promises and `async`/`await` syntax. Do not call `.end()` if you're using promises.
+
+Libraries like [co](https://github.com/tj/co) or a web framework like [koa](https://github.com/koajs/koa) can `yield` on any SuperAgent method:
+
+ const req = request
+ .get('http://local')
+ .auth('tobi', 'learnboost');
+ const res = yield req;
+
+Note that SuperAgent expects the global `Promise` object to be present. You'll need a polyfill to use promises in Internet Explorer or Node.js 0.10.
+
+## Browser and node versions
+
+SuperAgent has two implementations: one for web browsers (using XHR) and one for Node.JS (using core http module). By default Browserify and WebPack will pick the browser version.
+
+If want to use WebPack to compile code for Node.JS, you *must* specify [node target](webpack.github.io/docs/configuration.html#target) in its configuration.
+
+### Using browser version in electron
+
+[Electron](http://electron.atom.io/) developers report if you would prefer to use the browser version of SuperAgent instead of the Node version, you can `require('superagent/superagent')`. Your requests will now show up in the Chrome developer tools Network tab. Note this environment is not covered by automated test suite and not officially supported.
diff --git a/node_modules/superagent/docs/style.css b/node_modules/superagent/docs/style.css
new file mode 100644
index 0000000..597f127
--- /dev/null
+++ b/node_modules/superagent/docs/style.css
@@ -0,0 +1,82 @@
+body {
+ padding: 40px 80px;
+ font: 14px/1.5 "Helvetica Neue", Helvetica, sans-serif;
+ background: #181818 url(images/bg.png);
+ text-align: center;
+}
+
+#content {
+ margin: 0 auto;
+ padding: 10px 40px;
+ text-align: left;
+ background: white;
+ width: 50%;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ -webkit-box-shadow: 0 2px 5px 0 black;
+}
+
+#menu {
+ font-size: 13px;
+ margin: 0;
+ padding: 0;
+ text-align: left;
+ position: fixed;
+ top: 15px;
+ left: 15px;
+}
+
+#menu ul {
+ margin: 0;
+ padding: 0;
+}
+
+#menu li {
+ list-style: none;
+}
+
+#menu a {
+ color: rgba(255,255,255,.5);
+ text-decoration: none;
+}
+
+#menu a:hover {
+ color: white;
+}
+
+#menu .active a {
+ color: white;
+}
+
+pre {
+ padding: 10px;
+}
+
+code {
+ font-family: monaco, monospace, sans-serif;
+ font-size: 0.85em;
+}
+
+p code {
+ border: 1px solid #ECEA75;
+ padding: 1px 3px;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ background: #FDFCD1;
+}
+
+pre {
+ padding: 20px 25px;
+ border: 1px solid #ddd;
+ -webkit-box-shadow: inset 0 0 5px #eee;
+ -moz-box-shadow: inset 0 0 5px #eee;
+ box-shadow: inset 0 0 5px #eee;
+}
+
+code .comment { color: #ddd }
+code .init { color: #2F6FAD }
+code .string { color: #5890AD }
+code .keyword { color: #8A6343 }
+code .number { color: #2F6FAD }
diff --git a/node_modules/superagent/docs/tail.html b/node_modules/superagent/docs/tail.html
new file mode 100644
index 0000000..8f886f3
--- /dev/null
+++ b/node_modules/superagent/docs/tail.html
@@ -0,0 +1,29 @@
+ </div>
+ <a href="http://github.com/visionmedia/superagent"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
+ <script>
+ $('code').each(function(){
+ $(this).html(highlight($(this).text()));
+ });
+
+ function highlight(js) {
+ return js
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/('.*?')/gm, '<span class="string">$1</span>')
+ .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>')
+ .replace(/(\d+)/gm, '<span class="number">$1</span>')
+ .replace(/\bnew *(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>')
+ .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>')
+ }
+ </script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tocify/1.9.0/javascripts/jquery.tocify.min.js"></script>
+ <script>
+ $('#menu').tocify({
+ selectors: 'h2',
+ hashGenerator: 'pretty'
+ });
+ </script>
+ </body>
+</html>
diff --git a/node_modules/superagent/docs/test.html b/node_modules/superagent/docs/test.html
new file mode 100644
index 0000000..7d33fc9
--- /dev/null
+++ b/node_modules/superagent/docs/test.html
@@ -0,0 +1,2082 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>SuperAgent - Ajax with less suck</title>
+ <link rel="stylesheet" href="style.css">
+ <script src="jquery.js"></script>
+ <script src="jquery-ui.min.js"></script>
+ <script src="highlight.js"></script>
+ <script src="jquery.tocify.min.js"></script>
+ <script>
+ $(function(){
+ $('#menu').tocify({
+ selectors: 'h2',
+ hashGenerator: 'pretty'
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <ul id="menu"></ul>
+ <div id="content"> <section class="suite">
+ <h1>request</h1>
+ <dl>
+ <section class="suite">
+ <h1>with a callback</h1>
+ <dl>
+ <dt>should invoke .end()</dt>
+ <dd><pre><code>request
+.get(uri + '/login', function(err, res){
+ assert.equal(res.status, 200);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.end()</h1>
+ <dl>
+ <dt>should issue a request</dt>
+ <dd><pre><code>request
+.get(uri + '/login')
+.end(function(err, res){
+ assert.equal(res.status, 200);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.error</h1>
+ <dl>
+ <dt>should should be an Error object</dt>
+ <dd><pre><code>request
+.get(uri + '/error')
+.end(function(err, res){
+ if (NODE) {
+ res.error.message.should.equal('cannot GET /error (500)');
+ }
+ else {
+ res.error.message.should.equal('cannot GET ' + uri + '/error (500)');
+ }
+ assert.strictEqual(res.error.status, 500);
+ assert(err, 'should have an error for 500');
+ assert.equal(err.message, 'Internal Server Error');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.header</h1>
+ <dl>
+ <dt>should be an object</dt>
+ <dd><pre><code>request
+.get(uri + '/login')
+.end(function(err, res){
+ assert.equal('Express', res.header['x-powered-by']);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.charset</h1>
+ <dl>
+ <dt>should be set when present</dt>
+ <dd><pre><code>request
+.get(uri + '/login')
+.end(function(err, res){
+ res.charset.should.equal('utf-8');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.statusType</h1>
+ <dl>
+ <dt>should provide the first digit</dt>
+ <dd><pre><code>request
+.get(uri + '/login')
+.end(function(err, res){
+ assert(!err, 'should not have an error for success responses');
+ assert.equal(200, res.status);
+ assert.equal(2, res.statusType);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.type</h1>
+ <dl>
+ <dt>should provide the mime-type void of params</dt>
+ <dd><pre><code>request
+.get(uri + '/login')
+.end(function(err, res){
+ res.type.should.equal('text/html');
+ res.charset.should.equal('utf-8');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.set(field, val)</h1>
+ <dl>
+ <dt>should set the header field</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.set('X-Foo', 'bar')
+.set('X-Bar', 'baz')
+.end(function(err, res){
+ assert.equal('bar', res.header['x-foo']);
+ assert.equal('baz', res.header['x-bar']);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.set(obj)</h1>
+ <dl>
+ <dt>should set the header fields</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.set({ 'X-Foo': 'bar', 'X-Bar': 'baz' })
+.end(function(err, res){
+ assert.equal('bar', res.header['x-foo']);
+ assert.equal('baz', res.header['x-bar']);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.type(str)</h1>
+ <dl>
+ <dt>should set the Content-Type</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.type('text/x-foo')
+.end(function(err, res){
+ res.header['content-type'].should.equal('text/x-foo');
+ done();
+});</code></pre></dd>
+ <dt>should map &quot;json&quot;</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.type('json')
+.send('{&quot;a&quot;: 1}')
+.end(function(err, res){
+ res.should.be.json;
+ done();
+});</code></pre></dd>
+ <dt>should map &quot;html&quot;</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.type('html')
+.end(function(err, res){
+ res.header['content-type'].should.equal('text/html');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.accept(str)</h1>
+ <dl>
+ <dt>should set Accept</dt>
+ <dd><pre><code>request
+.get(uri + '/echo')
+.accept('text/x-foo')
+.end(function(err, res){
+ res.header['accept'].should.equal('text/x-foo');
+ done();
+});</code></pre></dd>
+ <dt>should map &quot;json&quot;</dt>
+ <dd><pre><code>request
+.get(uri + '/echo')
+.accept('json')
+.end(function(err, res){
+ res.header['accept'].should.equal('application/json');
+ done();
+});</code></pre></dd>
+ <dt>should map &quot;xml&quot;</dt>
+ <dd><pre><code>request
+.get(uri + '/echo')
+.accept('xml')
+.end(function(err, res){
+ res.header['accept'].should.equal('application/xml');
+ done();
+});</code></pre></dd>
+ <dt>should map &quot;html&quot;</dt>
+ <dd><pre><code>request
+.get(uri + '/echo')
+.accept('html')
+.end(function(err, res){
+ res.header['accept'].should.equal('text/html');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.send(str)</h1>
+ <dl>
+ <dt>should write the string</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.type('json')
+.send('{&quot;name&quot;:&quot;tobi&quot;}')
+.end(function(err, res){
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.send(Object)</h1>
+ <dl>
+ <dt>should default to json</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.send({ name: 'tobi' })
+.end(function(err, res){
+ res.should.be.json
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+});</code></pre></dd>
+ <section class="suite">
+ <h1>when called several times</h1>
+ <dl>
+ <dt>should merge the objects</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.send({ name: 'tobi' })
+.send({ age: 1 })
+.end(function(err, res){
+ res.should.be.json
+ if (NODE) {
+ res.buffered.should.be.true;
+ }
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;,&quot;age&quot;:1}');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.end(fn)</h1>
+ <dl>
+ <dt>should check arity</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.send({ name: 'tobi' })
+.end(function(err, res){
+ assert.equal(null, err);
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+});</code></pre></dd>
+ <dt>should emit request</dt>
+ <dd><pre><code>var req = request.post(uri + '/echo');
+req.on('request', function(request){
+ assert.equal(req, request);
+ done();
+});
+req.end();</code></pre></dd>
+ <dt>should emit response</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.send({ name: 'tobi' })
+.on('response', function(res){
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+})
+.end();</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.then(fulfill, reject)</h1>
+ <dl>
+ <dt>should support successful fulfills with .then(fulfill)</dt>
+ <dd><pre><code>request
+.post(uri + '/echo')
+.send({ name: 'tobi' })
+.then(function(res) {
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+})</code></pre></dd>
+ <dt>should reject an error with .then(null, reject)</dt>
+ <dd><pre><code>request
+.get(uri + '/error')
+.then(null, function(err) {
+ assert.equal(err.status, 500);
+ assert.equal(err.response.text, 'boom');
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.abort()</h1>
+ <dl>
+ <dt>should abort the request</dt>
+ <dd><pre><code>var req = request
+.get(uri + '/delay/3000')
+.end(function(err, res){
+ assert(false, 'should not complete the request');
+});
+req.on('abort', done);
+setTimeout(function() {
+ req.abort();
+}, 1000);</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>request</h1>
+ <dl>
+ <section class="suite">
+ <h1>persistent agent</h1>
+ <dl>
+ <dt>should gain a session on POST</dt>
+ <dd><pre><code>agent3
+ .post('http://localhost:4000/signin')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ should.not.exist(res.headers['set-cookie']);
+ res.text.should.containEql('dashboard');
+ done();
+ });</code></pre></dd>
+ <dt>should start with empty session (set cookies)</dt>
+ <dd><pre><code>agent1
+ .get('http://localhost:4000/dashboard')
+ .end(function(err, res) {
+ should.exist(err);
+ res.should.have.status(401);
+ should.exist(res.headers['set-cookie']);
+ done();
+ });</code></pre></dd>
+ <dt>should gain a session (cookies already set)</dt>
+ <dd><pre><code>agent1
+ .post('http://localhost:4000/signin')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ should.not.exist(res.headers['set-cookie']);
+ res.text.should.containEql('dashboard');
+ done();
+ });</code></pre></dd>
+ <dt>should persist cookies across requests</dt>
+ <dd><pre><code>agent1
+ .get('http://localhost:4000/dashboard')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ done();
+ });</code></pre></dd>
+ <dt>should have the cookie set in the end callback</dt>
+ <dd><pre><code>agent4
+ .post('http://localhost:4000/setcookie')
+ .end(function(err, res) {
+ agent4
+ .get('http://localhost:4000/getcookie')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ assert.strictEqual(res.text, 'jar');
+ done();
+ });
+ });</code></pre></dd>
+ <dt>should not share cookies</dt>
+ <dd><pre><code>agent2
+ .get('http://localhost:4000/dashboard')
+ .end(function(err, res) {
+ should.exist(err);
+ res.should.have.status(401);
+ done();
+ });</code></pre></dd>
+ <dt>should not lose cookies between agents</dt>
+ <dd><pre><code>agent1
+ .get('http://localhost:4000/dashboard')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ done();
+ });</code></pre></dd>
+ <dt>should be able to follow redirects</dt>
+ <dd><pre><code>agent1
+ .get('http://localhost:4000/')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ res.text.should.containEql('dashboard');
+ done();
+ });</code></pre></dd>
+ <dt>should be able to post redirects</dt>
+ <dd><pre><code>agent1
+ .post('http://localhost:4000/redirect')
+ .send({ foo: 'bar', baz: 'blaaah' })
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ res.text.should.containEql('simple');
+ res.redirects.should.eql(['http://localhost:4000/simple']);
+ done();
+ });</code></pre></dd>
+ <dt>should be able to limit redirects</dt>
+ <dd><pre><code>agent1
+ .get('http://localhost:4000/')
+ .redirects(0)
+ .end(function(err, res) {
+ should.exist(err);
+ res.should.have.status(302);
+ res.redirects.should.eql([]);
+ res.header.location.should.equal('/dashboard');
+ done();
+ });</code></pre></dd>
+ <dt>should be able to create a new session (clear cookie)</dt>
+ <dd><pre><code>agent1
+ .post('http://localhost:4000/signout')
+ .end(function(err, res) {
+ should.not.exist(err);
+ res.should.have.status(200);
+ should.exist(res.headers['set-cookie']);
+ done();
+ });</code></pre></dd>
+ <dt>should regenerate with an empty session</dt>
+ <dd><pre><code>agent1
+ .get('http://localhost:4000/dashboard')
+ .end(function(err, res) {
+ should.exist(err);
+ res.should.have.status(401);
+ should.not.exist(res.headers['set-cookie']);
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>Basic auth</h1>
+ <dl>
+ <section class="suite">
+ <h1>when credentials are present in url</h1>
+ <dl>
+ <dt>should set Authorization</dt>
+ <dd><pre><code>request
+.get('http://tobi:learnboost@localhost:3010')
+.end(function(err, res){
+ res.status.should.equal(200);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.auth(user, pass)</h1>
+ <dl>
+ <dt>should set Authorization</dt>
+ <dd><pre><code>request
+.get('http://localhost:3010')
+.auth('tobi', 'learnboost')
+.end(function(err, res){
+ res.status.should.equal(200);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.auth(user + &quot;:&quot; + pass)</h1>
+ <dl>
+ <dt>should set authorization</dt>
+ <dd><pre><code>request
+.get('http://localhost:3010/again')
+.auth('tobi')
+.end(function(err, res){
+ res.status.should.eql(200);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>[node] request</h1>
+ <dl>
+ <section class="suite">
+ <h1>res.statusCode</h1>
+ <dl>
+ <dt>should set statusCode</dt>
+ <dd><pre><code>request
+.get('http://localhost:5000/login', function(err, res){
+ assert.strictEqual(res.statusCode, 200);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with an object</h1>
+ <dl>
+ <dt>should format the url</dt>
+ <dd><pre><code>request
+.get(url.parse('http://localhost:5000/login'))
+.end(function(err, res){
+ assert(res.ok);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>without a schema</h1>
+ <dl>
+ <dt>should default to http</dt>
+ <dd><pre><code>request
+.get('localhost:5000/login')
+.end(function(err, res){
+ assert.equal(res.status, 200);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.toJSON()</h1>
+ <dl>
+ <dt>should describe the request</dt>
+ <dd><pre><code>request
+.post(':5000/echo')
+.send({ foo: 'baz' })
+.end(function(err, res){
+ var obj = res.request.toJSON();
+ assert.equal('POST', obj.method);
+ assert.equal(':5000/echo', obj.url);
+ assert.equal('baz', obj.data.foo);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>should allow the send shorthand</h1>
+ <dl>
+ <dt>with callback in the method call</dt>
+ <dd><pre><code>request
+.get('http://localhost:5000/login', function(err, res) {
+ assert.equal(res.status, 200);
+ done();
+});</code></pre></dd>
+ <dt>with data in the method call</dt>
+ <dd><pre><code>request
+.post('http://localhost:5000/echo', { foo: 'bar' })
+.end(function(err, res) {
+ assert.equal('{&quot;foo&quot;:&quot;bar&quot;}', res.text);
+ done();
+});</code></pre></dd>
+ <dt>with callback and data in the method call</dt>
+ <dd><pre><code>request
+.post('http://localhost:5000/echo', { foo: 'bar' }, function(err, res) {
+ assert.equal('{&quot;foo&quot;:&quot;bar&quot;}', res.text);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.toJSON()</h1>
+ <dl>
+ <dt>should describe the response</dt>
+ <dd><pre><code>request
+.post('http://localhost:5000/echo')
+.send({ foo: 'baz' })
+.end(function(err, res){
+ var obj = res.toJSON();
+ assert.equal('object', typeof obj.header);
+ assert.equal('object', typeof obj.req);
+ assert.equal(200, obj.status);
+ assert.equal('{&quot;foo&quot;:&quot;baz&quot;}', obj.text);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.links</h1>
+ <dl>
+ <dt>should default to an empty object</dt>
+ <dd><pre><code>request
+.get('http://localhost:5000/login')
+.end(function(err, res){
+ res.links.should.eql({});
+ done();
+})</code></pre></dd>
+ <dt>should parse the Link header field</dt>
+ <dd><pre><code>request
+.get('http://localhost:5000/links')
+.end(function(err, res){
+ res.links.next.should.equal('https://api.github.com/repos/visionmedia/mocha/issues?page=2');
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.unset(field)</h1>
+ <dl>
+ <dt>should remove the header field</dt>
+ <dd><pre><code>request
+.post('http://localhost:5000/echo')
+.unset('User-Agent')
+.end(function(err, res){
+ assert.equal(void 0, res.header['user-agent']);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.write(str)</h1>
+ <dl>
+ <dt>should write the given data</dt>
+ <dd><pre><code>var req = request.post('http://localhost:5000/echo');
+req.set('Content-Type', 'application/json');
+req.write('{&quot;name&quot;').should.be.a.boolean;
+req.write(':&quot;tobi&quot;}').should.be.a.boolean;
+req.end(function(err, res){
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.pipe(stream)</h1>
+ <dl>
+ <dt>should pipe the response to the given stream</dt>
+ <dd><pre><code>var stream = new EventEmitter;
+stream.buf = '';
+stream.writable = true;
+stream.write = function(chunk){
+ this.buf += chunk;
+};
+stream.end = function(){
+ this.buf.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+};
+request
+.post('http://localhost:5000/echo')
+.send('{&quot;name&quot;:&quot;tobi&quot;}')
+.pipe(stream);</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.buffer()</h1>
+ <dl>
+ <dt>should enable buffering</dt>
+ <dd><pre><code>request
+.get('http://localhost:5000/custom')
+.buffer()
+.end(function(err, res){
+ assert.equal(null, err);
+ assert.equal('custom stuff', res.text);
+ assert(res.buffered);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.buffer(false)</h1>
+ <dl>
+ <dt>should disable buffering</dt>
+ <dd><pre><code>request
+.post('http://localhost:5000/echo')
+.type('application/x-dog')
+.send('hello this is dog')
+.buffer(false)
+.end(function(err, res){
+ assert.equal(null, err);
+ assert.equal(null, res.text);
+ res.body.should.eql({});
+ var buf = '';
+ res.setEncoding('utf8');
+ res.on('data', function(chunk){ buf += chunk });
+ res.on('end', function(){
+ buf.should.equal('hello this is dog');
+ done();
+ });
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.agent()</h1>
+ <dl>
+ <dt>should return the defaut agent</dt>
+ <dd><pre><code>var req = request.post('http://localhost:5000/echo');
+req.agent().should.equal(false);
+done();</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.agent(undefined)</h1>
+ <dl>
+ <dt>should set an agent to undefined and ensure it is chainable</dt>
+ <dd><pre><code>var req = request.get('http://localhost:5000/echo');
+var ret = req.agent(undefined);
+ret.should.equal(req);
+assert.strictEqual(req.agent(), undefined);
+done();</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.agent(new http.Agent())</h1>
+ <dl>
+ <dt>should set passed agent</dt>
+ <dd><pre><code>var http = require('http');
+var req = request.get('http://localhost:5000/echo');
+var agent = new http.Agent();
+var ret = req.agent(agent);
+ret.should.equal(req);
+req.agent().should.equal(agent)
+done();</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with a content type other than application/json or text/*</h1>
+ <dl>
+ <dt>should disable buffering</dt>
+ <dd><pre><code>request
+.post('http://localhost:5000/echo')
+.type('application/x-dog')
+.send('hello this is dog')
+.end(function(err, res){
+ assert.equal(null, err);
+ assert.equal(null, res.text);
+ res.body.should.eql({});
+ var buf = '';
+ res.setEncoding('utf8');
+ res.buffered.should.be.false;
+ res.on('data', function(chunk){ buf += chunk });
+ res.on('end', function(){
+ buf.should.equal('hello this is dog');
+ done();
+ });
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>content-length</h1>
+ <dl>
+ <dt>should be set to the byte length of a non-buffer object</dt>
+ <dd><pre><code>var decoder = new StringDecoder('utf8');
+var img = fs.readFileSync(__dirname + '/fixtures/test.png');
+img = decoder.write(img);
+request
+.post('http://localhost:5000/echo')
+.type('application/x-image')
+.send(img)
+.buffer(false)
+.end(function(err, res){
+ assert.equal(null, err);
+ assert(!res.buffered);
+ assert.equal(res.header['content-length'], Buffer.byteLength(img));
+ done();
+});</code></pre></dd>
+ <dt>should be set to the length of a buffer object</dt>
+ <dd><pre><code>var img = fs.readFileSync(__dirname + '/fixtures/test.png');
+request
+.post('http://localhost:5000/echo')
+.type('application/x-image')
+.send(img)
+.buffer(true)
+.end(function(err, res){
+ assert.equal(null, err);
+ assert(res.buffered);
+ assert.equal(res.header['content-length'], img.length);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.set(&quot;Content-Type&quot;, contentType)</h1>
+ <dl>
+ <dt>should work with just the contentType component</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.set('Content-Type', 'application/json')
+.send({ name: 'tobi' })
+.end(function(err, res){
+ assert(!err);
+ done();
+});</code></pre></dd>
+ <dt>should work with the charset component</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.set('Content-Type', 'application/json; charset=utf-8')
+.send({ name: 'tobi' })
+.end(function(err, res){
+ assert(!err);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>exports</h1>
+ <dl>
+ <dt>should expose Part</dt>
+ <dd><pre><code>request.Part.should.be.a.function;</code></pre></dd>
+ <dt>should expose .protocols</dt>
+ <dd><pre><code>Object.keys(request.protocols)
+ .should.eql(['http:', 'https:']);</code></pre></dd>
+ <dt>should expose .serialize</dt>
+ <dd><pre><code>Object.keys(request.serialize)
+ .should.eql(['application/x-www-form-urlencoded', 'application/json']);</code></pre></dd>
+ <dt>should expose .parse</dt>
+ <dd><pre><code>Object.keys(request.parse)
+ .should.eql(['application/x-www-form-urlencoded', 'application/json', 'text', 'image']);</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>flags</h1>
+ <dl>
+ <section class="suite">
+ <h1>with 4xx response</h1>
+ <dl>
+ <dt>should set res.error and res.clientError</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/notfound')
+.end(function(err, res){
+ assert(err);
+ assert(!res.ok, 'response should not be ok');
+ assert(res.error, 'response should be an error');
+ assert(res.clientError, 'response should be a client error');
+ assert(!res.serverError, 'response should not be a server error');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with 5xx response</h1>
+ <dl>
+ <dt>should set res.error and res.serverError</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/error')
+.end(function(err, res){
+ assert(err);
+ assert(!res.ok, 'response should not be ok');
+ assert(!res.notFound, 'response should not be notFound');
+ assert(res.error, 'response should be an error');
+ assert(!res.clientError, 'response should not be a client error');
+ assert(res.serverError, 'response should be a server error');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with 404 Not Found</h1>
+ <dl>
+ <dt>should res.notFound</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/notfound')
+.end(function(err, res){
+ assert(err);
+ assert(res.notFound, 'response should be .notFound');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with 400 Bad Request</h1>
+ <dl>
+ <dt>should set req.badRequest</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/bad-request')
+.end(function(err, res){
+ assert(err);
+ assert(res.badRequest, 'response should be .badRequest');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with 401 Bad Request</h1>
+ <dl>
+ <dt>should set res.unauthorized</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/unauthorized')
+.end(function(err, res){
+ assert(err);
+ assert(res.unauthorized, 'response should be .unauthorized');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with 406 Not Acceptable</h1>
+ <dl>
+ <dt>should set res.notAcceptable</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/not-acceptable')
+.end(function(err, res){
+ assert(err);
+ assert(res.notAcceptable, 'response should be .notAcceptable');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with 204 No Content</h1>
+ <dl>
+ <dt>should set res.noContent</dt>
+ <dd><pre><code>request
+.get('http://localhost:3004/no-content')
+.end(function(err, res){
+ assert(!err);
+ assert(res.noContent, 'response should be .noContent');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.send(Object) as &quot;form&quot;</h1>
+ <dl>
+ <section class="suite">
+ <h1>with req.type() set to form</h1>
+ <dl>
+ <dt>should send x-www-form-urlencoded data</dt>
+ <dd><pre><code>request
+.post('http://localhost:3002/echo')
+.type('form')
+.send({ name: 'tobi' })
+.end(function(err, res){
+ res.header['content-type'].should.equal('application/x-www-form-urlencoded');
+ res.text.should.equal('name=tobi');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>when called several times</h1>
+ <dl>
+ <dt>should merge the objects</dt>
+ <dd><pre><code>request
+.post('http://localhost:3002/echo')
+.type('form')
+.send({ name: { first: 'tobi', last: 'holowaychuk' } })
+.send({ age: '1' })
+.end(function(err, res){
+ res.header['content-type'].should.equal('application/x-www-form-urlencoded');
+ res.text.should.equal('name%5Bfirst%5D=tobi&amp;name%5Blast%5D=holowaychuk&amp;age=1');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.send(String)</h1>
+ <dl>
+ <dt>should default to &quot;form&quot;</dt>
+ <dd><pre><code>request
+.post('http://localhost:3002/echo')
+.send('user[name]=tj')
+.send('user[email]=tj@vision-media.ca')
+.end(function(err, res){
+ res.header['content-type'].should.equal('application/x-www-form-urlencoded');
+ res.body.should.eql({ user: { name: 'tj', email: 'tj@vision-media.ca' } });
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.body</h1>
+ <dl>
+ <section class="suite">
+ <h1>application/x-www-form-urlencoded</h1>
+ <dl>
+ <dt>should parse the body</dt>
+ <dd><pre><code>request
+.get('http://localhost:3002/form-data')
+.end(function(err, res){
+ res.text.should.equal('pet[name]=manny');
+ res.body.should.eql({ pet: { name: 'manny' }});
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>https</h1>
+ <dl>
+ <section class="suite">
+ <h1>request</h1>
+ <dl>
+ <dt>should give a good response</dt>
+ <dd><pre><code>request
+.get('https://localhost:8443/')
+.ca(cert)
+.end(function(err, res){
+ assert(res.ok);
+ assert.strictEqual('Safe and secure!', res.text);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.agent</h1>
+ <dl>
+ <dt>should be able to make multiple requests without redefining the certificate</dt>
+ <dd><pre><code>var agent = request.agent({ca: cert});
+agent
+.get('https://localhost:8443/')
+.end(function(err, res){
+ assert(res.ok);
+ assert.strictEqual('Safe and secure!', res.text);
+ agent
+ .get(url.parse('https://localhost:8443/'))
+ .end(function(err, res){
+ assert(res.ok);
+ assert.strictEqual('Safe and secure!', res.text);
+ done();
+ });
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.body</h1>
+ <dl>
+ <section class="suite">
+ <h1>image/png</h1>
+ <dl>
+ <dt>should parse the body</dt>
+ <dd><pre><code>request
+.get('http://localhost:3011/image')
+.end(function(err, res){
+ (res.body.length - img.length).should.equal(0);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>zlib</h1>
+ <dl>
+ <dt>should deflate the content</dt>
+ <dd><pre><code>request
+ .get('http://localhost:3080')
+ .end(function(err, res){
+ res.should.have.status(200);
+ res.text.should.equal(subject);
+ res.headers['content-length'].should.be.below(subject.length);
+ done();
+ });</code></pre></dd>
+ <dt>should handle corrupted responses</dt>
+ <dd><pre><code>request
+ .get('http://localhost:3080/corrupt')
+ .end(function(err, res){
+ assert(err, 'missing error');
+ assert(!res, 'response should not be defined');
+ done();
+ });</code></pre></dd>
+ <section class="suite">
+ <h1>without encoding set</h1>
+ <dl>
+ <dt>should emit buffers</dt>
+ <dd><pre><code>request
+ .get('http://localhost:3080/binary')
+ .end(function(err, res){
+ res.should.have.status(200);
+ res.headers['content-length'].should.be.below(subject.length);
+ res.on('data', function(chunk){
+ chunk.should.have.length(subject.length);
+ });
+ res.on('end', done);
+ });</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.send(Object) as &quot;json&quot;</h1>
+ <dl>
+ <dt>should default to json</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.send({ name: 'tobi' })
+.end(function(err, res){
+ res.should.be.json
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;}');
+ done();
+});</code></pre></dd>
+ <dt>should work with arrays</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.send([1,2,3])
+.end(function(err, res){
+ res.should.be.json
+ res.text.should.equal('[1,2,3]');
+ done();
+});</code></pre></dd>
+ <dt>should work with value null</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.type('json')
+.send('null')
+.end(function(err, res){
+ res.should.be.json
+ assert.strictEqual(res.body, null);
+ done();
+});</code></pre></dd>
+ <dt>should work with value false</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.type('json')
+.send('false')
+.end(function(err, res){
+ res.should.be.json
+ res.body.should.equal(false);
+ done();
+});</code></pre></dd>
+ <dt>should work with value 0</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.type('json')
+.send('0')
+.end(function(err, res){
+ res.should.be.json
+ res.body.should.equal(0);
+ done();
+});</code></pre></dd>
+ <dt>should work with empty string value</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.type('json')
+.send('&quot;&quot;')
+.end(function(err, res){
+ res.should.be.json
+ res.body.should.equal(&quot;&quot;);
+ done();
+});</code></pre></dd>
+ <dt>should work with GET</dt>
+ <dd><pre><code>request
+.get('http://localhost:3005/echo')
+.send({ tobi: 'ferret' })
+.end(function(err, res){
+ res.should.be.json
+ res.text.should.equal('{&quot;tobi&quot;:&quot;ferret&quot;}');
+ done();
+});</code></pre></dd>
+ <dt>should work with vendor MIME type</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.set('Content-Type', 'application/vnd.example+json')
+.send({ name: 'vendor' })
+.end(function(err, res){
+ res.text.should.equal('{&quot;name&quot;:&quot;vendor&quot;}');
+ done();
+});</code></pre></dd>
+ <section class="suite">
+ <h1>when called several times</h1>
+ <dl>
+ <dt>should merge the objects</dt>
+ <dd><pre><code>request
+.post('http://localhost:3005/echo')
+.send({ name: 'tobi' })
+.send({ age: 1 })
+.end(function(err, res){
+ res.should.be.json
+ res.text.should.equal('{&quot;name&quot;:&quot;tobi&quot;,&quot;age&quot;:1}');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.body</h1>
+ <dl>
+ <section class="suite">
+ <h1>application/json</h1>
+ <dl>
+ <dt>should parse the body</dt>
+ <dd><pre><code>request
+.get('http://localhost:3005/json')
+.end(function(err, res){
+ res.text.should.equal('{&quot;name&quot;:&quot;manny&quot;}');
+ res.body.should.eql({ name: 'manny' });
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>HEAD requests</h1>
+ <dl>
+ <dt>should not throw a parse error</dt>
+ <dd><pre><code>request
+.head('http://localhost:3005/json')
+.end(function(err, res){
+ assert.strictEqual(err, null);
+ assert.strictEqual(res.text, undefined)
+ assert.strictEqual(Object.keys(res.body).length, 0)
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>Invalid JSON response</h1>
+ <dl>
+ <dt>should return the raw response</dt>
+ <dd><pre><code>request
+.get('http://localhost:3005/invalid-json')
+.end(function(err, res){
+ assert.deepEqual(err.rawResponse, &quot;)]}', {'header':{'code':200,'text':'OK','version':'1.0'},'data':'some data'}&quot;);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>No content</h1>
+ <dl>
+ <dt>should not throw a parse error</dt>
+ <dd><pre><code>request
+.get('http://localhost:3005/no-content')
+.end(function(err, res){
+ assert.strictEqual(err, null);
+ assert.strictEqual(res.text, '');
+ assert.strictEqual(Object.keys(res.body).length, 0);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>application/json+hal</h1>
+ <dl>
+ <dt>should parse the body</dt>
+ <dd><pre><code>request
+.get('http://localhost:3005/json-hal')
+.end(function(err, res){
+ if (err) return done(err);
+ res.text.should.equal('{&quot;name&quot;:&quot;hal 5000&quot;}');
+ res.body.should.eql({ name: 'hal 5000' });
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>vnd.collection+json</h1>
+ <dl>
+ <dt>should parse the body</dt>
+ <dd><pre><code>request
+.get('http://localhost:3005/collection-json')
+.end(function(err, res){
+ res.text.should.equal('{&quot;name&quot;:&quot;chewbacca&quot;}');
+ res.body.should.eql({ name: 'chewbacca' });
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>Request</h1>
+ <dl>
+ <section class="suite">
+ <h1>#attach(name, path, filename)</h1>
+ <dl>
+ <dt>should use the custom filename</dt>
+ <dd><pre><code>request
+.post(':3005/echo')
+.attach('document', 'test/node/fixtures/user.html', 'doc.html')
+.end(function(err, res){
+ if (err) return done(err);
+ var html = res.files.document;
+ html.name.should.equal('doc.html');
+ html.type.should.equal('text/html');
+ read(html.path).should.equal('&lt;h1&gt;name&lt;/h1&gt;');
+ done();
+})</code></pre></dd>
+ <dt>should fire progress event</dt>
+ <dd><pre><code>var loaded = 0;
+var total = 0;
+request
+.post(':3005/echo')
+.attach('document', 'test/node/fixtures/user.html')
+.on('progress', function (event) {
+ total = event.total;
+ loaded = event.loaded;
+})
+.end(function(err, res){
+ if (err) return done(err);
+ var html = res.files.document;
+ html.name.should.equal('user.html');
+ html.type.should.equal('text/html');
+ read(html.path).should.equal('&lt;h1&gt;name&lt;/h1&gt;');
+ total.should.equal(221);
+ loaded.should.equal(221);
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>with network error</h1>
+ <dl>
+ <dt>should error</dt>
+ <dd><pre><code>request
+.get('http://localhost:' + this.port + '/')
+.end(function(err, res){
+ assert(err, 'expected an error');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>request</h1>
+ <dl>
+ <section class="suite">
+ <h1>not modified</h1>
+ <dl>
+ <dt>should start with 200</dt>
+ <dd><pre><code>request
+.get('http://localhost:3008/')
+.end(function(err, res){
+ res.should.have.status(200)
+ res.text.should.match(/^\d+$/);
+ ts = +res.text;
+ done();
+});</code></pre></dd>
+ <dt>should then be 304</dt>
+ <dd><pre><code>request
+.get('http://localhost:3008/')
+.set('If-Modified-Since', new Date(ts).toUTCString())
+.end(function(err, res){
+ res.should.have.status(304)
+ // res.text.should.be.empty
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.parse(fn)</h1>
+ <dl>
+ <dt>should take precedence over default parsers</dt>
+ <dd><pre><code>request
+.get('http://localhost:3033/manny')
+.parse(request.parse['application/json'])
+.end(function(err, res){
+ assert(res.ok);
+ assert.equal('{&quot;name&quot;:&quot;manny&quot;}', res.text);
+ assert.equal('manny', res.body.name);
+ done();
+});</code></pre></dd>
+ <dt>should be the only parser</dt>
+ <dd><pre><code>request
+.get('http://localhost:3033/image')
+.parse(function(res, fn) {
+ res.on('data', function() {});
+})
+.end(function(err, res){
+ assert(res.ok);
+ assert.strictEqual(res.text, undefined);
+ res.body.should.eql({});
+ done();
+});</code></pre></dd>
+ <dt>should emit error if parser throws</dt>
+ <dd><pre><code>request
+.get('http://localhost:3033/manny')
+.parse(function() {
+ throw new Error('I am broken');
+})
+.on('error', function(err) {
+ err.message.should.equal('I am broken');
+ done();
+})
+.end();</code></pre></dd>
+ <dt>should emit error if parser returns an error</dt>
+ <dd><pre><code>request
+.get('http://localhost:3033/manny')
+.parse(function(res, fn) {
+ fn(new Error('I am broken'));
+})
+.on('error', function(err) {
+ err.message.should.equal('I am broken');
+ done();
+})
+.end()</code></pre></dd>
+ <dt>should not emit error on chunked json</dt>
+ <dd><pre><code>request
+.get('http://localhost:3033/chunked-json')
+.end(function(err){
+ assert(!err);
+ done();
+});</code></pre></dd>
+ <dt>should not emit error on aborted chunked json</dt>
+ <dd><pre><code>var req = request
+.get('http://localhost:3033/chunked-json')
+.end(function(err){
+ assert(!err);
+ done();
+});
+setTimeout(function(){req.abort()},50);</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>pipe on redirect</h1>
+ <dl>
+ <dt>should follow Location</dt>
+ <dd><pre><code>var stream = fs.createWriteStream('test/node/fixtures/pipe.txt');
+var redirects = [];
+var req = request
+ .get('http://localhost:3012/')
+ .on('redirect', function (res) {
+ redirects.push(res.headers.location);
+ })
+ .on('end', function () {
+ var arr = [];
+ arr.push('/movies');
+ arr.push('/movies/all');
+ arr.push('/movies/all/0');
+ redirects.should.eql(arr);
+ fs.readFileSync('test/node/fixtures/pipe.txt', 'utf8').should.eql('first movie page');
+ done();
+ });
+ req.pipe(stream);</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>request pipe</h1>
+ <dl>
+ <dt>should act as a writable stream</dt>
+ <dd><pre><code>var req = request.post('http://localhost:3020');
+var stream = fs.createReadStream('test/node/fixtures/user.json');
+req.type('json');
+req.on('response', function(res){
+ res.body.should.eql({ name: 'tobi' });
+ done();
+});
+stream.pipe(req);</code></pre></dd>
+ <dt>should act as a readable stream</dt>
+ <dd><pre><code>var stream = fs.createWriteStream('test/node/fixtures/tmp.json');
+var req = request.get('http://localhost:3025');
+req.type('json');
+req.on('end', function(){
+ JSON.parse(fs.readFileSync('test/node/fixtures/tmp.json', 'utf8')).should.eql({ name: 'tobi' });
+ done();
+});
+req.pipe(stream);</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.query(String)</h1>
+ <dl>
+ <dt>should supply uri malformed error to the callback</dt>
+ <dd><pre><code>request
+.get('http://localhost:3006')
+.query('name=toby')
+.query('a=\uD800')
+.query({ b: '\uD800' })
+.end(function(err, res){
+ assert(err instanceof Error);
+ assert.equal('URIError', err.name);
+ done();
+});</code></pre></dd>
+ <dt>should support passing in a string</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006')
+.query('name=t%F6bi')
+.end(function(err, res){
+ res.body.should.eql({ name: 't%F6bi' });
+ done();
+});</code></pre></dd>
+ <dt>should work with url query-string and string for query</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/?name=tobi')
+.query('age=2%20')
+.end(function(err, res){
+ res.body.should.eql({ name: 'tobi', age: '2 ' });
+ done();
+});</code></pre></dd>
+ <dt>should support compound elements in a string</dt>
+ <dd><pre><code>request
+ .del('http://localhost:3006/')
+ .query('name=t%F6bi&amp;age=2')
+ .end(function(err, res){
+ res.body.should.eql({ name: 't%F6bi', age: '2' });
+ done();
+ });</code></pre></dd>
+ <dt>should work when called multiple times with a string</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/')
+.query('name=t%F6bi')
+.query('age=2%F6')
+.end(function(err, res){
+ res.body.should.eql({ name: 't%F6bi', age: '2%F6' });
+ done();
+});</code></pre></dd>
+ <dt>should work with normal `query` object and query string</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/')
+.query('name=t%F6bi')
+.query({ age: '2' })
+.end(function(err, res){
+ res.body.should.eql({ name: 't%F6bi', age: '2' });
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.query(Object)</h1>
+ <dl>
+ <dt>should construct the query-string</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/')
+.query({ name: 'tobi' })
+.query({ order: 'asc' })
+.query({ limit: ['1', '2'] })
+.end(function(err, res){
+ res.body.should.eql({ name: 'tobi', order: 'asc', limit: ['1', '2'] });
+ done();
+});</code></pre></dd>
+ <dt>should not error on dates</dt>
+ <dd><pre><code>var date = new Date(0);
+request
+.del('http://localhost:3006/')
+.query({ at: date })
+.end(function(err, res){
+ assert.equal(date.toISOString(), res.body.at);
+ done();
+});</code></pre></dd>
+ <dt>should work after setting header fields</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/')
+.set('Foo', 'bar')
+.set('Bar', 'baz')
+.query({ name: 'tobi' })
+.query({ order: 'asc' })
+.query({ limit: ['1', '2'] })
+.end(function(err, res){
+ res.body.should.eql({ name: 'tobi', order: 'asc', limit: ['1', '2'] });
+ done();
+});</code></pre></dd>
+ <dt>should append to the original query-string</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/?name=tobi')
+.query({ order: 'asc' })
+.end(function(err, res) {
+ res.body.should.eql({ name: 'tobi', order: 'asc' });
+ done();
+});</code></pre></dd>
+ <dt>should retain the original query-string</dt>
+ <dd><pre><code>request
+.del('http://localhost:3006/?name=tobi')
+.end(function(err, res) {
+ res.body.should.eql({ name: 'tobi' });
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>request.get</h1>
+ <dl>
+ <section class="suite">
+ <h1>on 301 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .get('http://localhost:3210/test-301')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 302 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .get('http://localhost:3210/test-302')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 303 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .get('http://localhost:3210/test-303')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 307 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .get('http://localhost:3210/test-307')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 308 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .get('http://localhost:3210/test-308')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>request.post</h1>
+ <dl>
+ <section class="suite">
+ <h1>on 301 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .post('http://localhost:3210/test-301')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 302 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .post('http://localhost:3210/test-302')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 303 redirect</h1>
+ <dl>
+ <dt>should follow Location with a GET request</dt>
+ <dd><pre><code>var req = request
+ .post('http://localhost:3210/test-303')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('GET');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 307 redirect</h1>
+ <dl>
+ <dt>should follow Location with a POST request</dt>
+ <dd><pre><code>var req = request
+ .post('http://localhost:3210/test-307')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('POST');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 308 redirect</h1>
+ <dl>
+ <dt>should follow Location with a POST request</dt>
+ <dd><pre><code>var req = request
+ .post('http://localhost:3210/test-308')
+ .redirects(1)
+ .end(function(err, res){
+ req.req._headers.host.should.eql('localhost:3211');
+ res.status.should.eql(200);
+ res.text.should.eql('POST');
+ done();
+ });</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>request</h1>
+ <dl>
+ <section class="suite">
+ <h1>on redirect</h1>
+ <dl>
+ <dt>should follow Location</dt>
+ <dd><pre><code>var redirects = [];
+request
+.get('http://localhost:3003/')
+.on('redirect', function(res){
+ redirects.push(res.headers.location);
+})
+.end(function(err, res){
+ var arr = [];
+ arr.push('/movies');
+ arr.push('/movies/all');
+ arr.push('/movies/all/0');
+ redirects.should.eql(arr);
+ res.text.should.equal('first movie page');
+ done();
+});</code></pre></dd>
+ <dt>should retain header fields</dt>
+ <dd><pre><code>request
+.get('http://localhost:3003/header')
+.set('X-Foo', 'bar')
+.end(function(err, res){
+ res.body.should.have.property('x-foo', 'bar');
+ done();
+});</code></pre></dd>
+ <dt>should remove Content-* fields</dt>
+ <dd><pre><code>request
+.post('http://localhost:3003/header')
+.type('txt')
+.set('X-Foo', 'bar')
+.set('X-Bar', 'baz')
+.send('hey')
+.end(function(err, res){
+ res.body.should.have.property('x-foo', 'bar');
+ res.body.should.have.property('x-bar', 'baz');
+ res.body.should.not.have.property('content-type');
+ res.body.should.not.have.property('content-length');
+ res.body.should.not.have.property('transfer-encoding');
+ done();
+});</code></pre></dd>
+ <dt>should retain cookies</dt>
+ <dd><pre><code>request
+.get('http://localhost:3003/header')
+.set('Cookie', 'foo=bar;')
+.end(function(err, res){
+ res.body.should.have.property('cookie', 'foo=bar;');
+ done();
+});</code></pre></dd>
+ <dt>should preserve timeout across redirects</dt>
+ <dd><pre><code>request
+.get('http://localhost:3003/movies/random')
+.timeout(250)
+.end(function(err, res){
+ assert(err instanceof Error, 'expected an error');
+ err.should.have.property('timeout', 250);
+ done();
+});</code></pre></dd>
+ <dt>should not resend query parameters</dt>
+ <dd><pre><code>var redirects = [];
+var query = [];
+request
+.get('http://localhost:3003/?foo=bar')
+.on('redirect', function(res){
+ query.push(res.headers.query);
+ redirects.push(res.headers.location);
+})
+.end(function(err, res){
+ var arr = [];
+ arr.push('/movies');
+ arr.push('/movies/all');
+ arr.push('/movies/all/0');
+ redirects.should.eql(arr);
+ res.text.should.equal('first movie page');
+ query.should.eql(['{&quot;foo&quot;:&quot;bar&quot;}', '{}', '{}']);
+ res.headers.query.should.eql('{}');
+ done();
+});</code></pre></dd>
+ <dt>should handle no location header</dt>
+ <dd><pre><code>request
+.get('http://localhost:3003/bad-redirect')
+.end(function(err, res){
+ err.message.should.equal('No location header for redirect');
+ done();
+});</code></pre></dd>
+ <section class="suite">
+ <h1>when relative</h1>
+ <dl>
+ <dt>should redirect to a sibling path</dt>
+ <dd><pre><code>var redirects = [];
+request
+.get('http://localhost:3003/relative')
+.on('redirect', function(res){
+ redirects.push(res.headers.location);
+})
+.end(function(err, res){
+ var arr = [];
+ redirects.should.eql(['tobi']);
+ res.text.should.equal('tobi');
+ done();
+});</code></pre></dd>
+ <dt>should redirect to a parent path</dt>
+ <dd><pre><code>var redirects = [];
+request
+.get('http://localhost:3003/relative/sub')
+.on('redirect', function(res){
+ redirects.push(res.headers.location);
+})
+.end(function(err, res){
+ var arr = [];
+ redirects.should.eql(['../tobi']);
+ res.text.should.equal('tobi');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.redirects(n)</h1>
+ <dl>
+ <dt>should alter the default number of redirects to follow</dt>
+ <dd><pre><code>var redirects = [];
+request
+.get('http://localhost:3003/')
+.redirects(2)
+.on('redirect', function(res){
+ redirects.push(res.headers.location);
+})
+.end(function(err, res){
+ var arr = [];
+ assert(res.redirect, 'res.redirect');
+ arr.push('/movies');
+ arr.push('/movies/all');
+ redirects.should.eql(arr);
+ res.text.should.match(/Moved Temporarily|Found/);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on POST</h1>
+ <dl>
+ <dt>should redirect as GET</dt>
+ <dd><pre><code>var redirects = [];
+request
+.post('http://localhost:3003/movie')
+.send({ name: 'Tobi' })
+.redirects(2)
+.on('redirect', function(res){
+ redirects.push(res.headers.location);
+})
+.end(function(err, res){
+ var arr = [];
+ arr.push('/movies/all/0');
+ redirects.should.eql(arr);
+ res.text.should.equal('first movie page');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 303</h1>
+ <dl>
+ <dt>should redirect with same method</dt>
+ <dd><pre><code>request
+.put('http://localhost:3003/redirect-303')
+.send({msg: &quot;hello&quot;})
+.redirects(1)
+.on('redirect', function(res) {
+ res.headers.location.should.equal('/reply-method')
+})
+.end(function(err, res){
+ res.text.should.equal('method=get');
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 307</h1>
+ <dl>
+ <dt>should redirect with same method</dt>
+ <dd><pre><code>request
+.put('http://localhost:3003/redirect-307')
+.send({msg: &quot;hello&quot;})
+.redirects(1)
+.on('redirect', function(res) {
+ res.headers.location.should.equal('/reply-method')
+})
+.end(function(err, res){
+ res.text.should.equal('method=put');
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>on 308</h1>
+ <dl>
+ <dt>should redirect with same method</dt>
+ <dd><pre><code>request
+.put('http://localhost:3003/redirect-308')
+.send({msg: &quot;hello&quot;})
+.redirects(1)
+.on('redirect', function(res) {
+ res.headers.location.should.equal('/reply-method')
+})
+.end(function(err, res){
+ res.text.should.equal('method=put');
+ done();
+})</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>response</h1>
+ <dl>
+ <dt>should act as a readable stream</dt>
+ <dd><pre><code>var req = request
+ .get('http://localhost:3025')
+ .buffer(false);
+req.end(function(err,res){
+ if (err) return done(err);
+ var trackEndEvent = 0;
+ var trackCloseEvent = 0;
+ res.on('end',function(){
+ trackEndEvent++;
+ trackEndEvent.should.equal(1);
+ trackCloseEvent.should.equal(0); // close should not have been called
+ done();
+ });
+ res.on('close',function(){
+ trackCloseEvent++;
+ });
+
+ (function(){ res.pause() }).should.not.throw();
+ (function(){ res.resume() }).should.not.throw();
+ (function(){ res.destroy() }).should.not.throw();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>.timeout(ms)</h1>
+ <dl>
+ <section class="suite">
+ <h1>when timeout is exceeded</h1>
+ <dl>
+ <dt>should error</dt>
+ <dd><pre><code>request
+.get('http://localhost:3009/500')
+.timeout(150)
+.end(function(err, res){
+ assert(err, 'expected an error');
+ assert.equal('number', typeof err.timeout, 'expected an error with .timeout');
+ assert.equal('ECONNABORTED', err.code, 'expected abort error code')
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>res.toError()</h1>
+ <dl>
+ <dt>should return an Error</dt>
+ <dd><pre><code>request
+.get('http://localhost:' + server.address().port)
+.end(function(err, res){
+ var err = res.toError();
+ assert.equal(err.status, 400);
+ assert.equal(err.method, 'GET');
+ assert.equal(err.path, '/');
+ assert.equal(err.message, 'cannot GET / (400)');
+ assert.equal(err.text, 'invalid json');
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>req.get()</h1>
+ <dl>
+ <dt>should set a default user-agent</dt>
+ <dd><pre><code>request
+.get('http://localhost:3345/ua')
+.end(function(err, res){
+ assert(res.headers);
+ assert(res.headers['user-agent']);
+ assert(/^node-superagent\/\d+\.\d+\.\d+$/.test(res.headers['user-agent']));
+ done();
+});</code></pre></dd>
+ <dt>should be able to override user-agent</dt>
+ <dd><pre><code>request
+.get('http://localhost:3345/ua')
+.set('User-Agent', 'foo/bar')
+.end(function(err, res){
+ assert(res.headers);
+ assert.equal(res.headers['user-agent'], 'foo/bar');
+ done();
+});</code></pre></dd>
+ <dt>should be able to wipe user-agent</dt>
+ <dd><pre><code>request
+.get('http://localhost:3345/ua')
+.unset('User-Agent')
+.end(function(err, res){
+ assert(res.headers);
+ assert.equal(res.headers['user-agent'], void 0);
+ done();
+});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>utils.type(str)</h1>
+ <dl>
+ <dt>should return the mime type</dt>
+ <dd><pre><code>utils.type('application/json; charset=utf-8')
+ .should.equal('application/json');
+utils.type('application/json')
+ .should.equal('application/json');</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>utils.params(str)</h1>
+ <dl>
+ <dt>should return the field parameters</dt>
+ <dd><pre><code>var str = 'application/json; charset=utf-8; foo = bar';
+var obj = utils.params(str);
+obj.charset.should.equal('utf-8');
+obj.foo.should.equal('bar');
+var str = 'application/json';
+utils.params(str).should.eql({});</code></pre></dd>
+ </dl>
+ </section>
+ <section class="suite">
+ <h1>utils.parseLinks(str)</h1>
+ <dl>
+ <dt>should parse links</dt>
+ <dd><pre><code>var str = '&lt;https://api.github.com/repos/visionmedia/mocha/issues?page=2&gt;; rel=&quot;next&quot;, &lt;https://api.github.com/repos/visionmedia/mocha/issues?page=5&gt;; rel=&quot;last&quot;';
+var ret = utils.parseLinks(str);
+ret.next.should.equal('https://api.github.com/repos/visionmedia/mocha/issues?page=2');
+ret.last.should.equal('https://api.github.com/repos/visionmedia/mocha/issues?page=5');</code></pre></dd>
+ </dl>
+ </section>
+ </div>
+ <a href="http://github.com/visionmedia/superagent"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+ </body>
+</html>
diff --git a/node_modules/superagent/lib/client.js b/node_modules/superagent/lib/client.js
new file mode 100644
index 0000000..132542b
--- /dev/null
+++ b/node_modules/superagent/lib/client.js
@@ -0,0 +1,933 @@
+/**
+ * Root reference for iframes.
+ */
+
+var root;
+if (typeof window !== 'undefined') { // Browser window
+ root = window;
+} else if (typeof self !== 'undefined') { // Web Worker
+ root = self;
+} else { // Other environments
+ console.warn("Using browser-only version of superagent in non-browser environment");
+ root = this;
+}
+
+var Emitter = require('component-emitter');
+var RequestBase = require('./request-base');
+var isObject = require('./is-object');
+var isFunction = require('./is-function');
+var ResponseBase = require('./response-base');
+var shouldRetry = require('./should-retry');
+
+/**
+ * Noop.
+ */
+
+function noop(){};
+
+/**
+ * Expose `request`.
+ */
+
+var request = exports = module.exports = function(method, url) {
+ // callback
+ if ('function' == typeof url) {
+ return new exports.Request('GET', method).end(url);
+ }
+
+ // url first
+ if (1 == arguments.length) {
+ return new exports.Request('GET', method);
+ }
+
+ return new exports.Request(method, url);
+}
+
+exports.Request = Request;
+
+/**
+ * Determine XHR.
+ */
+
+request.getXHR = function () {
+ if (root.XMLHttpRequest
+ && (!root.location || 'file:' != root.location.protocol
+ || !root.ActiveXObject)) {
+ return new XMLHttpRequest;
+ } else {
+ try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
+ try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}
+ try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}
+ try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
+ }
+ throw Error("Browser-only verison of superagent could not find XHR");
+};
+
+/**
+ * Removes leading and trailing whitespace, added to support IE.
+ *
+ * @param {String} s
+ * @return {String}
+ * @api private
+ */
+
+var trim = ''.trim
+ ? function(s) { return s.trim(); }
+ : function(s) { return s.replace(/(^\s*|\s*$)/g, ''); };
+
+/**
+ * Serialize the given `obj`.
+ *
+ * @param {Object} obj
+ * @return {String}
+ * @api private
+ */
+
+function serialize(obj) {
+ if (!isObject(obj)) return obj;
+ var pairs = [];
+ for (var key in obj) {
+ pushEncodedKeyValuePair(pairs, key, obj[key]);
+ }
+ return pairs.join('&');
+}
+
+/**
+ * Helps 'serialize' with serializing arrays.
+ * Mutates the pairs array.
+ *
+ * @param {Array} pairs
+ * @param {String} key
+ * @param {Mixed} val
+ */
+
+function pushEncodedKeyValuePair(pairs, key, val) {
+ if (val != null) {
+ if (Array.isArray(val)) {
+ val.forEach(function(v) {
+ pushEncodedKeyValuePair(pairs, key, v);
+ });
+ } else if (isObject(val)) {
+ for(var subkey in val) {
+ pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);
+ }
+ } else {
+ pairs.push(encodeURIComponent(key)
+ + '=' + encodeURIComponent(val));
+ }
+ } else if (val === null) {
+ pairs.push(encodeURIComponent(key));
+ }
+}
+
+/**
+ * Expose serialization method.
+ */
+
+ request.serializeObject = serialize;
+
+ /**
+ * Parse the given x-www-form-urlencoded `str`.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+function parseString(str) {
+ var obj = {};
+ var pairs = str.split('&');
+ var pair;
+ var pos;
+
+ for (var i = 0, len = pairs.length; i < len; ++i) {
+ pair = pairs[i];
+ pos = pair.indexOf('=');
+ if (pos == -1) {
+ obj[decodeURIComponent(pair)] = '';
+ } else {
+ obj[decodeURIComponent(pair.slice(0, pos))] =
+ decodeURIComponent(pair.slice(pos + 1));
+ }
+ }
+
+ return obj;
+}
+
+/**
+ * Expose parser.
+ */
+
+request.parseString = parseString;
+
+/**
+ * Default MIME type map.
+ *
+ * superagent.types.xml = 'application/xml';
+ *
+ */
+
+request.types = {
+ html: 'text/html',
+ json: 'application/json',
+ xml: 'application/xml',
+ urlencoded: 'application/x-www-form-urlencoded',
+ 'form': 'application/x-www-form-urlencoded',
+ 'form-data': 'application/x-www-form-urlencoded'
+};
+
+/**
+ * Default serialization map.
+ *
+ * superagent.serialize['application/xml'] = function(obj){
+ * return 'generated xml here';
+ * };
+ *
+ */
+
+ request.serialize = {
+ 'application/x-www-form-urlencoded': serialize,
+ 'application/json': JSON.stringify
+ };
+
+ /**
+ * Default parsers.
+ *
+ * superagent.parse['application/xml'] = function(str){
+ * return { object parsed from str };
+ * };
+ *
+ */
+
+request.parse = {
+ 'application/x-www-form-urlencoded': parseString,
+ 'application/json': JSON.parse
+};
+
+/**
+ * Parse the given header `str` into
+ * an object containing the mapped fields.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+function parseHeader(str) {
+ var lines = str.split(/\r?\n/);
+ var fields = {};
+ var index;
+ var line;
+ var field;
+ var val;
+
+ lines.pop(); // trailing CRLF
+
+ for (var i = 0, len = lines.length; i < len; ++i) {
+ line = lines[i];
+ index = line.indexOf(':');
+ field = line.slice(0, index).toLowerCase();
+ val = trim(line.slice(index + 1));
+ fields[field] = val;
+ }
+
+ return fields;
+}
+
+/**
+ * Check if `mime` is json or has +json structured syntax suffix.
+ *
+ * @param {String} mime
+ * @return {Boolean}
+ * @api private
+ */
+
+function isJSON(mime) {
+ return /[\/+]json\b/.test(mime);
+}
+
+/**
+ * Initialize a new `Response` with the given `xhr`.
+ *
+ * - set flags (.ok, .error, etc)
+ * - parse header
+ *
+ * Examples:
+ *
+ * Aliasing `superagent` as `request` is nice:
+ *
+ * request = superagent;
+ *
+ * We can use the promise-like API, or pass callbacks:
+ *
+ * request.get('/').end(function(res){});
+ * request.get('/', function(res){});
+ *
+ * Sending data can be chained:
+ *
+ * request
+ * .post('/user')
+ * .send({ name: 'tj' })
+ * .end(function(res){});
+ *
+ * Or passed to `.send()`:
+ *
+ * request
+ * .post('/user')
+ * .send({ name: 'tj' }, function(res){});
+ *
+ * Or passed to `.post()`:
+ *
+ * request
+ * .post('/user', { name: 'tj' })
+ * .end(function(res){});
+ *
+ * Or further reduced to a single call for simple cases:
+ *
+ * request
+ * .post('/user', { name: 'tj' }, function(res){});
+ *
+ * @param {XMLHTTPRequest} xhr
+ * @param {Object} options
+ * @api private
+ */
+
+function Response(req) {
+ this.req = req;
+ this.xhr = this.req.xhr;
+ // responseText is accessible only if responseType is '' or 'text' and on older browsers
+ this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')
+ ? this.xhr.responseText
+ : null;
+ this.statusText = this.req.xhr.statusText;
+ var status = this.xhr.status;
+ // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request
+ if (status === 1223) {
+ status = 204;
+ }
+ this._setStatusProperties(status);
+ this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());
+ // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but
+ // getResponseHeader still works. so we get content-type even if getting
+ // other headers fails.
+ this.header['content-type'] = this.xhr.getResponseHeader('content-type');
+ this._setHeaderProperties(this.header);
+
+ if (null === this.text && req._responseType) {
+ this.body = this.xhr.response;
+ } else {
+ this.body = this.req.method != 'HEAD'
+ ? this._parseBody(this.text ? this.text : this.xhr.response)
+ : null;
+ }
+}
+
+ResponseBase(Response.prototype);
+
+/**
+ * Parse the given body `str`.
+ *
+ * Used for auto-parsing of bodies. Parsers
+ * are defined on the `superagent.parse` object.
+ *
+ * @param {String} str
+ * @return {Mixed}
+ * @api private
+ */
+
+Response.prototype._parseBody = function(str){
+ var parse = request.parse[this.type];
+ if(this.req._parser) {
+ return this.req._parser(this, str);
+ }
+ if (!parse && isJSON(this.type)) {
+ parse = request.parse['application/json'];
+ }
+ return parse && str && (str.length || str instanceof Object)
+ ? parse(str)
+ : null;
+};
+
+/**
+ * Return an `Error` representative of this response.
+ *
+ * @return {Error}
+ * @api public
+ */
+
+Response.prototype.toError = function(){
+ var req = this.req;
+ var method = req.method;
+ var url = req.url;
+
+ var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';
+ var err = new Error(msg);
+ err.status = this.status;
+ err.method = method;
+ err.url = url;
+
+ return err;
+};
+
+/**
+ * Expose `Response`.
+ */
+
+request.Response = Response;
+
+/**
+ * Initialize a new `Request` with the given `method` and `url`.
+ *
+ * @param {String} method
+ * @param {String} url
+ * @api public
+ */
+
+function Request(method, url) {
+ var self = this;
+ this._query = this._query || [];
+ this.method = method;
+ this.url = url;
+ this.header = {}; // preserves header name case
+ this._header = {}; // coerces header names to lowercase
+ this.on('end', function(){
+ var err = null;
+ var res = null;
+
+ try {
+ res = new Response(self);
+ } catch(e) {
+ err = new Error('Parser is unable to parse the response');
+ err.parse = true;
+ err.original = e;
+ // issue #675: return the raw response if the response parsing fails
+ if (self.xhr) {
+ // ie9 doesn't have 'response' property
+ err.rawResponse = typeof self.xhr.responseType == 'undefined' ? self.xhr.responseText : self.xhr.response;
+ // issue #876: return the http status code if the response parsing fails
+ err.status = self.xhr.status ? self.xhr.status : null;
+ err.statusCode = err.status; // backwards-compat only
+ } else {
+ err.rawResponse = null;
+ err.status = null;
+ }
+
+ return self.callback(err);
+ }
+
+ self.emit('response', res);
+
+ var new_err;
+ try {
+ if (!self._isResponseOK(res)) {
+ new_err = new Error(res.statusText || 'Unsuccessful HTTP response');
+ new_err.original = err;
+ new_err.response = res;
+ new_err.status = res.status;
+ }
+ } catch(e) {
+ new_err = e; // #985 touching res may cause INVALID_STATE_ERR on old Android
+ }
+
+ // #1000 don't catch errors from the callback to avoid double calling it
+ if (new_err) {
+ self.callback(new_err, res);
+ } else {
+ self.callback(null, res);
+ }
+ });
+}
+
+/**
+ * Mixin `Emitter` and `RequestBase`.
+ */
+
+Emitter(Request.prototype);
+RequestBase(Request.prototype);
+
+/**
+ * Set Content-Type to `type`, mapping values from `request.types`.
+ *
+ * Examples:
+ *
+ * superagent.types.xml = 'application/xml';
+ *
+ * request.post('/')
+ * .type('xml')
+ * .send(xmlstring)
+ * .end(callback);
+ *
+ * request.post('/')
+ * .type('application/xml')
+ * .send(xmlstring)
+ * .end(callback);
+ *
+ * @param {String} type
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.type = function(type){
+ this.set('Content-Type', request.types[type] || type);
+ return this;
+};
+
+/**
+ * Set Accept to `type`, mapping values from `request.types`.
+ *
+ * Examples:
+ *
+ * superagent.types.json = 'application/json';
+ *
+ * request.get('/agent')
+ * .accept('json')
+ * .end(callback);
+ *
+ * request.get('/agent')
+ * .accept('application/json')
+ * .end(callback);
+ *
+ * @param {String} accept
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.accept = function(type){
+ this.set('Accept', request.types[type] || type);
+ return this;
+};
+
+/**
+ * Set Authorization field value with `user` and `pass`.
+ *
+ * @param {String} user
+ * @param {String} [pass] optional in case of using 'bearer' as type
+ * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.auth = function(user, pass, options){
+ if (typeof pass === 'object' && pass !== null) { // pass is optional and can substitute for options
+ options = pass;
+ }
+ if (!options) {
+ options = {
+ type: 'function' === typeof btoa ? 'basic' : 'auto',
+ }
+ }
+
+ switch (options.type) {
+ case 'basic':
+ this.set('Authorization', 'Basic ' + btoa(user + ':' + pass));
+ break;
+
+ case 'auto':
+ this.username = user;
+ this.password = pass;
+ break;
+
+ case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' })
+ this.set('Authorization', 'Bearer ' + user);
+ break;
+ }
+ return this;
+};
+
+/**
+ * Add query-string `val`.
+ *
+ * Examples:
+ *
+ * request.get('/shoes')
+ * .query('size=10')
+ * .query({ color: 'blue' })
+ *
+ * @param {Object|String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.query = function(val){
+ if ('string' != typeof val) val = serialize(val);
+ if (val) this._query.push(val);
+ return this;
+};
+
+/**
+ * Queue the given `file` as an attachment to the specified `field`,
+ * with optional `options` (or filename).
+ *
+ * ``` js
+ * request.post('/upload')
+ * .attach('content', new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"}))
+ * .end(callback);
+ * ```
+ *
+ * @param {String} field
+ * @param {Blob|File} file
+ * @param {String|Object} options
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.attach = function(field, file, options){
+ if (file) {
+ if (this._data) {
+ throw Error("superagent can't mix .send() and .attach()");
+ }
+
+ this._getFormData().append(field, file, options || file.name);
+ }
+ return this;
+};
+
+Request.prototype._getFormData = function(){
+ if (!this._formData) {
+ this._formData = new root.FormData();
+ }
+ return this._formData;
+};
+
+/**
+ * Invoke the callback with `err` and `res`
+ * and handle arity check.
+ *
+ * @param {Error} err
+ * @param {Response} res
+ * @api private
+ */
+
+Request.prototype.callback = function(err, res){
+ // console.log(this._retries, this._maxRetries)
+ if (this._maxRetries && this._retries++ < this._maxRetries && shouldRetry(err, res)) {
+ return this._retry();
+ }
+
+ var fn = this._callback;
+ this.clearTimeout();
+
+ if (err) {
+ if (this._maxRetries) err.retries = this._retries - 1;
+ this.emit('error', err);
+ }
+
+ fn(err, res);
+};
+
+/**
+ * Invoke callback with x-domain error.
+ *
+ * @api private
+ */
+
+Request.prototype.crossDomainError = function(){
+ var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');
+ err.crossDomain = true;
+
+ err.status = this.status;
+ err.method = this.method;
+ err.url = this.url;
+
+ this.callback(err);
+};
+
+// This only warns, because the request is still likely to work
+Request.prototype.buffer = Request.prototype.ca = Request.prototype.agent = function(){
+ console.warn("This is not supported in browser version of superagent");
+ return this;
+};
+
+// This throws, because it can't send/receive data as expected
+Request.prototype.pipe = Request.prototype.write = function(){
+ throw Error("Streaming is not supported in browser version of superagent");
+};
+
+/**
+ * Compose querystring to append to req.url
+ *
+ * @api private
+ */
+
+Request.prototype._appendQueryString = function(){
+ var query = this._query.join('&');
+ if (query) {
+ this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + query;
+ }
+
+ if (this._sort) {
+ var index = this.url.indexOf('?');
+ if (index >= 0) {
+ var queryArr = this.url.substring(index + 1).split('&');
+ if (isFunction(this._sort)) {
+ queryArr.sort(this._sort);
+ } else {
+ queryArr.sort();
+ }
+ this.url = this.url.substring(0, index) + '?' + queryArr.join('&');
+ }
+ }
+};
+
+/**
+ * Check if `obj` is a host object,
+ * we don't want to serialize these :)
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+Request.prototype._isHost = function _isHost(obj) {
+ // Native objects stringify to [object File], [object Blob], [object FormData], etc.
+ return obj && 'object' === typeof obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';
+}
+
+/**
+ * Initiate request, invoking callback `fn(res)`
+ * with an instanceof `Response`.
+ *
+ * @param {Function} fn
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.end = function(fn){
+ if (this._endCalled) {
+ console.warn("Warning: .end() was called twice. This is not supported in superagent");
+ }
+ this._endCalled = true;
+
+ // store callback
+ this._callback = fn || noop;
+
+ // querystring
+ this._appendQueryString();
+
+ return this._end();
+};
+
+Request.prototype._end = function() {
+ var self = this;
+ var xhr = this.xhr = request.getXHR();
+ var data = this._formData || this._data;
+
+ this._setTimeouts();
+
+ // state change
+ xhr.onreadystatechange = function(){
+ var readyState = xhr.readyState;
+ if (readyState >= 2 && self._responseTimeoutTimer) {
+ clearTimeout(self._responseTimeoutTimer);
+ }
+ if (4 != readyState) {
+ return;
+ }
+
+ // In IE9, reads to any property (e.g. status) off of an aborted XHR will
+ // result in the error "Could not complete the operation due to error c00c023f"
+ var status;
+ try { status = xhr.status } catch(e) { status = 0; }
+
+ if (!status) {
+ if (self.timedout || self._aborted) return;
+ return self.crossDomainError();
+ }
+ self.emit('end');
+ };
+
+ // progress
+ var handleProgress = function(direction, e) {
+ if (e.total > 0) {
+ e.percent = e.loaded / e.total * 100;
+ }
+ e.direction = direction;
+ self.emit('progress', e);
+ }
+ if (this.hasListeners('progress')) {
+ try {
+ xhr.onprogress = handleProgress.bind(null, 'download');
+ if (xhr.upload) {
+ xhr.upload.onprogress = handleProgress.bind(null, 'upload');
+ }
+ } catch(e) {
+ // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.
+ // Reported here:
+ // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context
+ }
+ }
+
+ // initiate request
+ try {
+ if (this.username && this.password) {
+ xhr.open(this.method, this.url, true, this.username, this.password);
+ } else {
+ xhr.open(this.method, this.url, true);
+ }
+ } catch (err) {
+ // see #1149
+ return this.callback(err);
+ }
+
+ // CORS
+ if (this._withCredentials) xhr.withCredentials = true;
+
+ // body
+ if (!this._formData && 'GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {
+ // serialize stuff
+ var contentType = this._header['content-type'];
+ var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];
+ if (!serialize && isJSON(contentType)) {
+ serialize = request.serialize['application/json'];
+ }
+ if (serialize) data = serialize(data);
+ }
+
+ // set header fields
+ for (var field in this.header) {
+ if (null == this.header[field]) continue;
+
+ if (this.header.hasOwnProperty(field))
+ xhr.setRequestHeader(field, this.header[field]);
+ }
+
+ if (this._responseType) {
+ xhr.responseType = this._responseType;
+ }
+
+ // send stuff
+ this.emit('request', this);
+
+ // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)
+ // We need null here if data is undefined
+ xhr.send(typeof data !== 'undefined' ? data : null);
+ return this;
+};
+
+/**
+ * GET `url` with optional callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.get = function(url, data, fn){
+ var req = request('GET', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.query(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * HEAD `url` with optional callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.head = function(url, data, fn){
+ var req = request('HEAD', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * OPTIONS query to `url` with optional callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.options = function(url, data, fn){
+ var req = request('OPTIONS', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * DELETE `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed} [data]
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+function del(url, data, fn){
+ var req = request('DELETE', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+request['del'] = del;
+request['delete'] = del;
+
+/**
+ * PATCH `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed} [data]
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.patch = function(url, data, fn){
+ var req = request('PATCH', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * POST `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed} [data]
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.post = function(url, data, fn){
+ var req = request('POST', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * PUT `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.put = function(url, data, fn){
+ var req = request('PUT', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
diff --git a/node_modules/superagent/lib/is-function.js b/node_modules/superagent/lib/is-function.js
new file mode 100644
index 0000000..5fb118e
--- /dev/null
+++ b/node_modules/superagent/lib/is-function.js
@@ -0,0 +1,15 @@
+/**
+ * Check if `fn` is a function.
+ *
+ * @param {Function} fn
+ * @return {Boolean}
+ * @api private
+ */
+var isObject = require('./is-object');
+
+function isFunction(fn) {
+ var tag = isObject(fn) ? Object.prototype.toString.call(fn) : '';
+ return tag === '[object Function]';
+}
+
+module.exports = isFunction;
diff --git a/node_modules/superagent/lib/is-object.js b/node_modules/superagent/lib/is-object.js
new file mode 100644
index 0000000..dff357c
--- /dev/null
+++ b/node_modules/superagent/lib/is-object.js
@@ -0,0 +1,13 @@
+/**
+ * Check if `obj` is an object.
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+
+function isObject(obj) {
+ return null !== obj && 'object' === typeof obj;
+}
+
+module.exports = isObject;
diff --git a/node_modules/superagent/lib/node/agent.js b/node_modules/superagent/lib/node/agent.js
new file mode 100644
index 0000000..ad2a8f6
--- /dev/null
+++ b/node_modules/superagent/lib/node/agent.js
@@ -0,0 +1,90 @@
+
+/**
+ * Module dependencies.
+ */
+
+var CookieJar = require('cookiejar').CookieJar;
+var CookieAccess = require('cookiejar').CookieAccessInfo;
+var parse = require('url').parse;
+var request = require('../..');
+var methods = require('methods');
+
+/**
+ * Expose `Agent`.
+ */
+
+module.exports = Agent;
+
+/**
+ * Initialize a new `Agent`.
+ *
+ * @api public
+ */
+
+function Agent(options) {
+ if (!(this instanceof Agent)) return new Agent(options);
+ if (options) {
+ this._ca = options.ca;
+ this._key = options.key;
+ this._pfx = options.pfx;
+ this._cert = options.cert;
+ }
+ this.jar = new CookieJar;
+}
+
+/**
+ * Save the cookies in the given `res` to
+ * the agent's cookie jar for persistence.
+ *
+ * @param {Response} res
+ * @api private
+ */
+
+Agent.prototype._saveCookies = function(res){
+ var cookies = res.headers['set-cookie'];
+ if (cookies) this.jar.setCookies(cookies);
+};
+
+/**
+ * Attach cookies when available to the given `req`.
+ *
+ * @param {Request} req
+ * @api private
+ */
+
+Agent.prototype._attachCookies = function(req){
+ var url = parse(req.url);
+ var access = CookieAccess(url.hostname, url.pathname, 'https:' == url.protocol);
+ var cookies = this.jar.getCookies(access).toValueString();
+ req.cookies = cookies;
+};
+
+// generate HTTP verb methods
+if (methods.indexOf('del') == -1) {
+ // create a copy so we don't cause conflicts with
+ // other packages using the methods package and
+ // npm 3.x
+ methods = methods.slice(0);
+ methods.push('del');
+}
+methods.forEach(function(method){
+ var name = method;
+ method = 'del' == method ? 'delete' : method;
+
+ method = method.toUpperCase();
+ Agent.prototype[name] = function(url, fn){
+ var req = new request.Request(method, url);
+ req.ca(this._ca);
+ req.key(this._key);
+ req.pfx(this._pfx);
+ req.cert(this._cert);
+
+ req.on('response', this._saveCookies.bind(this));
+ req.on('redirect', this._saveCookies.bind(this));
+ req.on('redirect', this._attachCookies.bind(this, req));
+ this._attachCookies(req);
+
+ fn && req.end(fn);
+ return req;
+ };
+});
diff --git a/node_modules/superagent/lib/node/index.js b/node_modules/superagent/lib/node/index.js
new file mode 100644
index 0000000..ef06689
--- /dev/null
+++ b/node_modules/superagent/lib/node/index.js
@@ -0,0 +1,1053 @@
+
+/**
+ * Module dependencies.
+ */
+
+var debug = require('debug')('superagent');
+var formidable = require('formidable');
+var FormData = require('form-data');
+var Response = require('./response');
+var parse = require('url').parse;
+var format = require('url').format;
+var resolve = require('url').resolve;
+var methods = require('methods');
+var Stream = require('stream');
+var utils = require('../utils');
+var unzip = require('./unzip').unzip;
+var extend = require('extend');
+var mime = require('mime');
+var https = require('https');
+var http = require('http');
+var fs = require('fs');
+var qs = require('qs');
+var zlib = require('zlib');
+var util = require('util');
+var pkg = require('../../package.json');
+var RequestBase = require('../request-base');
+var isFunction = require('../is-function');
+var shouldRetry = require('../should-retry');
+
+var request = exports = module.exports = function(method, url) {
+ // callback
+ if ('function' == typeof url) {
+ return new exports.Request('GET', method).end(url);
+ }
+
+ // url first
+ if (1 == arguments.length) {
+ return new exports.Request('GET', method);
+ }
+
+ return new exports.Request(method, url);
+}
+
+/**
+ * Expose `Request`.
+ */
+
+exports.Request = Request;
+
+/**
+ * Expose the agent function
+ */
+
+exports.agent = require('./agent');
+
+/**
+ * Noop.
+ */
+
+function noop(){};
+
+/**
+ * Expose `Response`.
+ */
+
+exports.Response = Response;
+
+/**
+ * Define "form" mime type.
+ */
+
+mime.define({
+ 'application/x-www-form-urlencoded': ['form', 'urlencoded', 'form-data']
+});
+
+/**
+ * Protocol map.
+ */
+
+exports.protocols = {
+ 'http:': http,
+ 'https:': https
+};
+
+/**
+ * Default serialization map.
+ *
+ * superagent.serialize['application/xml'] = function(obj){
+ * return 'generated xml here';
+ * };
+ *
+ */
+
+exports.serialize = {
+ 'application/x-www-form-urlencoded': qs.stringify,
+ 'application/json': JSON.stringify
+};
+
+/**
+ * Default parsers.
+ *
+ * superagent.parse['application/xml'] = function(res, fn){
+ * fn(null, res);
+ * };
+ *
+ */
+
+exports.parse = require('./parsers');
+
+/**
+ * Initialize internal header tracking properties on a request instance.
+ *
+ * @param {Object} req the instance
+ * @api private
+ */
+function _initHeaders(req) {
+ var ua = 'node-superagent/' + pkg.version;
+ req._header = { // coerces header names to lowercase
+ 'user-agent': ua
+ };
+ req.header = { // preserves header name case
+ 'User-Agent': ua
+ };
+}
+
+/**
+ * Initialize a new `Request` with the given `method` and `url`.
+ *
+ * @param {String} method
+ * @param {String|Object} url
+ * @api public
+ */
+
+function Request(method, url) {
+ Stream.call(this);
+ if ('string' != typeof url) url = format(url);
+ this._agent = false;
+ this._formData = null;
+ this.method = method;
+ this.url = url;
+ _initHeaders(this);
+ this.writable = true;
+ this._redirects = 0;
+ this.redirects(method === 'HEAD' ? 0 : 5);
+ this.cookies = '';
+ this.qs = {};
+ this.qsRaw = [];
+ this._redirectList = [];
+ this._streamRequest = false;
+ this.once('end', this.clearTimeout.bind(this));
+}
+
+/**
+ * Inherit from `Stream` (which inherits from `EventEmitter`).
+ * Mixin `RequestBase`.
+ */
+util.inherits(Request, Stream);
+RequestBase(Request.prototype);
+
+/**
+ * Queue the given `file` as an attachment to the specified `field`,
+ * with optional `options` (or filename).
+ *
+ * ``` js
+ * request.post('http://localhost/upload')
+ * .attach(new Buffer('<b>Hello world</b>'), 'hello.html')
+ * .end(callback);
+ * ```
+ *
+ * A filename may also be used:
+ *
+ * ``` js
+ * request.post('http://localhost/upload')
+ * .attach('files', 'image.jpg')
+ * .end(callback);
+ * ```
+ *
+ * @param {String} field
+ * @param {String|fs.ReadStream|Buffer} file
+ * @param {String|Object} options
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.attach = function(field, file, options){
+ if (file) {
+ if (this._data) {
+ throw Error("superagent can't mix .send() and .attach()");
+ }
+
+ var o = options || {};
+ if ('string' == typeof options) {
+ o = { filename: options };
+ }
+
+ if ('string' == typeof file) {
+ if (!o.filename) o.filename = file;
+ debug('creating `fs.ReadStream` instance for file: %s', file);
+ file = fs.createReadStream(file);
+ } else if (!o.filename && file.path) {
+ o.filename = file.path;
+ }
+
+ this._getFormData().append(field, file, o);
+ }
+ return this;
+};
+
+Request.prototype._getFormData = function() {
+ if (!this._formData) {
+ this._formData = new FormData();
+ var that = this;
+ this._formData.on('error', function(err) {
+ that.emit('error', err);
+ that.abort();
+ });
+ }
+ return this._formData;
+};
+
+/**
+ * Gets/sets the `Agent` to use for this HTTP request. The default (if this
+ * function is not called) is to opt out of connection pooling (`agent: false`).
+ *
+ * @param {http.Agent} agent
+ * @return {http.Agent}
+ * @api public
+ */
+
+Request.prototype.agent = function(agent){
+ if (!arguments.length) return this._agent;
+ this._agent = agent;
+ return this;
+};
+
+/**
+ * Set _Content-Type_ response header passed through `mime.lookup()`.
+ *
+ * Examples:
+ *
+ * request.post('/')
+ * .type('xml')
+ * .send(xmlstring)
+ * .end(callback);
+ *
+ * request.post('/')
+ * .type('json')
+ * .send(jsonstring)
+ * .end(callback);
+ *
+ * request.post('/')
+ * .type('application/json')
+ * .send(jsonstring)
+ * .end(callback);
+ *
+ * @param {String} type
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.type = function(type){
+ return this.set('Content-Type', ~type.indexOf('/')
+ ? type
+ : mime.lookup(type));
+};
+
+/**
+ * Set _Accept_ response header passed through `mime.lookup()`.
+ *
+ * Examples:
+ *
+ * superagent.types.json = 'application/json';
+ *
+ * request.get('/agent')
+ * .accept('json')
+ * .end(callback);
+ *
+ * request.get('/agent')
+ * .accept('application/json')
+ * .end(callback);
+ *
+ * @param {String} accept
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.accept = function(type){
+ return this.set('Accept', ~type.indexOf('/')
+ ? type
+ : mime.lookup(type));
+};
+
+/**
+ * Add query-string `val`.
+ *
+ * Examples:
+ *
+ * request.get('/shoes')
+ * .query('size=10')
+ * .query({ color: 'blue' })
+ *
+ * @param {Object|String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.query = function(val){
+ if ('string' == typeof val) {
+ this.qsRaw.push(val);
+ return this;
+ }
+
+ extend(this.qs, val);
+ return this;
+};
+
+/**
+ * Write raw `data` / `encoding` to the socket.
+ *
+ * @param {Buffer|String} data
+ * @param {String} encoding
+ * @return {Boolean}
+ * @api public
+ */
+
+Request.prototype.write = function(data, encoding){
+ var req = this.request();
+ if (!this._streamRequest) {
+ this._streamRequest = true;
+ }
+ return req.write(data, encoding);
+};
+
+/**
+ * Pipe the request body to `stream`.
+ *
+ * @param {Stream} stream
+ * @param {Object} options
+ * @return {Stream}
+ * @api public
+ */
+
+Request.prototype.pipe = function(stream, options){
+ this.piped = true; // HACK...
+ this.buffer(false);
+ this.end();
+ return this._pipeContinue(stream, options);
+};
+
+Request.prototype._pipeContinue = function(stream, options){
+ var self = this;
+ this.req.once('response', function(res){
+ // redirect
+ var redirect = isRedirect(res.statusCode);
+ if (redirect && self._redirects++ != self._maxRedirects) {
+ return self._redirect(res)._pipeContinue(stream, options);
+ }
+
+ self.res = res;
+ self._emitResponse();
+ if (self._aborted) return;
+
+ if (self._shouldUnzip(res)) {
+ res.pipe(zlib.createUnzip()).pipe(stream, options);
+ } else {
+ res.pipe(stream, options);
+ }
+ res.once('end', function(){
+ self.emit('end');
+ });
+ });
+ return stream;
+};
+
+/**
+ * Enable / disable buffering.
+ *
+ * @return {Boolean} [val]
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.buffer = function(val){
+ this._buffer = (false !== val);
+ return this;
+};
+
+/**
+ * Redirect to `url
+ *
+ * @param {IncomingMessage} res
+ * @return {Request} for chaining
+ * @api private
+ */
+
+Request.prototype._redirect = function(res){
+ var url = res.headers.location;
+ if (!url) {
+ return this.callback(new Error('No location header for redirect'), res);
+ }
+
+ debug('redirect %s -> %s', this.url, url);
+
+ // location
+ url = resolve(this.url, url);
+
+ // ensure the response is being consumed
+ // this is required for Node v0.10+
+ res.resume();
+
+ var headers = this.req._headers;
+
+ var shouldStripCookie = parse(url).host !== parse(this.url).host;
+
+ // implementation of 302 following defacto standard
+ if (res.statusCode == 301 || res.statusCode == 302){
+ // strip Content-* related fields
+ // in case of POST etc
+ headers = utils.cleanHeader(this.req._headers, shouldStripCookie);
+
+ // force GET
+ this.method = 'HEAD' == this.method
+ ? 'HEAD'
+ : 'GET';
+
+ // clear data
+ this._data = null;
+ }
+ // 303 is always GET
+ if (res.statusCode == 303) {
+ // strip Content-* related fields
+ // in case of POST etc
+ headers = utils.cleanHeader(this.req._headers, shouldStripCookie);
+
+ // force method
+ this.method = 'GET';
+
+ // clear data
+ this._data = null;
+ }
+ // 307 preserves method
+ // 308 preserves method
+ delete headers.host;
+
+ delete this.req;
+ delete this._formData;
+
+ // remove all add header except User-Agent
+ _initHeaders(this)
+
+ // redirect
+ this._endCalled = false;
+ this.url = url;
+ this.qs = {};
+ this.qsRaw = [];
+ this.set(headers);
+ this.emit('redirect', res);
+ this._redirectList.push(this.url);
+ this.end(this._callback);
+ return this;
+};
+
+/**
+ * Set Authorization field value with `user` and `pass`.
+ *
+ * Examples:
+ *
+ * .auth('tobi', 'learnboost')
+ * .auth('tobi:learnboost')
+ * .auth('tobi')
+ * .auth(accessToken, { type: 'bearer' })
+ *
+ * @param {String} user
+ * @param {String} [pass]
+ * @param {Object} [options] options with authorization type 'basic' or 'bearer' ('basic' is default)
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.auth = function(user, pass, options){
+ if (1 === arguments.length) pass = '';
+ if (2 === arguments.length && typeof pass === 'object') options = pass;
+ if (!options) {
+ options = { type: 'basic' };
+ }
+ switch (options.type) {
+ case 'bearer':
+ return this.set('Authorization', 'Bearer ' + user);
+
+ default: // 'basic'
+ if (!~user.indexOf(':')) user = user + ':';
+ var str = new Buffer(user + pass).toString('base64');
+ return this.set('Authorization', 'Basic ' + str);
+ }
+};
+
+/**
+ * Set the certificate authority option for https request.
+ *
+ * @param {Buffer | Array} cert
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.ca = function(cert){
+ this._ca = cert;
+ return this;
+};
+
+/**
+ * Set the client certificate key option for https request.
+ *
+ * @param {Buffer | String} cert
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.key = function(cert){
+ this._key = cert;
+ return this;
+};
+
+/**
+ * Set the key, certificate, and CA certs of the client in PFX or PKCS12 format.
+ *
+ * @param {Buffer | String} cert
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.pfx = function(cert){
+ this._pfx = cert;
+ return this;
+};
+
+/**
+ * Set the client certificate option for https request.
+ *
+ * @param {Buffer | String} cert
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.cert = function(cert){
+ this._cert = cert;
+ return this;
+};
+
+/**
+ * Return an http[s] request.
+ *
+ * @return {OutgoingMessage}
+ * @api private
+ */
+
+Request.prototype.request = function(){
+ if (this.req) return this.req;
+
+ var self = this;
+ var options = {};
+ var url = this.url;
+ var retries = this._retries;
+
+ // default to http://
+ if (0 != url.indexOf('http')) url = 'http://' + url;
+ url = parse(url);
+
+ // support unix sockets
+ if (/^https?\+unix:/.test(url.protocol) === true) {
+ // get the protocol
+ url.protocol = url.protocol.split('+')[0] + ':';
+
+ // get the socket, path
+ var unixParts = url.path.match(/^([^/]+)(.+)$/);
+ options.socketPath = unixParts[1].replace(/%2F/g, '/');
+ url.pathname = unixParts[2];
+ }
+
+ // options
+ options.method = this.method;
+ options.port = url.port;
+ options.path = url.pathname;
+ options.host = url.hostname;
+ options.ca = this._ca;
+ options.key = this._key;
+ options.pfx = this._pfx;
+ options.cert = this._cert;
+ options.agent = this._agent;
+
+ // initiate request
+ var mod = exports.protocols[url.protocol];
+
+ // request
+ var req = this.req = mod.request(options);
+ if ('HEAD' != options.method) {
+ req.setHeader('Accept-Encoding', 'gzip, deflate');
+ }
+ this.protocol = url.protocol;
+ this.host = url.host;
+
+ // expose events
+ req.once('drain', function(){ self.emit('drain'); });
+
+ req.once('error', function(err){
+ // flag abortion here for out timeouts
+ // because node will emit a faux-error "socket hang up"
+ // when request is aborted before a connection is made
+ if (self._aborted) return;
+ // if not the same, we are in the **old** (cancelled) request,
+ // so need to continue (same as for above)
+ if (self._retries !== retries) return;
+ // if we've received a response then we don't want to let
+ // an error in the request blow up the response
+ if (self.response) return;
+ self.callback(err);
+ });
+
+ // auth
+ if (url.auth) {
+ var auth = url.auth.split(':');
+ this.auth(auth[0], auth[1]);
+ }
+
+ // query
+ if (url.search)
+ this.query(url.search.substr(1));
+
+ // add cookies
+ if (this.cookies) req.setHeader('Cookie', this.cookies);
+
+ for (var key in this.header) {
+ if (this.header.hasOwnProperty(key))
+ req.setHeader(key, this.header[key]);
+ }
+
+ try {
+ this._appendQueryString(req);
+ } catch (e) {
+ return this.emit('error', e);
+ }
+
+ return req;
+};
+
+/**
+ * Invoke the callback with `err` and `res`
+ * and handle arity check.
+ *
+ * @param {Error} err
+ * @param {Response} res
+ * @api private
+ */
+
+Request.prototype.callback = function(err, res){
+ // console.log(this._retries, this._maxRetries)
+ if (this._maxRetries && this._retries++ < this._maxRetries && shouldRetry(err, res)) {
+ return this._retry();
+ }
+
+ // Avoid the error which is emitted from 'socket hang up' to cause the fn undefined error on JS runtime.
+ var fn = this._callback || noop;
+ this.clearTimeout();
+ if (this.called) return console.warn('superagent: double callback bug');
+ this.called = true;
+
+ if (!err) {
+ if (this._isResponseOK(res)) {
+ return fn(err, res);
+ }
+
+ var msg = 'Unsuccessful HTTP response';
+ if (res) {
+ msg = http.STATUS_CODES[res.status] || msg;
+ }
+ err = new Error(msg);
+ err.status = res ? res.status : undefined;
+ }
+
+ err.response = res;
+ if (this._maxRetries) err.retries = this._retries - 1;
+
+ // only emit error event if there is a listener
+ // otherwise we assume the callback to `.end()` will get the error
+ if (err && this.listeners('error').length > 0) {
+ this.emit('error', err);
+ }
+
+ fn(err, res);
+};
+
+/**
+ * Compose querystring to append to req.path
+ *
+ * @return {String} querystring
+ * @api private
+ */
+
+Request.prototype._appendQueryString = function(req){
+ var query = qs.stringify(this.qs, { indices: false, strictNullHandling: true });
+ query += ((query.length && this.qsRaw.length) ? '&' : '') + this.qsRaw.join('&');
+ req.path += query.length ? (~req.path.indexOf('?') ? '&' : '?') + query : '';
+
+ if (this._sort) {
+ var index = req.path.indexOf('?');
+ if (index >= 0) {
+ var queryArr = req.path.substring(index + 1).split('&');
+ if (isFunction(this._sort)) {
+ queryArr.sort(this._sort);
+ } else {
+ queryArr.sort();
+ }
+ req.path = req.path.substring(0, index) + '?' + queryArr.join('&');
+ }
+ }
+};
+
+/**
+ * Check if `obj` is a host object,
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+Request.prototype._isHost = function _isHost(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof Stream || obj instanceof FormData;
+}
+
+/**
+ * Initiate request, invoking callback `fn(err, res)`
+ * with an instanceof `Response`.
+ *
+ * @param {Function} fn
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype._emitResponse = function(body, files){
+ var response = new Response(this);
+ this.response = response;
+ response.redirects = this._redirectList;
+ if (undefined !== body) {
+ response.body = body;
+ }
+ response.files = files;
+ this.emit('response', response);
+ return response;
+};
+
+Request.prototype.end = function(fn){
+ this.request();
+ debug('%s %s', this.method, this.url);
+
+ if (this._endCalled) {
+ console.warn("Warning: .end() was called twice. This is not supported in superagent");
+ }
+ this._endCalled = true;
+
+ // store callback
+ this._callback = fn || noop;
+
+ return this._end();
+};
+
+Request.prototype._end = function() {
+ var self = this;
+ var data = this._data;
+ var req = this.req;
+ var buffer = this._buffer;
+ var method = this.method;
+
+ this._setTimeouts();
+
+ // body
+ if ('HEAD' != method && !req._headerSent) {
+ // serialize stuff
+ if ('string' != typeof data) {
+ var contentType = req.getHeader('Content-Type')
+ // Parse out just the content type from the header (ignore the charset)
+ if (contentType) contentType = contentType.split(';')[0]
+ var serialize = exports.serialize[contentType];
+ if (!serialize && isJSON(contentType)) {
+ serialize = exports.serialize['application/json'];
+ }
+ if (serialize) data = serialize(data);
+ }
+
+ // content-length
+ if (data && !req.getHeader('Content-Length')) {
+ req.setHeader('Content-Length', Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data));
+ }
+ }
+
+ // response
+ req.once('response', function(res){
+ debug('%s %s -> %s', self.method, self.url, res.statusCode);
+
+ if (self._responseTimeoutTimer) {
+ clearTimeout(self._responseTimeoutTimer);
+ }
+
+ if (self.piped) {
+ return;
+ }
+
+ var max = self._maxRedirects;
+ var mime = utils.type(res.headers['content-type'] || '') || 'text/plain';
+ var type = mime.split('/')[0];
+ var multipart = 'multipart' == type;
+ var redirect = isRedirect(res.statusCode);
+ var parser = self._parser;
+ var responseType = self._responseType;
+
+ self.res = res;
+
+ // redirect
+ if (redirect && self._redirects++ != max) {
+ return self._redirect(res);
+ }
+
+ if ('HEAD' == self.method) {
+ self.emit('end');
+ self.callback(null, self._emitResponse());
+ return;
+ }
+
+ // zlib support
+ if (self._shouldUnzip(res)) {
+ unzip(req, res);
+ }
+
+ if (!parser) {
+ if (responseType) {
+ parser = exports.parse.image; // It's actually a generic Buffer
+ buffer = true;
+ } else if (multipart) {
+ var form = new formidable.IncomingForm();
+ parser = form.parse.bind(form);
+ buffer = true;
+ } else if (isImageOrVideo(mime)) {
+ parser = exports.parse.image;
+ buffer = true; // For backwards-compatibility buffering default is ad-hoc MIME-dependent
+ } else if (exports.parse[mime]) {
+ parser = exports.parse[mime];
+ } else if ('text' == type) {
+ parser = exports.parse.text;
+ buffer = (buffer !== false);
+
+ // everyone wants their own white-labeled json
+ } else if (isJSON(mime)) {
+ parser = exports.parse['application/json'];
+ buffer = (buffer !== false);
+ } else if (buffer) {
+ parser = exports.parse.text;
+ }
+ }
+
+ // by default only buffer text/*, json and messed up thing from hell
+ if (undefined === buffer && isText(mime) || isJSON(mime)) {
+ buffer = true;
+ }
+
+ var parserHandlesEnd = false;
+ if (parser) {
+ try {
+ // Unbuffered parsers are supposed to emit response early,
+ // which is weird BTW, because response.body won't be there.
+ parserHandlesEnd = buffer;
+
+ parser(res, function(err, obj, files) {
+ if (self.timedout) {
+ // Timeout has already handled all callbacks
+ return;
+ }
+
+ // Intentional (non-timeout) abort is supposed to preserve partial response,
+ // even if it doesn't parse.
+ if (err && !self._aborted) {
+ return self.callback(err);
+ }
+
+ if (parserHandlesEnd) {
+ self.emit('end');
+ self.callback(null, self._emitResponse(obj, files));
+ }
+ });
+ } catch (err) {
+ self.callback(err);
+ return;
+ }
+ }
+
+ self.res = res;
+
+ // unbuffered
+ if (!buffer) {
+ debug('unbuffered %s %s', self.method, self.url);
+ self.callback(null, self._emitResponse());
+ if (multipart) return // allow multipart to handle end event
+ res.once('end', function(){
+ debug('end %s %s', self.method, self.url);
+ self.emit('end');
+ })
+ return;
+ }
+
+ // terminating events
+ res.once('error', function(err){
+ self.callback(err, null);
+ });
+ if (!parserHandlesEnd) res.once('end', function(){
+ debug('end %s %s', self.method, self.url);
+ // TODO: unless buffering emit earlier to stream
+ self.emit('end');
+ self.callback(null, self._emitResponse());
+ });
+ });
+
+ this.emit('request', this);
+
+ // if a FormData instance got created, then we send that as the request body
+ var formData = this._formData;
+ if (formData) {
+
+ // set headers
+ var headers = formData.getHeaders();
+ for (var i in headers) {
+ debug('setting FormData header: "%s: %s"', i, headers[i]);
+ req.setHeader(i, headers[i]);
+ }
+
+ // attempt to get "Content-Length" header
+ formData.getLength(function(err, length) {
+ // TODO: Add chunked encoding when no length (if err)
+
+ debug('got FormData Content-Length: %s', length);
+ if ('number' == typeof length) {
+ req.setHeader('Content-Length', length);
+ }
+
+ var getProgressMonitor = function () {
+ var lengthComputable = true;
+ var total = req.getHeader('Content-Length');
+ var loaded = 0;
+
+ var progress = new Stream.Transform();
+ progress._transform = function (chunk, encoding, cb) {
+ loaded += chunk.length;
+ self.emit('progress', {
+ direction: 'upload',
+ lengthComputable: lengthComputable,
+ loaded: loaded,
+ total: total
+ });
+ cb(null, chunk);
+ };
+ return progress;
+ };
+ formData.pipe(getProgressMonitor()).pipe(req);
+ });
+ } else {
+ req.end(data);
+ }
+
+ return this;
+};
+
+/**
+ * Check whether response has a non-0-sized gzip-encoded body
+ */
+Request.prototype._shouldUnzip = function(res){
+ if (res.statusCode === 204 || res.statusCode === 304) {
+ // These aren't supposed to have any body
+ return false;
+ }
+
+ // header content is a string, and distinction between 0 and no information is crucial
+ if ('0' === res.headers['content-length']) {
+ // We know that the body is empty (unfortunately, this check does not cover chunked encoding)
+ return false;
+ }
+
+ // console.log(res);
+ return /^\s*(?:deflate|gzip)\s*$/.test(res.headers['content-encoding']);
+};
+
+// generate HTTP verb methods
+if (methods.indexOf('del') == -1) {
+ // create a copy so we don't cause conflicts with
+ // other packages using the methods package and
+ // npm 3.x
+ methods = methods.slice(0);
+ methods.push('del');
+}
+methods.forEach(function(method){
+ var name = method;
+ method = 'del' == method ? 'delete' : method;
+
+ method = method.toUpperCase();
+ request[name] = function(url, data, fn){
+ var req = request(method, url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ fn && req.end(fn);
+ return req;
+ };
+});
+
+/**
+ * Check if `mime` is text and should be buffered.
+ *
+ * @param {String} mime
+ * @return {Boolean}
+ * @api public
+ */
+
+function isText(mime) {
+ var parts = mime.split('/');
+ var type = parts[0];
+ var subtype = parts[1];
+
+ return 'text' == type
+ || 'x-www-form-urlencoded' == subtype;
+}
+
+function isImageOrVideo(mime) {
+ var type = mime.split('/')[0];
+
+ return 'image' == type || 'video' == type;
+}
+
+/**
+ * Check if `mime` is json or has +json structured syntax suffix.
+ *
+ * @param {String} mime
+ * @return {Boolean}
+ * @api private
+ */
+
+function isJSON(mime) {
+ return /[\/+]json\b/.test(mime);
+}
+
+/**
+ * Check if we should follow the redirect `code`.
+ *
+ * @param {Number} code
+ * @return {Boolean}
+ * @api private
+ */
+
+function isRedirect(code) {
+ return ~[301, 302, 303, 305, 307, 308].indexOf(code);
+}
diff --git a/node_modules/superagent/lib/node/parsers/image.js b/node_modules/superagent/lib/node/parsers/image.js
new file mode 100644
index 0000000..b3e0ebc
--- /dev/null
+++ b/node_modules/superagent/lib/node/parsers/image.js
@@ -0,0 +1,10 @@
+module.exports = function(res, fn){
+ var data = []; // Binary data needs binary storage
+
+ res.on('data', function(chunk){
+ data.push(chunk);
+ });
+ res.on('end', function () {
+ fn(null, Buffer.concat(data));
+ });
+}; \ No newline at end of file
diff --git a/node_modules/superagent/lib/node/parsers/index.js b/node_modules/superagent/lib/node/parsers/index.js
new file mode 100644
index 0000000..b6f4bf6
--- /dev/null
+++ b/node_modules/superagent/lib/node/parsers/index.js
@@ -0,0 +1,8 @@
+
+exports['application/x-www-form-urlencoded'] = require('./urlencoded');
+exports['application/json'] = require('./json');
+exports.text = require('./text');
+
+var binary = require('./image');
+exports['application/octet-stream'] = binary;
+exports.image = binary;
diff --git a/node_modules/superagent/lib/node/parsers/json.js b/node_modules/superagent/lib/node/parsers/json.js
new file mode 100644
index 0000000..b71662d
--- /dev/null
+++ b/node_modules/superagent/lib/node/parsers/json.js
@@ -0,0 +1,19 @@
+
+module.exports = function parseJSON(res, fn){
+ res.text = '';
+ res.setEncoding('utf8');
+ res.on('data', function(chunk){ res.text += chunk;});
+ res.on('end', function(){
+ try {
+ var body = res.text && JSON.parse(res.text);
+ } catch (e) {
+ var err = e;
+ // issue #675: return the raw response if the response parsing fails
+ err.rawResponse = res.text || null;
+ // issue #876: return the http status code if the response parsing fails
+ err.statusCode = res.statusCode;
+ } finally {
+ fn(err, body);
+ }
+ });
+};
diff --git a/node_modules/superagent/lib/node/parsers/text.js b/node_modules/superagent/lib/node/parsers/text.js
new file mode 100644
index 0000000..03575c6
--- /dev/null
+++ b/node_modules/superagent/lib/node/parsers/text.js
@@ -0,0 +1,7 @@
+
+module.exports = function(res, fn){
+ res.text = '';
+ res.setEncoding('utf8');
+ res.on('data', function(chunk){ res.text += chunk; });
+ res.on('end', fn);
+}; \ No newline at end of file
diff --git a/node_modules/superagent/lib/node/parsers/urlencoded.js b/node_modules/superagent/lib/node/parsers/urlencoded.js
new file mode 100644
index 0000000..245c665
--- /dev/null
+++ b/node_modules/superagent/lib/node/parsers/urlencoded.js
@@ -0,0 +1,19 @@
+
+/**
+ * Module dependencies.
+ */
+
+var qs = require('qs');
+
+module.exports = function(res, fn){
+ res.text = '';
+ res.setEncoding('ascii');
+ res.on('data', function(chunk){ res.text += chunk; });
+ res.on('end', function(){
+ try {
+ fn(null, qs.parse(res.text));
+ } catch (err) {
+ fn(err);
+ }
+ });
+}; \ No newline at end of file
diff --git a/node_modules/superagent/lib/node/response.js b/node_modules/superagent/lib/node/response.js
new file mode 100644
index 0000000..9a9ea15
--- /dev/null
+++ b/node_modules/superagent/lib/node/response.js
@@ -0,0 +1,123 @@
+
+/**
+ * Module dependencies.
+ */
+
+var util = require('util');
+var Stream = require('stream');
+var ResponseBase = require('../response-base');
+
+/**
+ * Expose `Response`.
+ */
+
+module.exports = Response;
+
+/**
+ * Initialize a new `Response` with the given `xhr`.
+ *
+ * - set flags (.ok, .error, etc)
+ * - parse header
+ *
+ * @param {Request} req
+ * @param {Object} options
+ * @constructor
+ * @extends {Stream}
+ * @implements {ReadableStream}
+ * @api private
+ */
+
+function Response(req) {
+ Stream.call(this);
+ var res = this.res = req.res;
+ this.request = req;
+ this.req = req.req;
+ this.text = res.text;
+ this.body = res.body !== undefined ? res.body : {};
+ this.files = res.files || {};
+ this.buffered = 'string' == typeof this.text;
+ this.header = this.headers = res.headers;
+ this._setStatusProperties(res.statusCode);
+ this._setHeaderProperties(this.header);
+ this.setEncoding = res.setEncoding.bind(res);
+ res.on('data', this.emit.bind(this, 'data'));
+ res.on('end', this.emit.bind(this, 'end'));
+ res.on('close', this.emit.bind(this, 'close'));
+ res.on('error', this.emit.bind(this, 'error'));
+}
+
+/**
+ * Inherit from `Stream`.
+ */
+
+util.inherits(Response, Stream);
+ResponseBase(Response.prototype);
+
+
+/**
+ * Implements methods of a `ReadableStream`
+ */
+
+Response.prototype.destroy = function(err){
+ this.res.destroy(err);
+};
+
+/**
+ * Pause.
+ */
+
+Response.prototype.pause = function(){
+ this.res.pause();
+};
+
+/**
+ * Resume.
+ */
+
+Response.prototype.resume = function(){
+ this.res.resume();
+};
+
+/**
+ * Return an `Error` representative of this response.
+ *
+ * @return {Error}
+ * @api public
+ */
+
+Response.prototype.toError = function(){
+ var req = this.req;
+ var method = req.method;
+ var path = req.path;
+
+ var msg = 'cannot ' + method + ' ' + path + ' (' + this.status + ')';
+ var err = new Error(msg);
+ err.status = this.status;
+ err.text = this.text;
+ err.method = method;
+ err.path = path;
+
+ return err;
+};
+
+
+Response.prototype.setStatusProperties = function(status){
+ console.warn("In superagent 2.x setStatusProperties is a private method");
+ return this._setStatusProperties(status);
+};
+
+/**
+ * To json.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Response.prototype.toJSON = function(){
+ return {
+ req: this.request.toJSON(),
+ header: this.header,
+ status: this.status,
+ text: this.text
+ };
+};
diff --git a/node_modules/superagent/lib/node/unzip.js b/node_modules/superagent/lib/node/unzip.js
new file mode 100644
index 0000000..2911fbc
--- /dev/null
+++ b/node_modules/superagent/lib/node/unzip.js
@@ -0,0 +1,69 @@
+
+/**
+ * Module dependencies.
+ */
+
+var StringDecoder = require('string_decoder').StringDecoder;
+var Stream = require('stream');
+var zlib = require('zlib');
+
+/**
+ * Buffers response data events and re-emits when they're unzipped.
+ *
+ * @param {Request} req
+ * @param {Response} res
+ * @api private
+ */
+
+exports.unzip = function(req, res){
+ var unzip = zlib.createUnzip();
+ var stream = new Stream;
+ var decoder;
+
+ // make node responseOnEnd() happy
+ stream.req = req;
+
+ unzip.on('error', function(err){
+ if (err && err.code === 'Z_BUF_ERROR') { // unexpected end of file is ignored by browsers and curl
+ stream.emit('end');
+ return;
+ }
+ stream.emit('error', err);
+ });
+
+ // pipe to unzip
+ res.pipe(unzip);
+
+ // override `setEncoding` to capture encoding
+ res.setEncoding = function(type){
+ decoder = new StringDecoder(type);
+ };
+
+ // decode upon decompressing with captured encoding
+ unzip.on('data', function(buf){
+ if (decoder) {
+ var str = decoder.write(buf);
+ if (str.length) stream.emit('data', str);
+ } else {
+ stream.emit('data', buf);
+ }
+ });
+
+ unzip.on('end', function(){
+ stream.emit('end');
+ });
+
+ // override `on` to capture data listeners
+ var _on = res.on;
+ res.on = function(type, fn){
+ if ('data' == type || 'end' == type) {
+ stream.on(type, fn);
+ } else if ('error' == type) {
+ stream.on(type, fn);
+ _on.call(res, type, fn);
+ } else {
+ _on.call(res, type, fn);
+ }
+ return this;
+ };
+}; \ No newline at end of file
diff --git a/node_modules/superagent/lib/request-base.js b/node_modules/superagent/lib/request-base.js
new file mode 100644
index 0000000..0fc62a4
--- /dev/null
+++ b/node_modules/superagent/lib/request-base.js
@@ -0,0 +1,591 @@
+/**
+ * Module of mixed-in functions shared between node and client code
+ */
+var isObject = require('./is-object');
+
+/**
+ * Expose `RequestBase`.
+ */
+
+module.exports = RequestBase;
+
+/**
+ * Initialize a new `RequestBase`.
+ *
+ * @api public
+ */
+
+function RequestBase(obj) {
+ if (obj) return mixin(obj);
+}
+
+/**
+ * Mixin the prototype properties.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function mixin(obj) {
+ for (var key in RequestBase.prototype) {
+ obj[key] = RequestBase.prototype[key];
+ }
+ return obj;
+}
+
+/**
+ * Clear previous timeout.
+ *
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.clearTimeout = function _clearTimeout(){
+ clearTimeout(this._timer);
+ clearTimeout(this._responseTimeoutTimer);
+ delete this._timer;
+ delete this._responseTimeoutTimer;
+ return this;
+};
+
+/**
+ * Override default response body parser
+ *
+ * This function will be called to convert incoming data into request.body
+ *
+ * @param {Function}
+ * @api public
+ */
+
+RequestBase.prototype.parse = function parse(fn){
+ this._parser = fn;
+ return this;
+};
+
+/**
+ * Set format of binary response body.
+ * In browser valid formats are 'blob' and 'arraybuffer',
+ * which return Blob and ArrayBuffer, respectively.
+ *
+ * In Node all values result in Buffer.
+ *
+ * Examples:
+ *
+ * req.get('/')
+ * .responseType('blob')
+ * .end(callback);
+ *
+ * @param {String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.responseType = function(val){
+ this._responseType = val;
+ return this;
+};
+
+/**
+ * Override default request body serializer
+ *
+ * This function will be called to convert data set via .send or .attach into payload to send
+ *
+ * @param {Function}
+ * @api public
+ */
+
+RequestBase.prototype.serialize = function serialize(fn){
+ this._serializer = fn;
+ return this;
+};
+
+/**
+ * Set timeouts.
+ *
+ * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time.
+ * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections.
+ *
+ * Value of 0 or false means no timeout.
+ *
+ * @param {Number|Object} ms or {response, read, deadline}
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.timeout = function timeout(options){
+ if (!options || 'object' !== typeof options) {
+ this._timeout = options;
+ this._responseTimeout = 0;
+ return this;
+ }
+
+ for(var option in options) {
+ switch(option) {
+ case 'deadline':
+ this._timeout = options.deadline;
+ break;
+ case 'response':
+ this._responseTimeout = options.response;
+ break;
+ default:
+ console.warn("Unknown timeout option", option);
+ }
+ }
+ return this;
+};
+
+/**
+ * Set number of retry attempts on error.
+ *
+ * Failed requests will be retried 'count' times if timeout or err.code >= 500.
+ *
+ * @param {Number} count
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.retry = function retry(count){
+ // Default to 1 if no count passed or true
+ if (arguments.length === 0 || count === true) count = 1;
+ if (count <= 0) count = 0;
+ this._maxRetries = count;
+ this._retries = 0;
+ return this;
+};
+
+/**
+ * Retry request
+ *
+ * @return {Request} for chaining
+ * @api private
+ */
+
+RequestBase.prototype._retry = function() {
+ this.clearTimeout();
+
+ // node
+ if (this.req) {
+ this.req = null;
+ this.req = this.request();
+ }
+
+ this._aborted = false;
+ this.timedout = false;
+
+ return this._end();
+};
+
+/**
+ * Promise support
+ *
+ * @param {Function} resolve
+ * @param {Function} [reject]
+ * @return {Request}
+ */
+
+RequestBase.prototype.then = function then(resolve, reject) {
+ if (!this._fullfilledPromise) {
+ var self = this;
+ if (this._endCalled) {
+ console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises");
+ }
+ this._fullfilledPromise = new Promise(function(innerResolve, innerReject){
+ self.end(function(err, res){
+ if (err) innerReject(err); else innerResolve(res);
+ });
+ });
+ }
+ return this._fullfilledPromise.then(resolve, reject);
+}
+
+RequestBase.prototype.catch = function(cb) {
+ return this.then(undefined, cb);
+};
+
+/**
+ * Allow for extension
+ */
+
+RequestBase.prototype.use = function use(fn) {
+ fn(this);
+ return this;
+}
+
+RequestBase.prototype.ok = function(cb) {
+ if ('function' !== typeof cb) throw Error("Callback required");
+ this._okCallback = cb;
+ return this;
+};
+
+RequestBase.prototype._isResponseOK = function(res) {
+ if (!res) {
+ return false;
+ }
+
+ if (this._okCallback) {
+ return this._okCallback(res);
+ }
+
+ return res.status >= 200 && res.status < 300;
+};
+
+
+/**
+ * Get request header `field`.
+ * Case-insensitive.
+ *
+ * @param {String} field
+ * @return {String}
+ * @api public
+ */
+
+RequestBase.prototype.get = function(field){
+ return this._header[field.toLowerCase()];
+};
+
+/**
+ * Get case-insensitive header `field` value.
+ * This is a deprecated internal API. Use `.get(field)` instead.
+ *
+ * (getHeader is no longer used internally by the superagent code base)
+ *
+ * @param {String} field
+ * @return {String}
+ * @api private
+ * @deprecated
+ */
+
+RequestBase.prototype.getHeader = RequestBase.prototype.get;
+
+/**
+ * Set header `field` to `val`, or multiple fields with one object.
+ * Case-insensitive.
+ *
+ * Examples:
+ *
+ * req.get('/')
+ * .set('Accept', 'application/json')
+ * .set('X-API-Key', 'foobar')
+ * .end(callback);
+ *
+ * req.get('/')
+ * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })
+ * .end(callback);
+ *
+ * @param {String|Object} field
+ * @param {String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.set = function(field, val){
+ if (isObject(field)) {
+ for (var key in field) {
+ this.set(key, field[key]);
+ }
+ return this;
+ }
+ this._header[field.toLowerCase()] = val;
+ this.header[field] = val;
+ return this;
+};
+
+/**
+ * Remove header `field`.
+ * Case-insensitive.
+ *
+ * Example:
+ *
+ * req.get('/')
+ * .unset('User-Agent')
+ * .end(callback);
+ *
+ * @param {String} field
+ */
+RequestBase.prototype.unset = function(field){
+ delete this._header[field.toLowerCase()];
+ delete this.header[field];
+ return this;
+};
+
+/**
+ * Write the field `name` and `val`, or multiple fields with one object
+ * for "multipart/form-data" request bodies.
+ *
+ * ``` js
+ * request.post('/upload')
+ * .field('foo', 'bar')
+ * .end(callback);
+ *
+ * request.post('/upload')
+ * .field({ foo: 'bar', baz: 'qux' })
+ * .end(callback);
+ * ```
+ *
+ * @param {String|Object} name
+ * @param {String|Blob|File|Buffer|fs.ReadStream} val
+ * @return {Request} for chaining
+ * @api public
+ */
+RequestBase.prototype.field = function(name, val) {
+
+ // name should be either a string or an object.
+ if (null === name || undefined === name) {
+ throw new Error('.field(name, val) name can not be empty');
+ }
+
+ if (this._data) {
+ console.error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()");
+ }
+
+ if (isObject(name)) {
+ for (var key in name) {
+ this.field(key, name[key]);
+ }
+ return this;
+ }
+
+ if (Array.isArray(val)) {
+ for (var i in val) {
+ this.field(name, val[i]);
+ }
+ return this;
+ }
+
+ // val should be defined now
+ if (null === val || undefined === val) {
+ throw new Error('.field(name, val) val can not be empty');
+ }
+ if ('boolean' === typeof val) {
+ val = '' + val;
+ }
+ this._getFormData().append(name, val);
+ return this;
+};
+
+/**
+ * Abort the request, and clear potential timeout.
+ *
+ * @return {Request}
+ * @api public
+ */
+RequestBase.prototype.abort = function(){
+ if (this._aborted) {
+ return this;
+ }
+ this._aborted = true;
+ this.xhr && this.xhr.abort(); // browser
+ this.req && this.req.abort(); // node
+ this.clearTimeout();
+ this.emit('abort');
+ return this;
+};
+
+/**
+ * Enable transmission of cookies with x-domain requests.
+ *
+ * Note that for this to work the origin must not be
+ * using "Access-Control-Allow-Origin" with a wildcard,
+ * and also must set "Access-Control-Allow-Credentials"
+ * to "true".
+ *
+ * @api public
+ */
+
+RequestBase.prototype.withCredentials = function(on){
+ // This is browser-only functionality. Node side is no-op.
+ if(on==undefined) on = true;
+ this._withCredentials = on;
+ return this;
+};
+
+/**
+ * Set the max redirects to `n`. Does noting in browser XHR implementation.
+ *
+ * @param {Number} n
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.redirects = function(n){
+ this._maxRedirects = n;
+ return this;
+};
+
+/**
+ * Convert to a plain javascript object (not JSON string) of scalar properties.
+ * Note as this method is designed to return a useful non-this value,
+ * it cannot be chained.
+ *
+ * @return {Object} describing method, url, and data of this request
+ * @api public
+ */
+
+RequestBase.prototype.toJSON = function(){
+ return {
+ method: this.method,
+ url: this.url,
+ data: this._data,
+ headers: this._header
+ };
+};
+
+
+/**
+ * Send `data` as the request body, defaulting the `.type()` to "json" when
+ * an object is given.
+ *
+ * Examples:
+ *
+ * // manual json
+ * request.post('/user')
+ * .type('json')
+ * .send('{"name":"tj"}')
+ * .end(callback)
+ *
+ * // auto json
+ * request.post('/user')
+ * .send({ name: 'tj' })
+ * .end(callback)
+ *
+ * // manual x-www-form-urlencoded
+ * request.post('/user')
+ * .type('form')
+ * .send('name=tj')
+ * .end(callback)
+ *
+ * // auto x-www-form-urlencoded
+ * request.post('/user')
+ * .type('form')
+ * .send({ name: 'tj' })
+ * .end(callback)
+ *
+ * // defaults to x-www-form-urlencoded
+ * request.post('/user')
+ * .send('name=tobi')
+ * .send('species=ferret')
+ * .end(callback)
+ *
+ * @param {String|Object} data
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.send = function(data){
+ var isObj = isObject(data);
+ var type = this._header['content-type'];
+
+ if (this._formData) {
+ console.error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()");
+ }
+
+ if (isObj && !this._data) {
+ if (Array.isArray(data)) {
+ this._data = [];
+ } else if (!this._isHost(data)) {
+ this._data = {};
+ }
+ } else if (data && this._data && this._isHost(this._data)) {
+ throw Error("Can't merge these send calls");
+ }
+
+ // merge
+ if (isObj && isObject(this._data)) {
+ for (var key in data) {
+ this._data[key] = data[key];
+ }
+ } else if ('string' == typeof data) {
+ // default to x-www-form-urlencoded
+ if (!type) this.type('form');
+ type = this._header['content-type'];
+ if ('application/x-www-form-urlencoded' == type) {
+ this._data = this._data
+ ? this._data + '&' + data
+ : data;
+ } else {
+ this._data = (this._data || '') + data;
+ }
+ } else {
+ this._data = data;
+ }
+
+ if (!isObj || this._isHost(data)) {
+ return this;
+ }
+
+ // default to json
+ if (!type) this.type('json');
+ return this;
+};
+
+
+/**
+ * Sort `querystring` by the sort function
+ *
+ *
+ * Examples:
+ *
+ * // default order
+ * request.get('/user')
+ * .query('name=Nick')
+ * .query('search=Manny')
+ * .sortQuery()
+ * .end(callback)
+ *
+ * // customized sort function
+ * request.get('/user')
+ * .query('name=Nick')
+ * .query('search=Manny')
+ * .sortQuery(function(a, b){
+ * return a.length - b.length;
+ * })
+ * .end(callback)
+ *
+ *
+ * @param {Function} sort
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.sortQuery = function(sort) {
+ // _sort default to true but otherwise can be a function or boolean
+ this._sort = typeof sort === 'undefined' ? true : sort;
+ return this;
+};
+
+/**
+ * Invoke callback with timeout error.
+ *
+ * @api private
+ */
+
+RequestBase.prototype._timeoutError = function(reason, timeout, errno){
+ if (this._aborted) {
+ return;
+ }
+ var err = new Error(reason + timeout + 'ms exceeded');
+ err.timeout = timeout;
+ err.code = 'ECONNABORTED';
+ err.errno = errno;
+ this.timedout = true;
+ this.abort();
+ this.callback(err);
+};
+
+RequestBase.prototype._setTimeouts = function() {
+ var self = this;
+
+ // deadline
+ if (this._timeout && !this._timer) {
+ this._timer = setTimeout(function(){
+ self._timeoutError('Timeout of ', self._timeout, 'ETIME');
+ }, this._timeout);
+ }
+ // response timeout
+ if (this._responseTimeout && !this._responseTimeoutTimer) {
+ this._responseTimeoutTimer = setTimeout(function(){
+ self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT');
+ }, this._responseTimeout);
+ }
+}
diff --git a/node_modules/superagent/lib/response-base.js b/node_modules/superagent/lib/response-base.js
new file mode 100644
index 0000000..e7fdde7
--- /dev/null
+++ b/node_modules/superagent/lib/response-base.js
@@ -0,0 +1,133 @@
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('./utils');
+
+/**
+ * Expose `ResponseBase`.
+ */
+
+module.exports = ResponseBase;
+
+/**
+ * Initialize a new `ResponseBase`.
+ *
+ * @api public
+ */
+
+function ResponseBase(obj) {
+ if (obj) return mixin(obj);
+}
+
+/**
+ * Mixin the prototype properties.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function mixin(obj) {
+ for (var key in ResponseBase.prototype) {
+ obj[key] = ResponseBase.prototype[key];
+ }
+ return obj;
+}
+
+/**
+ * Get case-insensitive `field` value.
+ *
+ * @param {String} field
+ * @return {String}
+ * @api public
+ */
+
+ResponseBase.prototype.get = function(field){
+ return this.header[field.toLowerCase()];
+};
+
+/**
+ * Set header related properties:
+ *
+ * - `.type` the content type without params
+ *
+ * A response of "Content-Type: text/plain; charset=utf-8"
+ * will provide you with a `.type` of "text/plain".
+ *
+ * @param {Object} header
+ * @api private
+ */
+
+ResponseBase.prototype._setHeaderProperties = function(header){
+ // TODO: moar!
+ // TODO: make this a util
+
+ // content-type
+ var ct = header['content-type'] || '';
+ this.type = utils.type(ct);
+
+ // params
+ var params = utils.params(ct);
+ for (var key in params) this[key] = params[key];
+
+ this.links = {};
+
+ // links
+ try {
+ if (header.link) {
+ this.links = utils.parseLinks(header.link);
+ }
+ } catch (err) {
+ // ignore
+ }
+};
+
+/**
+ * Set flags such as `.ok` based on `status`.
+ *
+ * For example a 2xx response will give you a `.ok` of __true__
+ * whereas 5xx will be __false__ and `.error` will be __true__. The
+ * `.clientError` and `.serverError` are also available to be more
+ * specific, and `.statusType` is the class of error ranging from 1..5
+ * sometimes useful for mapping respond colors etc.
+ *
+ * "sugar" properties are also defined for common cases. Currently providing:
+ *
+ * - .noContent
+ * - .badRequest
+ * - .unauthorized
+ * - .notAcceptable
+ * - .notFound
+ *
+ * @param {Number} status
+ * @api private
+ */
+
+ResponseBase.prototype._setStatusProperties = function(status){
+ var type = status / 100 | 0;
+
+ // status / class
+ this.status = this.statusCode = status;
+ this.statusType = type;
+
+ // basics
+ this.info = 1 == type;
+ this.ok = 2 == type;
+ this.redirect = 3 == type;
+ this.clientError = 4 == type;
+ this.serverError = 5 == type;
+ this.error = (4 == type || 5 == type)
+ ? this.toError()
+ : false;
+
+ // sugar
+ this.accepted = 202 == status;
+ this.noContent = 204 == status;
+ this.badRequest = 400 == status;
+ this.unauthorized = 401 == status;
+ this.notAcceptable = 406 == status;
+ this.forbidden = 403 == status;
+ this.notFound = 404 == status;
+};
diff --git a/node_modules/superagent/lib/should-retry.js b/node_modules/superagent/lib/should-retry.js
new file mode 100644
index 0000000..ce0af38
--- /dev/null
+++ b/node_modules/superagent/lib/should-retry.js
@@ -0,0 +1,23 @@
+var ERROR_CODES = [
+ 'ECONNRESET',
+ 'ETIMEDOUT',
+ 'EADDRINFO',
+ 'ESOCKETTIMEDOUT'
+];
+
+/**
+ * Determine if a request should be retried.
+ * (Borrowed from segmentio/superagent-retry)
+ *
+ * @param {Error} err
+ * @param {Response} [res]
+ * @returns {Boolean}
+ */
+module.exports = function shouldRetry(err, res) {
+ if (err && err.code && ~ERROR_CODES.indexOf(err.code)) return true;
+ if (res && res.status && res.status >= 500) return true;
+ // Superagent timeout
+ if (err && 'timeout' in err && err.code == 'ECONNABORTED') return true;
+ if (err && 'crossDomain' in err) return true;
+ return false;
+};
diff --git a/node_modules/superagent/lib/utils.js b/node_modules/superagent/lib/utils.js
new file mode 100644
index 0000000..9bf1285
--- /dev/null
+++ b/node_modules/superagent/lib/utils.js
@@ -0,0 +1,68 @@
+
+/**
+ * Return the mime type for the given `str`.
+ *
+ * @param {String} str
+ * @return {String}
+ * @api private
+ */
+
+exports.type = function(str){
+ return str.split(/ *; */).shift();
+};
+
+/**
+ * Return header field parameters.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+exports.params = function(str){
+ return str.split(/ *; */).reduce(function(obj, str){
+ var parts = str.split(/ *= */);
+ var key = parts.shift();
+ var val = parts.shift();
+
+ if (key && val) obj[key] = val;
+ return obj;
+ }, {});
+};
+
+/**
+ * Parse Link header fields.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+exports.parseLinks = function(str){
+ return str.split(/ *, */).reduce(function(obj, str){
+ var parts = str.split(/ *; */);
+ var url = parts[0].slice(1, -1);
+ var rel = parts[1].split(/ *= */)[1].slice(1, -1);
+ obj[rel] = url;
+ return obj;
+ }, {});
+};
+
+/**
+ * Strip content related fields from `header`.
+ *
+ * @param {Object} header
+ * @return {Object} header
+ * @api private
+ */
+
+exports.cleanHeader = function(header, shouldStripCookie){
+ delete header['content-type'];
+ delete header['content-length'];
+ delete header['transfer-encoding'];
+ delete header['host'];
+ if (shouldStripCookie) {
+ delete header['cookie'];
+ }
+ return header;
+}; \ No newline at end of file
diff --git a/node_modules/superagent/package.json b/node_modules/superagent/package.json
new file mode 100644
index 0000000..7d370a5
--- /dev/null
+++ b/node_modules/superagent/package.json
@@ -0,0 +1,178 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "superagent@^3.3.0",
+ "scope": null,
+ "escapedName": "superagent",
+ "name": "superagent",
+ "rawSpec": "^3.3.0",
+ "spec": ">=3.3.0 <4.0.0",
+ "type": "range"
+ },
+ "F:\\Coding\\JavaScript\\AleeBot\\node_modules\\discord.js"
+ ]
+ ],
+ "_from": "superagent@>=3.3.0 <4.0.0",
+ "_id": "superagent@3.5.2",
+ "_inCache": true,
+ "_location": "/superagent",
+ "_nodeVersion": "7.7.3",
+ "_npmOperationalInternal": {
+ "host": "packages-18-east.internal.npmjs.com",
+ "tmp": "tmp/superagent-3.5.2.tgz_1490192709793_0.7011477949563414"
+ },
+ "_npmUser": {
+ "name": "kornel",
+ "email": "pornel@pornel.net"
+ },
+ "_npmVersion": "4.1.2",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "superagent@^3.3.0",
+ "scope": null,
+ "escapedName": "superagent",
+ "name": "superagent",
+ "rawSpec": "^3.3.0",
+ "spec": ">=3.3.0 <4.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/discord.js"
+ ],
+ "_resolved": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz",
+ "_shasum": "3361a3971567504c351063abeaae0faa23dbf3f8",
+ "_shrinkwrap": null,
+ "_spec": "superagent@^3.3.0",
+ "_where": "F:\\Coding\\JavaScript\\AleeBot\\node_modules\\discord.js",
+ "author": {
+ "name": "TJ Holowaychuk",
+ "email": "tj@vision-media.ca"
+ },
+ "browser": {
+ "./lib/node/index.js": "./lib/client.js",
+ "./test/support/server.js": "./test/support/blank.js"
+ },
+ "bugs": {
+ "url": "https://github.com/visionmedia/superagent/issues"
+ },
+ "component": {
+ "scripts": {
+ "superagent": "lib/client.js"
+ }
+ },
+ "contributors": [
+ {
+ "name": "Kornel Lesiński",
+ "email": "kornel@geekhood.net"
+ },
+ {
+ "name": "Peter Lyons",
+ "email": "pete@peterlyons.com"
+ },
+ {
+ "name": "Hunter Loftis",
+ "email": "hunter@hunterloftis.com"
+ }
+ ],
+ "dependencies": {
+ "component-emitter": "^1.2.0",
+ "cookiejar": "^2.0.6",
+ "debug": "^2.2.0",
+ "extend": "^3.0.0",
+ "form-data": "^2.1.1",
+ "formidable": "^1.1.1",
+ "methods": "^1.1.1",
+ "mime": "^1.3.4",
+ "qs": "^6.1.0",
+ "readable-stream": "^2.0.5"
+ },
+ "description": "elegant & feature rich browser / node HTTP with a fluent API",
+ "devDependencies": {
+ "Base64": "^1.0.0",
+ "basic-auth-connect": "^1.0.0",
+ "body-parser": "^1.15.0",
+ "browserify": "^14.0.0",
+ "cookie-parser": "^1.4.1",
+ "express": "^4.13.4",
+ "express-session": "^1.13.0",
+ "marked": "^0.3.5",
+ "mocha": "^3.1.2",
+ "multer": "^1.2.0",
+ "should": "^11.1.1",
+ "should-http": "^0.0.4",
+ "zuul": "^3.11.1"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "3361a3971567504c351063abeaae0faa23dbf3f8",
+ "tarball": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ },
+ "gitHead": "ef9af6c85b2b1a0cf5f350bece2f7e33d89b888a",
+ "homepage": "https://github.com/visionmedia/superagent#readme",
+ "keywords": [
+ "http",
+ "ajax",
+ "request",
+ "agent"
+ ],
+ "license": "MIT",
+ "main": "./lib/node/index.js",
+ "maintainers": [
+ {
+ "name": "defunctzombie",
+ "email": "shtylman@gmail.com"
+ },
+ {
+ "name": "kof",
+ "email": "oleg008@gmail.com"
+ },
+ {
+ "name": "kornel",
+ "email": "pornel@pornel.net"
+ },
+ {
+ "name": "naman34",
+ "email": "naman34@gmail.com"
+ },
+ {
+ "name": "nw",
+ "email": "nw@nwhite.net"
+ },
+ {
+ "name": "rauchg",
+ "email": "rauchg@gmail.com"
+ },
+ {
+ "name": "superjoe",
+ "email": "superjoe30@gmail.com"
+ },
+ {
+ "name": "tjholowaychuk",
+ "email": "tj@vision-media.ca"
+ },
+ {
+ "name": "travisjeffery",
+ "email": "tj@travisjeffery.com"
+ },
+ {
+ "name": "yields",
+ "email": "yields@icloud.com"
+ }
+ ],
+ "name": "superagent",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/visionmedia/superagent.git"
+ },
+ "scripts": {
+ "prepublish": "make all",
+ "test": "make test"
+ },
+ "version": "3.5.2"
+}
diff --git a/node_modules/superagent/superagent.js b/node_modules/superagent/superagent.js
new file mode 100644
index 0000000..39d61c7
--- /dev/null
+++ b/node_modules/superagent/superagent.js
@@ -0,0 +1,1956 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.superagent = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+/**
+ * Check if `fn` is a function.
+ *
+ * @param {Function} fn
+ * @return {Boolean}
+ * @api private
+ */
+var isObject = require('./is-object');
+
+function isFunction(fn) {
+ var tag = isObject(fn) ? Object.prototype.toString.call(fn) : '';
+ return tag === '[object Function]';
+}
+
+module.exports = isFunction;
+
+},{"./is-object":2}],2:[function(require,module,exports){
+/**
+ * Check if `obj` is an object.
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+
+function isObject(obj) {
+ return null !== obj && 'object' === typeof obj;
+}
+
+module.exports = isObject;
+
+},{}],3:[function(require,module,exports){
+/**
+ * Module of mixed-in functions shared between node and client code
+ */
+var isObject = require('./is-object');
+
+/**
+ * Expose `RequestBase`.
+ */
+
+module.exports = RequestBase;
+
+/**
+ * Initialize a new `RequestBase`.
+ *
+ * @api public
+ */
+
+function RequestBase(obj) {
+ if (obj) return mixin(obj);
+}
+
+/**
+ * Mixin the prototype properties.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function mixin(obj) {
+ for (var key in RequestBase.prototype) {
+ obj[key] = RequestBase.prototype[key];
+ }
+ return obj;
+}
+
+/**
+ * Clear previous timeout.
+ *
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.clearTimeout = function _clearTimeout(){
+ clearTimeout(this._timer);
+ clearTimeout(this._responseTimeoutTimer);
+ delete this._timer;
+ delete this._responseTimeoutTimer;
+ return this;
+};
+
+/**
+ * Override default response body parser
+ *
+ * This function will be called to convert incoming data into request.body
+ *
+ * @param {Function}
+ * @api public
+ */
+
+RequestBase.prototype.parse = function parse(fn){
+ this._parser = fn;
+ return this;
+};
+
+/**
+ * Set format of binary response body.
+ * In browser valid formats are 'blob' and 'arraybuffer',
+ * which return Blob and ArrayBuffer, respectively.
+ *
+ * In Node all values result in Buffer.
+ *
+ * Examples:
+ *
+ * req.get('/')
+ * .responseType('blob')
+ * .end(callback);
+ *
+ * @param {String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.responseType = function(val){
+ this._responseType = val;
+ return this;
+};
+
+/**
+ * Override default request body serializer
+ *
+ * This function will be called to convert data set via .send or .attach into payload to send
+ *
+ * @param {Function}
+ * @api public
+ */
+
+RequestBase.prototype.serialize = function serialize(fn){
+ this._serializer = fn;
+ return this;
+};
+
+/**
+ * Set timeouts.
+ *
+ * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time.
+ * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections.
+ *
+ * Value of 0 or false means no timeout.
+ *
+ * @param {Number|Object} ms or {response, read, deadline}
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.timeout = function timeout(options){
+ if (!options || 'object' !== typeof options) {
+ this._timeout = options;
+ this._responseTimeout = 0;
+ return this;
+ }
+
+ for(var option in options) {
+ switch(option) {
+ case 'deadline':
+ this._timeout = options.deadline;
+ break;
+ case 'response':
+ this._responseTimeout = options.response;
+ break;
+ default:
+ console.warn("Unknown timeout option", option);
+ }
+ }
+ return this;
+};
+
+/**
+ * Set number of retry attempts on error.
+ *
+ * Failed requests will be retried 'count' times if timeout or err.code >= 500.
+ *
+ * @param {Number} count
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.retry = function retry(count){
+ // Default to 1 if no count passed or true
+ if (arguments.length === 0 || count === true) count = 1;
+ if (count <= 0) count = 0;
+ this._maxRetries = count;
+ this._retries = 0;
+ return this;
+};
+
+/**
+ * Retry request
+ *
+ * @return {Request} for chaining
+ * @api private
+ */
+
+RequestBase.prototype._retry = function() {
+ this.clearTimeout();
+
+ // node
+ if (this.req) {
+ this.req = null;
+ this.req = this.request();
+ }
+
+ this._aborted = false;
+ this.timedout = false;
+
+ return this._end();
+};
+
+/**
+ * Promise support
+ *
+ * @param {Function} resolve
+ * @param {Function} [reject]
+ * @return {Request}
+ */
+
+RequestBase.prototype.then = function then(resolve, reject) {
+ if (!this._fullfilledPromise) {
+ var self = this;
+ if (this._endCalled) {
+ console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises");
+ }
+ this._fullfilledPromise = new Promise(function(innerResolve, innerReject){
+ self.end(function(err, res){
+ if (err) innerReject(err); else innerResolve(res);
+ });
+ });
+ }
+ return this._fullfilledPromise.then(resolve, reject);
+}
+
+RequestBase.prototype.catch = function(cb) {
+ return this.then(undefined, cb);
+};
+
+/**
+ * Allow for extension
+ */
+
+RequestBase.prototype.use = function use(fn) {
+ fn(this);
+ return this;
+}
+
+RequestBase.prototype.ok = function(cb) {
+ if ('function' !== typeof cb) throw Error("Callback required");
+ this._okCallback = cb;
+ return this;
+};
+
+RequestBase.prototype._isResponseOK = function(res) {
+ if (!res) {
+ return false;
+ }
+
+ if (this._okCallback) {
+ return this._okCallback(res);
+ }
+
+ return res.status >= 200 && res.status < 300;
+};
+
+
+/**
+ * Get request header `field`.
+ * Case-insensitive.
+ *
+ * @param {String} field
+ * @return {String}
+ * @api public
+ */
+
+RequestBase.prototype.get = function(field){
+ return this._header[field.toLowerCase()];
+};
+
+/**
+ * Get case-insensitive header `field` value.
+ * This is a deprecated internal API. Use `.get(field)` instead.
+ *
+ * (getHeader is no longer used internally by the superagent code base)
+ *
+ * @param {String} field
+ * @return {String}
+ * @api private
+ * @deprecated
+ */
+
+RequestBase.prototype.getHeader = RequestBase.prototype.get;
+
+/**
+ * Set header `field` to `val`, or multiple fields with one object.
+ * Case-insensitive.
+ *
+ * Examples:
+ *
+ * req.get('/')
+ * .set('Accept', 'application/json')
+ * .set('X-API-Key', 'foobar')
+ * .end(callback);
+ *
+ * req.get('/')
+ * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })
+ * .end(callback);
+ *
+ * @param {String|Object} field
+ * @param {String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.set = function(field, val){
+ if (isObject(field)) {
+ for (var key in field) {
+ this.set(key, field[key]);
+ }
+ return this;
+ }
+ this._header[field.toLowerCase()] = val;
+ this.header[field] = val;
+ return this;
+};
+
+/**
+ * Remove header `field`.
+ * Case-insensitive.
+ *
+ * Example:
+ *
+ * req.get('/')
+ * .unset('User-Agent')
+ * .end(callback);
+ *
+ * @param {String} field
+ */
+RequestBase.prototype.unset = function(field){
+ delete this._header[field.toLowerCase()];
+ delete this.header[field];
+ return this;
+};
+
+/**
+ * Write the field `name` and `val`, or multiple fields with one object
+ * for "multipart/form-data" request bodies.
+ *
+ * ``` js
+ * request.post('/upload')
+ * .field('foo', 'bar')
+ * .end(callback);
+ *
+ * request.post('/upload')
+ * .field({ foo: 'bar', baz: 'qux' })
+ * .end(callback);
+ * ```
+ *
+ * @param {String|Object} name
+ * @param {String|Blob|File|Buffer|fs.ReadStream} val
+ * @return {Request} for chaining
+ * @api public
+ */
+RequestBase.prototype.field = function(name, val) {
+
+ // name should be either a string or an object.
+ if (null === name || undefined === name) {
+ throw new Error('.field(name, val) name can not be empty');
+ }
+
+ if (this._data) {
+ console.error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()");
+ }
+
+ if (isObject(name)) {
+ for (var key in name) {
+ this.field(key, name[key]);
+ }
+ return this;
+ }
+
+ if (Array.isArray(val)) {
+ for (var i in val) {
+ this.field(name, val[i]);
+ }
+ return this;
+ }
+
+ // val should be defined now
+ if (null === val || undefined === val) {
+ throw new Error('.field(name, val) val can not be empty');
+ }
+ if ('boolean' === typeof val) {
+ val = '' + val;
+ }
+ this._getFormData().append(name, val);
+ return this;
+};
+
+/**
+ * Abort the request, and clear potential timeout.
+ *
+ * @return {Request}
+ * @api public
+ */
+RequestBase.prototype.abort = function(){
+ if (this._aborted) {
+ return this;
+ }
+ this._aborted = true;
+ this.xhr && this.xhr.abort(); // browser
+ this.req && this.req.abort(); // node
+ this.clearTimeout();
+ this.emit('abort');
+ return this;
+};
+
+/**
+ * Enable transmission of cookies with x-domain requests.
+ *
+ * Note that for this to work the origin must not be
+ * using "Access-Control-Allow-Origin" with a wildcard,
+ * and also must set "Access-Control-Allow-Credentials"
+ * to "true".
+ *
+ * @api public
+ */
+
+RequestBase.prototype.withCredentials = function(on){
+ // This is browser-only functionality. Node side is no-op.
+ if(on==undefined) on = true;
+ this._withCredentials = on;
+ return this;
+};
+
+/**
+ * Set the max redirects to `n`. Does noting in browser XHR implementation.
+ *
+ * @param {Number} n
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.redirects = function(n){
+ this._maxRedirects = n;
+ return this;
+};
+
+/**
+ * Convert to a plain javascript object (not JSON string) of scalar properties.
+ * Note as this method is designed to return a useful non-this value,
+ * it cannot be chained.
+ *
+ * @return {Object} describing method, url, and data of this request
+ * @api public
+ */
+
+RequestBase.prototype.toJSON = function(){
+ return {
+ method: this.method,
+ url: this.url,
+ data: this._data,
+ headers: this._header
+ };
+};
+
+
+/**
+ * Send `data` as the request body, defaulting the `.type()` to "json" when
+ * an object is given.
+ *
+ * Examples:
+ *
+ * // manual json
+ * request.post('/user')
+ * .type('json')
+ * .send('{"name":"tj"}')
+ * .end(callback)
+ *
+ * // auto json
+ * request.post('/user')
+ * .send({ name: 'tj' })
+ * .end(callback)
+ *
+ * // manual x-www-form-urlencoded
+ * request.post('/user')
+ * .type('form')
+ * .send('name=tj')
+ * .end(callback)
+ *
+ * // auto x-www-form-urlencoded
+ * request.post('/user')
+ * .type('form')
+ * .send({ name: 'tj' })
+ * .end(callback)
+ *
+ * // defaults to x-www-form-urlencoded
+ * request.post('/user')
+ * .send('name=tobi')
+ * .send('species=ferret')
+ * .end(callback)
+ *
+ * @param {String|Object} data
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.send = function(data){
+ var isObj = isObject(data);
+ var type = this._header['content-type'];
+
+ if (this._formData) {
+ console.error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()");
+ }
+
+ if (isObj && !this._data) {
+ if (Array.isArray(data)) {
+ this._data = [];
+ } else if (!this._isHost(data)) {
+ this._data = {};
+ }
+ } else if (data && this._data && this._isHost(this._data)) {
+ throw Error("Can't merge these send calls");
+ }
+
+ // merge
+ if (isObj && isObject(this._data)) {
+ for (var key in data) {
+ this._data[key] = data[key];
+ }
+ } else if ('string' == typeof data) {
+ // default to x-www-form-urlencoded
+ if (!type) this.type('form');
+ type = this._header['content-type'];
+ if ('application/x-www-form-urlencoded' == type) {
+ this._data = this._data
+ ? this._data + '&' + data
+ : data;
+ } else {
+ this._data = (this._data || '') + data;
+ }
+ } else {
+ this._data = data;
+ }
+
+ if (!isObj || this._isHost(data)) {
+ return this;
+ }
+
+ // default to json
+ if (!type) this.type('json');
+ return this;
+};
+
+
+/**
+ * Sort `querystring` by the sort function
+ *
+ *
+ * Examples:
+ *
+ * // default order
+ * request.get('/user')
+ * .query('name=Nick')
+ * .query('search=Manny')
+ * .sortQuery()
+ * .end(callback)
+ *
+ * // customized sort function
+ * request.get('/user')
+ * .query('name=Nick')
+ * .query('search=Manny')
+ * .sortQuery(function(a, b){
+ * return a.length - b.length;
+ * })
+ * .end(callback)
+ *
+ *
+ * @param {Function} sort
+ * @return {Request} for chaining
+ * @api public
+ */
+
+RequestBase.prototype.sortQuery = function(sort) {
+ // _sort default to true but otherwise can be a function or boolean
+ this._sort = typeof sort === 'undefined' ? true : sort;
+ return this;
+};
+
+/**
+ * Invoke callback with timeout error.
+ *
+ * @api private
+ */
+
+RequestBase.prototype._timeoutError = function(reason, timeout, errno){
+ if (this._aborted) {
+ return;
+ }
+ var err = new Error(reason + timeout + 'ms exceeded');
+ err.timeout = timeout;
+ err.code = 'ECONNABORTED';
+ err.errno = errno;
+ this.timedout = true;
+ this.abort();
+ this.callback(err);
+};
+
+RequestBase.prototype._setTimeouts = function() {
+ var self = this;
+
+ // deadline
+ if (this._timeout && !this._timer) {
+ this._timer = setTimeout(function(){
+ self._timeoutError('Timeout of ', self._timeout, 'ETIME');
+ }, this._timeout);
+ }
+ // response timeout
+ if (this._responseTimeout && !this._responseTimeoutTimer) {
+ this._responseTimeoutTimer = setTimeout(function(){
+ self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT');
+ }, this._responseTimeout);
+ }
+}
+
+},{"./is-object":2}],4:[function(require,module,exports){
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('./utils');
+
+/**
+ * Expose `ResponseBase`.
+ */
+
+module.exports = ResponseBase;
+
+/**
+ * Initialize a new `ResponseBase`.
+ *
+ * @api public
+ */
+
+function ResponseBase(obj) {
+ if (obj) return mixin(obj);
+}
+
+/**
+ * Mixin the prototype properties.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function mixin(obj) {
+ for (var key in ResponseBase.prototype) {
+ obj[key] = ResponseBase.prototype[key];
+ }
+ return obj;
+}
+
+/**
+ * Get case-insensitive `field` value.
+ *
+ * @param {String} field
+ * @return {String}
+ * @api public
+ */
+
+ResponseBase.prototype.get = function(field){
+ return this.header[field.toLowerCase()];
+};
+
+/**
+ * Set header related properties:
+ *
+ * - `.type` the content type without params
+ *
+ * A response of "Content-Type: text/plain; charset=utf-8"
+ * will provide you with a `.type` of "text/plain".
+ *
+ * @param {Object} header
+ * @api private
+ */
+
+ResponseBase.prototype._setHeaderProperties = function(header){
+ // TODO: moar!
+ // TODO: make this a util
+
+ // content-type
+ var ct = header['content-type'] || '';
+ this.type = utils.type(ct);
+
+ // params
+ var params = utils.params(ct);
+ for (var key in params) this[key] = params[key];
+
+ this.links = {};
+
+ // links
+ try {
+ if (header.link) {
+ this.links = utils.parseLinks(header.link);
+ }
+ } catch (err) {
+ // ignore
+ }
+};
+
+/**
+ * Set flags such as `.ok` based on `status`.
+ *
+ * For example a 2xx response will give you a `.ok` of __true__
+ * whereas 5xx will be __false__ and `.error` will be __true__. The
+ * `.clientError` and `.serverError` are also available to be more
+ * specific, and `.statusType` is the class of error ranging from 1..5
+ * sometimes useful for mapping respond colors etc.
+ *
+ * "sugar" properties are also defined for common cases. Currently providing:
+ *
+ * - .noContent
+ * - .badRequest
+ * - .unauthorized
+ * - .notAcceptable
+ * - .notFound
+ *
+ * @param {Number} status
+ * @api private
+ */
+
+ResponseBase.prototype._setStatusProperties = function(status){
+ var type = status / 100 | 0;
+
+ // status / class
+ this.status = this.statusCode = status;
+ this.statusType = type;
+
+ // basics
+ this.info = 1 == type;
+ this.ok = 2 == type;
+ this.redirect = 3 == type;
+ this.clientError = 4 == type;
+ this.serverError = 5 == type;
+ this.error = (4 == type || 5 == type)
+ ? this.toError()
+ : false;
+
+ // sugar
+ this.accepted = 202 == status;
+ this.noContent = 204 == status;
+ this.badRequest = 400 == status;
+ this.unauthorized = 401 == status;
+ this.notAcceptable = 406 == status;
+ this.forbidden = 403 == status;
+ this.notFound = 404 == status;
+};
+
+},{"./utils":6}],5:[function(require,module,exports){
+var ERROR_CODES = [
+ 'ECONNRESET',
+ 'ETIMEDOUT',
+ 'EADDRINFO',
+ 'ESOCKETTIMEDOUT'
+];
+
+/**
+ * Determine if a request should be retried.
+ * (Borrowed from segmentio/superagent-retry)
+ *
+ * @param {Error} err
+ * @param {Response} [res]
+ * @returns {Boolean}
+ */
+module.exports = function shouldRetry(err, res) {
+ if (err && err.code && ~ERROR_CODES.indexOf(err.code)) return true;
+ if (res && res.status && res.status >= 500) return true;
+ // Superagent timeout
+ if (err && 'timeout' in err && err.code == 'ECONNABORTED') return true;
+ if (err && 'crossDomain' in err) return true;
+ return false;
+};
+
+},{}],6:[function(require,module,exports){
+
+/**
+ * Return the mime type for the given `str`.
+ *
+ * @param {String} str
+ * @return {String}
+ * @api private
+ */
+
+exports.type = function(str){
+ return str.split(/ *; */).shift();
+};
+
+/**
+ * Return header field parameters.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+exports.params = function(str){
+ return str.split(/ *; */).reduce(function(obj, str){
+ var parts = str.split(/ *= */);
+ var key = parts.shift();
+ var val = parts.shift();
+
+ if (key && val) obj[key] = val;
+ return obj;
+ }, {});
+};
+
+/**
+ * Parse Link header fields.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+exports.parseLinks = function(str){
+ return str.split(/ *, */).reduce(function(obj, str){
+ var parts = str.split(/ *; */);
+ var url = parts[0].slice(1, -1);
+ var rel = parts[1].split(/ *= */)[1].slice(1, -1);
+ obj[rel] = url;
+ return obj;
+ }, {});
+};
+
+/**
+ * Strip content related fields from `header`.
+ *
+ * @param {Object} header
+ * @return {Object} header
+ * @api private
+ */
+
+exports.cleanHeader = function(header, shouldStripCookie){
+ delete header['content-type'];
+ delete header['content-length'];
+ delete header['transfer-encoding'];
+ delete header['host'];
+ if (shouldStripCookie) {
+ delete header['cookie'];
+ }
+ return header;
+};
+},{}],7:[function(require,module,exports){
+
+/**
+ * Expose `Emitter`.
+ */
+
+if (typeof module !== 'undefined') {
+ module.exports = Emitter;
+}
+
+/**
+ * Initialize a new `Emitter`.
+ *
+ * @api public
+ */
+
+function Emitter(obj) {
+ if (obj) return mixin(obj);
+};
+
+/**
+ * Mixin the emitter properties.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function mixin(obj) {
+ for (var key in Emitter.prototype) {
+ obj[key] = Emitter.prototype[key];
+ }
+ return obj;
+}
+
+/**
+ * Listen on the given `event` with `fn`.
+ *
+ * @param {String} event
+ * @param {Function} fn
+ * @return {Emitter}
+ * @api public
+ */
+
+Emitter.prototype.on =
+Emitter.prototype.addEventListener = function(event, fn){
+ this._callbacks = this._callbacks || {};
+ (this._callbacks['$' + event] = this._callbacks['$' + event] || [])
+ .push(fn);
+ return this;
+};
+
+/**
+ * Adds an `event` listener that will be invoked a single
+ * time then automatically removed.
+ *
+ * @param {String} event
+ * @param {Function} fn
+ * @return {Emitter}
+ * @api public
+ */
+
+Emitter.prototype.once = function(event, fn){
+ function on() {
+ this.off(event, on);
+ fn.apply(this, arguments);
+ }
+
+ on.fn = fn;
+ this.on(event, on);
+ return this;
+};
+
+/**
+ * Remove the given callback for `event` or all
+ * registered callbacks.
+ *
+ * @param {String} event
+ * @param {Function} fn
+ * @return {Emitter}
+ * @api public
+ */
+
+Emitter.prototype.off =
+Emitter.prototype.removeListener =
+Emitter.prototype.removeAllListeners =
+Emitter.prototype.removeEventListener = function(event, fn){
+ this._callbacks = this._callbacks || {};
+
+ // all
+ if (0 == arguments.length) {
+ this._callbacks = {};
+ return this;
+ }
+
+ // specific event
+ var callbacks = this._callbacks['$' + event];
+ if (!callbacks) return this;
+
+ // remove all handlers
+ if (1 == arguments.length) {
+ delete this._callbacks['$' + event];
+ return this;
+ }
+
+ // remove specific handler
+ var cb;
+ for (var i = 0; i < callbacks.length; i++) {
+ cb = callbacks[i];
+ if (cb === fn || cb.fn === fn) {
+ callbacks.splice(i, 1);
+ break;
+ }
+ }
+ return this;
+};
+
+/**
+ * Emit `event` with the given args.
+ *
+ * @param {String} event
+ * @param {Mixed} ...
+ * @return {Emitter}
+ */
+
+Emitter.prototype.emit = function(event){
+ this._callbacks = this._callbacks || {};
+ var args = [].slice.call(arguments, 1)
+ , callbacks = this._callbacks['$' + event];
+
+ if (callbacks) {
+ callbacks = callbacks.slice(0);
+ for (var i = 0, len = callbacks.length; i < len; ++i) {
+ callbacks[i].apply(this, args);
+ }
+ }
+
+ return this;
+};
+
+/**
+ * Return array of callbacks for `event`.
+ *
+ * @param {String} event
+ * @return {Array}
+ * @api public
+ */
+
+Emitter.prototype.listeners = function(event){
+ this._callbacks = this._callbacks || {};
+ return this._callbacks['$' + event] || [];
+};
+
+/**
+ * Check if this emitter has `event` handlers.
+ *
+ * @param {String} event
+ * @return {Boolean}
+ * @api public
+ */
+
+Emitter.prototype.hasListeners = function(event){
+ return !! this.listeners(event).length;
+};
+
+},{}],8:[function(require,module,exports){
+/**
+ * Root reference for iframes.
+ */
+
+var root;
+if (typeof window !== 'undefined') { // Browser window
+ root = window;
+} else if (typeof self !== 'undefined') { // Web Worker
+ root = self;
+} else { // Other environments
+ console.warn("Using browser-only version of superagent in non-browser environment");
+ root = this;
+}
+
+var Emitter = require('component-emitter');
+var RequestBase = require('./request-base');
+var isObject = require('./is-object');
+var isFunction = require('./is-function');
+var ResponseBase = require('./response-base');
+var shouldRetry = require('./should-retry');
+
+/**
+ * Noop.
+ */
+
+function noop(){};
+
+/**
+ * Expose `request`.
+ */
+
+var request = exports = module.exports = function(method, url) {
+ // callback
+ if ('function' == typeof url) {
+ return new exports.Request('GET', method).end(url);
+ }
+
+ // url first
+ if (1 == arguments.length) {
+ return new exports.Request('GET', method);
+ }
+
+ return new exports.Request(method, url);
+}
+
+exports.Request = Request;
+
+/**
+ * Determine XHR.
+ */
+
+request.getXHR = function () {
+ if (root.XMLHttpRequest
+ && (!root.location || 'file:' != root.location.protocol
+ || !root.ActiveXObject)) {
+ return new XMLHttpRequest;
+ } else {
+ try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
+ try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}
+ try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}
+ try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
+ }
+ throw Error("Browser-only verison of superagent could not find XHR");
+};
+
+/**
+ * Removes leading and trailing whitespace, added to support IE.
+ *
+ * @param {String} s
+ * @return {String}
+ * @api private
+ */
+
+var trim = ''.trim
+ ? function(s) { return s.trim(); }
+ : function(s) { return s.replace(/(^\s*|\s*$)/g, ''); };
+
+/**
+ * Serialize the given `obj`.
+ *
+ * @param {Object} obj
+ * @return {String}
+ * @api private
+ */
+
+function serialize(obj) {
+ if (!isObject(obj)) return obj;
+ var pairs = [];
+ for (var key in obj) {
+ pushEncodedKeyValuePair(pairs, key, obj[key]);
+ }
+ return pairs.join('&');
+}
+
+/**
+ * Helps 'serialize' with serializing arrays.
+ * Mutates the pairs array.
+ *
+ * @param {Array} pairs
+ * @param {String} key
+ * @param {Mixed} val
+ */
+
+function pushEncodedKeyValuePair(pairs, key, val) {
+ if (val != null) {
+ if (Array.isArray(val)) {
+ val.forEach(function(v) {
+ pushEncodedKeyValuePair(pairs, key, v);
+ });
+ } else if (isObject(val)) {
+ for(var subkey in val) {
+ pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);
+ }
+ } else {
+ pairs.push(encodeURIComponent(key)
+ + '=' + encodeURIComponent(val));
+ }
+ } else if (val === null) {
+ pairs.push(encodeURIComponent(key));
+ }
+}
+
+/**
+ * Expose serialization method.
+ */
+
+ request.serializeObject = serialize;
+
+ /**
+ * Parse the given x-www-form-urlencoded `str`.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+function parseString(str) {
+ var obj = {};
+ var pairs = str.split('&');
+ var pair;
+ var pos;
+
+ for (var i = 0, len = pairs.length; i < len; ++i) {
+ pair = pairs[i];
+ pos = pair.indexOf('=');
+ if (pos == -1) {
+ obj[decodeURIComponent(pair)] = '';
+ } else {
+ obj[decodeURIComponent(pair.slice(0, pos))] =
+ decodeURIComponent(pair.slice(pos + 1));
+ }
+ }
+
+ return obj;
+}
+
+/**
+ * Expose parser.
+ */
+
+request.parseString = parseString;
+
+/**
+ * Default MIME type map.
+ *
+ * superagent.types.xml = 'application/xml';
+ *
+ */
+
+request.types = {
+ html: 'text/html',
+ json: 'application/json',
+ xml: 'application/xml',
+ urlencoded: 'application/x-www-form-urlencoded',
+ 'form': 'application/x-www-form-urlencoded',
+ 'form-data': 'application/x-www-form-urlencoded'
+};
+
+/**
+ * Default serialization map.
+ *
+ * superagent.serialize['application/xml'] = function(obj){
+ * return 'generated xml here';
+ * };
+ *
+ */
+
+ request.serialize = {
+ 'application/x-www-form-urlencoded': serialize,
+ 'application/json': JSON.stringify
+ };
+
+ /**
+ * Default parsers.
+ *
+ * superagent.parse['application/xml'] = function(str){
+ * return { object parsed from str };
+ * };
+ *
+ */
+
+request.parse = {
+ 'application/x-www-form-urlencoded': parseString,
+ 'application/json': JSON.parse
+};
+
+/**
+ * Parse the given header `str` into
+ * an object containing the mapped fields.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api private
+ */
+
+function parseHeader(str) {
+ var lines = str.split(/\r?\n/);
+ var fields = {};
+ var index;
+ var line;
+ var field;
+ var val;
+
+ lines.pop(); // trailing CRLF
+
+ for (var i = 0, len = lines.length; i < len; ++i) {
+ line = lines[i];
+ index = line.indexOf(':');
+ field = line.slice(0, index).toLowerCase();
+ val = trim(line.slice(index + 1));
+ fields[field] = val;
+ }
+
+ return fields;
+}
+
+/**
+ * Check if `mime` is json or has +json structured syntax suffix.
+ *
+ * @param {String} mime
+ * @return {Boolean}
+ * @api private
+ */
+
+function isJSON(mime) {
+ return /[\/+]json\b/.test(mime);
+}
+
+/**
+ * Initialize a new `Response` with the given `xhr`.
+ *
+ * - set flags (.ok, .error, etc)
+ * - parse header
+ *
+ * Examples:
+ *
+ * Aliasing `superagent` as `request` is nice:
+ *
+ * request = superagent;
+ *
+ * We can use the promise-like API, or pass callbacks:
+ *
+ * request.get('/').end(function(res){});
+ * request.get('/', function(res){});
+ *
+ * Sending data can be chained:
+ *
+ * request
+ * .post('/user')
+ * .send({ name: 'tj' })
+ * .end(function(res){});
+ *
+ * Or passed to `.send()`:
+ *
+ * request
+ * .post('/user')
+ * .send({ name: 'tj' }, function(res){});
+ *
+ * Or passed to `.post()`:
+ *
+ * request
+ * .post('/user', { name: 'tj' })
+ * .end(function(res){});
+ *
+ * Or further reduced to a single call for simple cases:
+ *
+ * request
+ * .post('/user', { name: 'tj' }, function(res){});
+ *
+ * @param {XMLHTTPRequest} xhr
+ * @param {Object} options
+ * @api private
+ */
+
+function Response(req) {
+ this.req = req;
+ this.xhr = this.req.xhr;
+ // responseText is accessible only if responseType is '' or 'text' and on older browsers
+ this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')
+ ? this.xhr.responseText
+ : null;
+ this.statusText = this.req.xhr.statusText;
+ var status = this.xhr.status;
+ // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request
+ if (status === 1223) {
+ status = 204;
+ }
+ this._setStatusProperties(status);
+ this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());
+ // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but
+ // getResponseHeader still works. so we get content-type even if getting
+ // other headers fails.
+ this.header['content-type'] = this.xhr.getResponseHeader('content-type');
+ this._setHeaderProperties(this.header);
+
+ if (null === this.text && req._responseType) {
+ this.body = this.xhr.response;
+ } else {
+ this.body = this.req.method != 'HEAD'
+ ? this._parseBody(this.text ? this.text : this.xhr.response)
+ : null;
+ }
+}
+
+ResponseBase(Response.prototype);
+
+/**
+ * Parse the given body `str`.
+ *
+ * Used for auto-parsing of bodies. Parsers
+ * are defined on the `superagent.parse` object.
+ *
+ * @param {String} str
+ * @return {Mixed}
+ * @api private
+ */
+
+Response.prototype._parseBody = function(str){
+ var parse = request.parse[this.type];
+ if(this.req._parser) {
+ return this.req._parser(this, str);
+ }
+ if (!parse && isJSON(this.type)) {
+ parse = request.parse['application/json'];
+ }
+ return parse && str && (str.length || str instanceof Object)
+ ? parse(str)
+ : null;
+};
+
+/**
+ * Return an `Error` representative of this response.
+ *
+ * @return {Error}
+ * @api public
+ */
+
+Response.prototype.toError = function(){
+ var req = this.req;
+ var method = req.method;
+ var url = req.url;
+
+ var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';
+ var err = new Error(msg);
+ err.status = this.status;
+ err.method = method;
+ err.url = url;
+
+ return err;
+};
+
+/**
+ * Expose `Response`.
+ */
+
+request.Response = Response;
+
+/**
+ * Initialize a new `Request` with the given `method` and `url`.
+ *
+ * @param {String} method
+ * @param {String} url
+ * @api public
+ */
+
+function Request(method, url) {
+ var self = this;
+ this._query = this._query || [];
+ this.method = method;
+ this.url = url;
+ this.header = {}; // preserves header name case
+ this._header = {}; // coerces header names to lowercase
+ this.on('end', function(){
+ var err = null;
+ var res = null;
+
+ try {
+ res = new Response(self);
+ } catch(e) {
+ err = new Error('Parser is unable to parse the response');
+ err.parse = true;
+ err.original = e;
+ // issue #675: return the raw response if the response parsing fails
+ if (self.xhr) {
+ // ie9 doesn't have 'response' property
+ err.rawResponse = typeof self.xhr.responseType == 'undefined' ? self.xhr.responseText : self.xhr.response;
+ // issue #876: return the http status code if the response parsing fails
+ err.status = self.xhr.status ? self.xhr.status : null;
+ err.statusCode = err.status; // backwards-compat only
+ } else {
+ err.rawResponse = null;
+ err.status = null;
+ }
+
+ return self.callback(err);
+ }
+
+ self.emit('response', res);
+
+ var new_err;
+ try {
+ if (!self._isResponseOK(res)) {
+ new_err = new Error(res.statusText || 'Unsuccessful HTTP response');
+ new_err.original = err;
+ new_err.response = res;
+ new_err.status = res.status;
+ }
+ } catch(e) {
+ new_err = e; // #985 touching res may cause INVALID_STATE_ERR on old Android
+ }
+
+ // #1000 don't catch errors from the callback to avoid double calling it
+ if (new_err) {
+ self.callback(new_err, res);
+ } else {
+ self.callback(null, res);
+ }
+ });
+}
+
+/**
+ * Mixin `Emitter` and `RequestBase`.
+ */
+
+Emitter(Request.prototype);
+RequestBase(Request.prototype);
+
+/**
+ * Set Content-Type to `type`, mapping values from `request.types`.
+ *
+ * Examples:
+ *
+ * superagent.types.xml = 'application/xml';
+ *
+ * request.post('/')
+ * .type('xml')
+ * .send(xmlstring)
+ * .end(callback);
+ *
+ * request.post('/')
+ * .type('application/xml')
+ * .send(xmlstring)
+ * .end(callback);
+ *
+ * @param {String} type
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.type = function(type){
+ this.set('Content-Type', request.types[type] || type);
+ return this;
+};
+
+/**
+ * Set Accept to `type`, mapping values from `request.types`.
+ *
+ * Examples:
+ *
+ * superagent.types.json = 'application/json';
+ *
+ * request.get('/agent')
+ * .accept('json')
+ * .end(callback);
+ *
+ * request.get('/agent')
+ * .accept('application/json')
+ * .end(callback);
+ *
+ * @param {String} accept
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.accept = function(type){
+ this.set('Accept', request.types[type] || type);
+ return this;
+};
+
+/**
+ * Set Authorization field value with `user` and `pass`.
+ *
+ * @param {String} user
+ * @param {String} [pass] optional in case of using 'bearer' as type
+ * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.auth = function(user, pass, options){
+ if (typeof pass === 'object' && pass !== null) { // pass is optional and can substitute for options
+ options = pass;
+ }
+ if (!options) {
+ options = {
+ type: 'function' === typeof btoa ? 'basic' : 'auto',
+ }
+ }
+
+ switch (options.type) {
+ case 'basic':
+ this.set('Authorization', 'Basic ' + btoa(user + ':' + pass));
+ break;
+
+ case 'auto':
+ this.username = user;
+ this.password = pass;
+ break;
+
+ case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' })
+ this.set('Authorization', 'Bearer ' + user);
+ break;
+ }
+ return this;
+};
+
+/**
+ * Add query-string `val`.
+ *
+ * Examples:
+ *
+ * request.get('/shoes')
+ * .query('size=10')
+ * .query({ color: 'blue' })
+ *
+ * @param {Object|String} val
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.query = function(val){
+ if ('string' != typeof val) val = serialize(val);
+ if (val) this._query.push(val);
+ return this;
+};
+
+/**
+ * Queue the given `file` as an attachment to the specified `field`,
+ * with optional `options` (or filename).
+ *
+ * ``` js
+ * request.post('/upload')
+ * .attach('content', new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"}))
+ * .end(callback);
+ * ```
+ *
+ * @param {String} field
+ * @param {Blob|File} file
+ * @param {String|Object} options
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.attach = function(field, file, options){
+ if (file) {
+ if (this._data) {
+ throw Error("superagent can't mix .send() and .attach()");
+ }
+
+ this._getFormData().append(field, file, options || file.name);
+ }
+ return this;
+};
+
+Request.prototype._getFormData = function(){
+ if (!this._formData) {
+ this._formData = new root.FormData();
+ }
+ return this._formData;
+};
+
+/**
+ * Invoke the callback with `err` and `res`
+ * and handle arity check.
+ *
+ * @param {Error} err
+ * @param {Response} res
+ * @api private
+ */
+
+Request.prototype.callback = function(err, res){
+ // console.log(this._retries, this._maxRetries)
+ if (this._maxRetries && this._retries++ < this._maxRetries && shouldRetry(err, res)) {
+ return this._retry();
+ }
+
+ var fn = this._callback;
+ this.clearTimeout();
+
+ if (err) {
+ if (this._maxRetries) err.retries = this._retries - 1;
+ this.emit('error', err);
+ }
+
+ fn(err, res);
+};
+
+/**
+ * Invoke callback with x-domain error.
+ *
+ * @api private
+ */
+
+Request.prototype.crossDomainError = function(){
+ var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');
+ err.crossDomain = true;
+
+ err.status = this.status;
+ err.method = this.method;
+ err.url = this.url;
+
+ this.callback(err);
+};
+
+// This only warns, because the request is still likely to work
+Request.prototype.buffer = Request.prototype.ca = Request.prototype.agent = function(){
+ console.warn("This is not supported in browser version of superagent");
+ return this;
+};
+
+// This throws, because it can't send/receive data as expected
+Request.prototype.pipe = Request.prototype.write = function(){
+ throw Error("Streaming is not supported in browser version of superagent");
+};
+
+/**
+ * Compose querystring to append to req.url
+ *
+ * @api private
+ */
+
+Request.prototype._appendQueryString = function(){
+ var query = this._query.join('&');
+ if (query) {
+ this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + query;
+ }
+
+ if (this._sort) {
+ var index = this.url.indexOf('?');
+ if (index >= 0) {
+ var queryArr = this.url.substring(index + 1).split('&');
+ if (isFunction(this._sort)) {
+ queryArr.sort(this._sort);
+ } else {
+ queryArr.sort();
+ }
+ this.url = this.url.substring(0, index) + '?' + queryArr.join('&');
+ }
+ }
+};
+
+/**
+ * Check if `obj` is a host object,
+ * we don't want to serialize these :)
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+Request.prototype._isHost = function _isHost(obj) {
+ // Native objects stringify to [object File], [object Blob], [object FormData], etc.
+ return obj && 'object' === typeof obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';
+}
+
+/**
+ * Initiate request, invoking callback `fn(res)`
+ * with an instanceof `Response`.
+ *
+ * @param {Function} fn
+ * @return {Request} for chaining
+ * @api public
+ */
+
+Request.prototype.end = function(fn){
+ if (this._endCalled) {
+ console.warn("Warning: .end() was called twice. This is not supported in superagent");
+ }
+ this._endCalled = true;
+
+ // store callback
+ this._callback = fn || noop;
+
+ // querystring
+ this._appendQueryString();
+
+ return this._end();
+};
+
+Request.prototype._end = function() {
+ var self = this;
+ var xhr = this.xhr = request.getXHR();
+ var data = this._formData || this._data;
+
+ this._setTimeouts();
+
+ // state change
+ xhr.onreadystatechange = function(){
+ var readyState = xhr.readyState;
+ if (readyState >= 2 && self._responseTimeoutTimer) {
+ clearTimeout(self._responseTimeoutTimer);
+ }
+ if (4 != readyState) {
+ return;
+ }
+
+ // In IE9, reads to any property (e.g. status) off of an aborted XHR will
+ // result in the error "Could not complete the operation due to error c00c023f"
+ var status;
+ try { status = xhr.status } catch(e) { status = 0; }
+
+ if (!status) {
+ if (self.timedout || self._aborted) return;
+ return self.crossDomainError();
+ }
+ self.emit('end');
+ };
+
+ // progress
+ var handleProgress = function(direction, e) {
+ if (e.total > 0) {
+ e.percent = e.loaded / e.total * 100;
+ }
+ e.direction = direction;
+ self.emit('progress', e);
+ }
+ if (this.hasListeners('progress')) {
+ try {
+ xhr.onprogress = handleProgress.bind(null, 'download');
+ if (xhr.upload) {
+ xhr.upload.onprogress = handleProgress.bind(null, 'upload');
+ }
+ } catch(e) {
+ // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.
+ // Reported here:
+ // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context
+ }
+ }
+
+ // initiate request
+ try {
+ if (this.username && this.password) {
+ xhr.open(this.method, this.url, true, this.username, this.password);
+ } else {
+ xhr.open(this.method, this.url, true);
+ }
+ } catch (err) {
+ // see #1149
+ return this.callback(err);
+ }
+
+ // CORS
+ if (this._withCredentials) xhr.withCredentials = true;
+
+ // body
+ if (!this._formData && 'GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {
+ // serialize stuff
+ var contentType = this._header['content-type'];
+ var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];
+ if (!serialize && isJSON(contentType)) {
+ serialize = request.serialize['application/json'];
+ }
+ if (serialize) data = serialize(data);
+ }
+
+ // set header fields
+ for (var field in this.header) {
+ if (null == this.header[field]) continue;
+
+ if (this.header.hasOwnProperty(field))
+ xhr.setRequestHeader(field, this.header[field]);
+ }
+
+ if (this._responseType) {
+ xhr.responseType = this._responseType;
+ }
+
+ // send stuff
+ this.emit('request', this);
+
+ // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)
+ // We need null here if data is undefined
+ xhr.send(typeof data !== 'undefined' ? data : null);
+ return this;
+};
+
+/**
+ * GET `url` with optional callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.get = function(url, data, fn){
+ var req = request('GET', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.query(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * HEAD `url` with optional callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.head = function(url, data, fn){
+ var req = request('HEAD', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * OPTIONS query to `url` with optional callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.options = function(url, data, fn){
+ var req = request('OPTIONS', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * DELETE `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed} [data]
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+function del(url, data, fn){
+ var req = request('DELETE', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+request['del'] = del;
+request['delete'] = del;
+
+/**
+ * PATCH `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed} [data]
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.patch = function(url, data, fn){
+ var req = request('PATCH', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * POST `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed} [data]
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.post = function(url, data, fn){
+ var req = request('POST', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+/**
+ * PUT `url` with optional `data` and callback `fn(res)`.
+ *
+ * @param {String} url
+ * @param {Mixed|Function} [data] or fn
+ * @param {Function} [fn]
+ * @return {Request}
+ * @api public
+ */
+
+request.put = function(url, data, fn){
+ var req = request('PUT', url);
+ if ('function' == typeof data) fn = data, data = null;
+ if (data) req.send(data);
+ if (fn) req.end(fn);
+ return req;
+};
+
+},{"./is-function":1,"./is-object":2,"./request-base":3,"./response-base":4,"./should-retry":5,"component-emitter":7}]},{},[8])(8)
+}); \ No newline at end of file
diff --git a/node_modules/superagent/yarn.lock b/node_modules/superagent/yarn.lock
new file mode 100644
index 0000000..99696fb
--- /dev/null
+++ b/node_modules/superagent/yarn.lock
@@ -0,0 +1,3658 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+Base64@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/Base64/-/Base64-1.0.0.tgz#b6b73ee342ce64bf66d6003a4536683bf8a349b5"
+
+JSON2@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/JSON2/-/JSON2-0.1.0.tgz#8d7493040a63d5835af75f47decb83ab6c8c0790"
+
+JSONStream@^1.0.3:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5"
+ dependencies:
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
+
+abbrev@1, abbrev@1.0.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+
+accepts@~1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea"
+ dependencies:
+ mime-types "~2.1.6"
+ negotiator "0.5.3"
+
+accepts@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+ dependencies:
+ mime-types "~2.1.11"
+ negotiator "0.6.1"
+
+acorn@^1.0.3:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014"
+
+acorn@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
+
+acorn@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+adm-zip@~0.4.3:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+anymatch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+ dependencies:
+ arrify "^1.0.0"
+ micromatch "^2.1.5"
+
+append-field@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
+
+aproba@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0"
+
+archiver@0.14.x:
+ version "0.14.4"
+ resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.14.4.tgz#5b9ddb9f5ee1ceef21cb8f3b020e6240ecb4315c"
+ dependencies:
+ async "~0.9.0"
+ buffer-crc32 "~0.2.1"
+ glob "~4.3.0"
+ lazystream "~0.1.0"
+ lodash "~3.2.0"
+ readable-stream "~1.0.26"
+ tar-stream "~1.1.0"
+ zip-stream "~0.5.0"
+
+archiver@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.12.0.tgz#b8ccde2508cab9092bb7106630139c0f39a280cc"
+ dependencies:
+ async "~0.9.0"
+ buffer-crc32 "~0.2.1"
+ glob "~4.0.6"
+ lazystream "~0.1.0"
+ lodash "~2.4.1"
+ readable-stream "~1.0.26"
+ tar-stream "~1.0.0"
+ zip-stream "~0.4.0"
+
+archiver@~0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.7.1.tgz#cf152d794f86bbd93f9858da60d36aaeabad9bbf"
+ dependencies:
+ file-utils "~0.1.5"
+ lazystream "~0.1.0"
+ lodash "~2.4.1"
+ readable-stream "~1.0.24"
+ zip-stream "~0.2.0"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.0 || ^1.1.13"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@~0.1.4:
+ version "0.1.16"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c"
+ dependencies:
+ underscore "~1.7.0"
+ underscore.string "~2.4.0"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-map@0.0.0, array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-uniq@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asn1.js@^4.0.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@0.1.11:
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assert@~1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849"
+ dependencies:
+ util "0.10.3"
+
+astw@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astw/-/astw-2.0.0.tgz#08121ac8288d35611c0ceec663f6cd545604897d"
+ dependencies:
+ acorn "^1.0.3"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@0.9.x, async@~0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+
+async@1.x, async@^1.4.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@~0.2.6, async@~0.2.7, async@~0.2.9:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+asyncreduce@~0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/asyncreduce/-/asyncreduce-0.1.4.tgz#18210e01978bfdcba043955497a5cd315c0a6a41"
+ dependencies:
+ runnel "~0.5.0"
+
+aws-sign2@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755"
+
+balanced-match@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+base64-js@^1.0.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64-url@1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.3.3.tgz#f8b6c537f09a4fc58c99cb86e0b0e9c61461a20f"
+
+basic-auth-connect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122"
+
+batch@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.0.tgz#fd2e05a7a5d696b4db9314013e285d8ff3557ec3"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+binary-extensions@^1.0.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
+bl@^0.9.0, bl@~0.9.0:
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054"
+ dependencies:
+ readable-stream "~1.0.26"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ dependencies:
+ inherits "~2.0.0"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+
+body-parser@^1.15.0:
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.16.0.tgz#924a5e472c6229fb9d69b85a20d5f2532dec788b"
+ dependencies:
+ bytes "2.4.0"
+ content-type "~1.0.2"
+ debug "2.6.0"
+ depd "~1.1.0"
+ http-errors "~1.5.1"
+ iconv-lite "0.4.15"
+ on-finished "~2.3.0"
+ qs "6.2.1"
+ raw-body "~2.2.0"
+ type-is "~1.6.14"
+
+body-parser@~1.12.3:
+ version "1.12.4"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.12.4.tgz#090700c4ba28862a8520ef378395fdee5f61c229"
+ dependencies:
+ bytes "1.0.0"
+ content-type "~1.0.1"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ iconv-lite "0.4.8"
+ on-finished "~2.2.1"
+ qs "2.4.2"
+ raw-body "~2.0.1"
+ type-is "~1.6.2"
+
+boom@0.4.x:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b"
+ dependencies:
+ hoek "0.9.x"
+
+boom@2.x.x:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+brace-expansion@^1.0.0:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9"
+ dependencies:
+ balanced-match "^0.4.1"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.6.tgz#4028706b915f91f7b349a2e0bf3c376039d216e5"
+
+browser-pack@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65fbff4531"
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.7.1"
+ defined "^1.0.0"
+ through2 "^2.0.0"
+ umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+ dependencies:
+ resolve "1.1.7"
+
+browser-stdout@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
+ dependencies:
+ buffer-xor "^1.0.2"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+
+browserify-istanbul@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/browserify-istanbul/-/browserify-istanbul-0.1.5.tgz#01c8e31d6a358ee5150f4321c3f28995a964c39f"
+ dependencies:
+ istanbul "^0.2.8"
+ minimatch "^0.2.14"
+ through "^2.3.4"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.0.tgz#10773910c3c206d5420a46aad8694f820b85968f"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+ dependencies:
+ pako "~0.2.0"
+
+browserify@13.0.0, browserify@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.0.0.tgz#8f223bb24ff4ee4335e6bea9671de294e43ba6a3"
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "~1.3.0"
+ browser-pack "^6.0.1"
+ browser-resolve "^1.11.0"
+ browserify-zlib "~0.1.2"
+ buffer "^4.1.0"
+ concat-stream "~1.5.1"
+ console-browserify "^1.1.0"
+ constants-browserify "~1.0.0"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^2.0.0"
+ domain-browser "~1.1.0"
+ duplexer2 "~0.1.2"
+ events "~1.1.0"
+ glob "^5.0.15"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "~0.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^7.0.0"
+ isarray "0.0.1"
+ labeled-stream-splicer "^2.0.0"
+ module-deps "^4.0.2"
+ os-browserify "~0.1.1"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^2.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "^1.4.3"
+ stream-browserify "^2.0.0"
+ stream-http "^2.0.0"
+ string_decoder "~0.10.0"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^2.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "~0.0.0"
+ url "~0.11.0"
+ util "~0.10.1"
+ vm-browserify "~0.0.1"
+ xtend "^4.0.0"
+
+browserify@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.0.0.tgz#67e6cfe7acb2fb1a1908e8a763452306de0bcf38"
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "^1.4.0"
+ browser-pack "^6.0.1"
+ browser-resolve "^1.11.0"
+ browserify-zlib "~0.1.2"
+ buffer "^5.0.2"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.1"
+ console-browserify "^1.1.0"
+ constants-browserify "~1.0.0"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^2.0.0"
+ domain-browser "~1.1.0"
+ duplexer2 "~0.1.2"
+ events "~1.1.0"
+ glob "^7.1.0"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "~0.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^7.0.0"
+ labeled-stream-splicer "^2.0.0"
+ module-deps "^4.0.8"
+ os-browserify "~0.1.1"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^2.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "^1.6.1"
+ stream-browserify "^2.0.0"
+ stream-http "^2.0.0"
+ string_decoder "~0.10.0"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^2.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "~0.0.0"
+ url "~0.11.0"
+ util "~0.10.1"
+ vm-browserify "~0.0.1"
+ xtend "^4.0.0"
+
+buffer-crc32@0.2.1, buffer-crc32@~0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.1.tgz#be3e5382fc02b6d6324956ac1af98aa98b08534c"
+
+buffer-shims@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
+
+buffer-xor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.1.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^5.0.2:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.3.tgz#90d5b2dbcef4004e7e307d0e488595a302e1f8fd"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+busboy@^0.2.11:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+ dependencies:
+ dicer "0.2.5"
+ readable-stream "1.1.x"
+
+bytes@0.2.1, bytes@~0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-0.2.1.tgz#555b08abcb063f8975905302523e4cd4ffdfdf31"
+
+bytes@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
+
+bytes@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4"
+
+bytes@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+cached-path-relative@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.0.tgz#d1094c577fbd9a8b8bd43c96af6188aa205d05f4"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+caseless@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+char-split@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/char-split/-/char-split-0.2.0.tgz#8755eda641e5db277dd0f509b517c827e50a8edf"
+ dependencies:
+ through "2.3.4"
+
+chokidar@^1.0.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
+ dependencies:
+ inherits "^2.0.1"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+colors@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc"
+
+combine-source-map@~0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
+ dependencies:
+ convert-source-map "~1.1.0"
+ inline-source-map "~0.6.0"
+ lodash.memoize "~3.0.3"
+ source-map "~0.5.3"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+combined-stream@~0.0.4:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f"
+ dependencies:
+ delayed-stream "0.0.5"
+
+commander@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-1.3.2.tgz#8a8f30ec670a6fdd64af52f1914b907d79ead5b5"
+ dependencies:
+ keypress "0.1.x"
+
+commander@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781"
+
+commander@2.9.0, commander@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+component-emitter@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+compress-commons@~0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3"
+ dependencies:
+ buffer-crc32 "~0.2.1"
+ crc32-stream "~0.3.1"
+ readable-stream "~1.0.26"
+
+compress-commons@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.2.9.tgz#422d927430c01abd06cd455b6dfc04cb4cf8003c"
+ dependencies:
+ buffer-crc32 "~0.2.1"
+ crc32-stream "~0.3.1"
+ node-int64 "~0.3.0"
+ readable-stream "~1.0.26"
+
+compressible@~2.0.3:
+ version "2.0.9"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.9.tgz#6daab4e2b599c2770dd9e21e7a891b1c5a755425"
+ dependencies:
+ mime-db ">= 1.24.0 < 2"
+
+compression@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.0.tgz#ccc1a54788da1b3ad7729c49f6a00b3ac9adf47f"
+ dependencies:
+ accepts "~1.2.9"
+ bytes "2.1.0"
+ compressible "~2.0.3"
+ debug "~2.2.0"
+ on-headers "~1.0.0"
+ vary "~1.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+connect@2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-2.12.0.tgz#31d8fa0dcacdf1908d822bd2923be8a2d2a7ed9a"
+ dependencies:
+ batch "0.5.0"
+ buffer-crc32 "0.2.1"
+ bytes "0.2.1"
+ cookie "0.1.0"
+ cookie-signature "1.0.1"
+ debug ">= 0.7.3 < 1"
+ fresh "0.2.0"
+ methods "0.1.0"
+ multiparty "2.2.0"
+ negotiator "0.3.0"
+ pause "0.0.1"
+ qs "0.6.6"
+ raw-body "1.1.2"
+ send "0.1.4"
+ uid2 "0.0.3"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@~1.0.1, content-type@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.0.0.tgz#dbdcb69523d3af582f7b5c94b3c25ecf2f3b7355"
+
+convert-source-map@~1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
+cookie-parser@^1.4.1:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5"
+ dependencies:
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+
+cookie-signature@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.1.tgz#44e072148af01e6e8e24afbf12690d68ae698ecb"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.0.tgz#90eb469ddce905c866de687efc43131d8801f9d0"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+cookiejar@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-1.3.0.tgz#dd00b35679021e99cbd4e855b9ad041913474765"
+
+cookiejar@^2.0.6:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.0.tgz#86549689539b6d0e269b6637a304be508194d898"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+crc32-stream@~0.3.1:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552"
+ dependencies:
+ buffer-crc32 "~0.2.1"
+ readable-stream "~1.0.24"
+
+crc@3.4.4:
+ version "3.4.4"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b"
+
+create-ecdh@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ ripemd160 "^1.0.0"
+ sha.js "^2.3.6"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170"
+ dependencies:
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+
+cryptiles@0.2.x:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c"
+ dependencies:
+ boom "0.4.x"
+
+cryptiles@2.x.x:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+crypto-browserify@^3.0.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+
+ctype@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@*, debug@2.6.0, debug@^2.2.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
+ dependencies:
+ ms "0.7.2"
+
+debug@0.7.4, debug@~0.7.2, debug@~0.7.4:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
+
+debug@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.1.0.tgz#33ab915659d8c2cc8a41443d94d6ebd37697ed21"
+ dependencies:
+ ms "0.6.2"
+
+debug@2.2.0, debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+"debug@>= 0.7.3 < 1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130"
+
+decamelize@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-extend@~0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+defined@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+delayed-stream@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa"
+
+depd@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+deps-sort@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+ dependencies:
+ JSONStream "^1.0.3"
+ shasum "^1.0.0"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detective@^4.0.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.2.tgz#77697e2e7947ac3fe7c8e26a6d6f115235afa91c"
+ dependencies:
+ acorn "^3.1.0"
+ defined "^1.0.0"
+
+dicer@0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+ dependencies:
+ readable-stream "1.1.x"
+ streamsearch "0.1.2"
+
+diff@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
+
+diffie-hellman@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ dependencies:
+ readable-stream "^2.0.2"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+ee-first@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.0.tgz#6a0d7c6221e490feefd92ec3f441c9ce8cd097f4"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+elliptic@^6.0.0:
+ version "6.3.2"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.2.tgz#e4c81e0829cf0a65ab70e998b8232723b5c1bc48"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ inherits "^2.0.1"
+
+emitter-component@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/emitter-component/-/emitter-component-1.0.0.tgz#f04dd18fc3dc3e9a74cbc0f310b088666e4c016f"
+
+encodeurl@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+end-of-stream@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07"
+ dependencies:
+ once "~1.3.0"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@1.3.x:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23"
+ dependencies:
+ esprima "~1.1.1"
+ estraverse "~1.5.0"
+ esutils "~1.0.0"
+ optionalDependencies:
+ source-map "~0.1.33"
+
+escodegen@1.8.x:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+ dependencies:
+ esprima "^2.7.1"
+ estraverse "^1.9.1"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.2.0"
+
+esprima@1.2.x:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9"
+
+esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549"
+
+estraverse@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+
+estraverse@~1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+esutils@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570"
+
+etag@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
+
+eventemitter3@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53"
+ dependencies:
+ create-hash "^1.1.1"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+express-session@^1.13.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.0.tgz#67131dd5b78a42bc57b50af0a14880265c03f919"
+ dependencies:
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ crc "3.4.4"
+ debug "2.6.0"
+ depd "~1.1.0"
+ on-headers "~1.0.1"
+ parseurl "~1.3.1"
+ uid-safe "~2.1.3"
+ utils-merge "1.0.0"
+
+express-state@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/express-state/-/express-state-1.0.3.tgz#b6f368743a95d8a91b7683adf593d02b1577ec02"
+
+express@3.4.8:
+ version "3.4.8"
+ resolved "https://registry.yarnpkg.com/express/-/express-3.4.8.tgz#aa7a8986de07053337f4bc5ed9a6453d9cc8e2e1"
+ dependencies:
+ buffer-crc32 "0.2.1"
+ commander "1.3.2"
+ connect "2.12.0"
+ cookie "0.1.0"
+ cookie-signature "1.0.1"
+ debug ">= 0.7.3 < 1"
+ fresh "0.2.0"
+ merge-descriptors "0.0.1"
+ methods "0.1.0"
+ mkdirp "0.3.5"
+ range-parser "0.0.4"
+ send "0.1.4"
+
+express@4.x, express@^4.13.4:
+ version "4.14.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.14.1.tgz#646c237f766f148c2120aff073817b9e4d7e0d33"
+ dependencies:
+ accepts "~1.3.3"
+ array-flatten "1.1.1"
+ content-disposition "0.5.2"
+ content-type "~1.0.2"
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ debug "~2.2.0"
+ depd "~1.1.0"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.7.0"
+ finalhandler "0.5.1"
+ fresh "0.3.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.1"
+ path-to-regexp "0.1.7"
+ proxy-addr "~1.1.3"
+ qs "6.2.0"
+ range-parser "~1.2.0"
+ send "0.14.2"
+ serve-static "~1.11.2"
+ type-is "~1.6.14"
+ utils-merge "1.0.0"
+ vary "~1.1.0"
+
+extend@^3.0.0, extend@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extsprintf@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+file-utils@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/file-utils/-/file-utils-0.1.5.tgz#dc8153c855387cb4dacb0a1725531fa444a6b48c"
+ dependencies:
+ findup-sync "~0.1.2"
+ glob "~3.2.6"
+ iconv-lite "~0.2.11"
+ isbinaryfile "~0.1.9"
+ lodash "~2.1.0"
+ minimatch "~0.2.12"
+ rimraf "~2.2.2"
+
+filename-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
+
+fileset@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741"
+ dependencies:
+ glob "3.x"
+ minimatch "0.x"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+finalhandler@0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.1.tgz#2c400d8d4530935bc232549c5fa385ec07de6fcd"
+ dependencies:
+ debug "~2.2.0"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ statuses "~1.3.1"
+ unpipe "~1.0.0"
+
+find-nearest-file@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-nearest-file/-/find-nearest-file-1.0.0.tgz#bf539d7d0f02996631fa2196680f6776762b9f70"
+
+findup-sync@~0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683"
+ dependencies:
+ glob "~3.2.9"
+ lodash "~2.4.1"
+
+firefox-profile@0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/firefox-profile/-/firefox-profile-0.2.7.tgz#fe46afc2ed6a96f62c5c3bd446fa259f6014a909"
+ dependencies:
+ adm-zip "~0.4.3"
+ archiver "~0.7.1"
+ async "~0.2.9"
+ fs-extra "~0.8.1"
+ lazystream "~0.1.0"
+ node-uuid "~1.4.1"
+ wrench "~1.5.1"
+ xml2js "~0.4.0"
+
+for-in@^0.1.5:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8"
+
+for-own@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072"
+ dependencies:
+ for-in "^0.1.5"
+
+forEachAsync@~2.2:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/forEachAsync/-/forEachAsync-2.2.1.tgz#e3723f00903910e1eb4b1db3ad51b5c64a319fec"
+ dependencies:
+ sequence "2.x"
+
+foreach-shim@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/foreach-shim/-/foreach-shim-0.1.1.tgz#be61d75f46abb7176f5abd295e35885751b71d94"
+
+forever-agent@~0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@^2.1.1, form-data@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+form-data@~0.0.3:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.0.10.tgz#db345a5378d86aeeb1ed5d553b869ac192d2f5ed"
+ dependencies:
+ async "~0.2.7"
+ combined-stream "~0.0.4"
+ mime "~1.2.2"
+
+form-data@~0.1.0:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12"
+ dependencies:
+ async "~0.9.0"
+ combined-stream "~0.0.4"
+ mime "~1.2.11"
+
+formidable@1.0.14:
+ version "1.0.14"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.14.tgz#2b3f4c411cbb5fdd695c44843e2a23514a43231a"
+
+formidable@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9"
+
+forwarded@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
+
+fresh@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.2.0.tgz#bfd9402cf3df12c4a4c310c79f99a3dde13d34a7"
+
+fresh@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
+
+fs-extra@~0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.8.1.tgz#0e5779ffbfedf511bc755595c7f03c06d4b43e8d"
+ dependencies:
+ jsonfile "~1.1.0"
+ mkdirp "0.3.x"
+ ncp "~0.4.2"
+ rimraf "~2.2.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+ version "1.0.17"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558"
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.29"
+
+fstream-ignore@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822"
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+gauge@~2.7.1:
+ version "2.7.2"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ supports-color "^0.2.0"
+ wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+ dependencies:
+ is-property "^1.0.0"
+
+getpass@^0.1.1:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@3.x, glob@~3.2.6, glob@~3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
+ dependencies:
+ inherits "2"
+ minimatch "0.3"
+
+glob@7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^5.0.10, glob@^5.0.15:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.5, glob@^7.1.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~3.1.11:
+ version "3.1.21"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
+ dependencies:
+ graceful-fs "~1.2.0"
+ inherits "1"
+ minimatch "~0.2.11"
+
+glob@~4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-4.0.6.tgz#695c50bdd4e2fb5c5d370b091f388d3707e291a7"
+ dependencies:
+ graceful-fs "^3.0.2"
+ inherits "2"
+ minimatch "^1.0.0"
+ once "^1.3.0"
+
+glob@~4.3.0:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3"
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^2.0.1"
+ once "^1.3.0"
+
+globs-to-files@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/globs-to-files/-/globs-to-files-1.0.0.tgz#54490f6d1f4b9fd2de9d99445146ffb37550380d"
+ dependencies:
+ array-uniq "~1.0.2"
+ asyncreduce "~0.1.4"
+ glob "^5.0.10"
+ xtend "^4.0.0"
+
+graceful-fs@^3.0.2:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
+ dependencies:
+ natives "^1.1.0"
+
+graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+graceful-fs@~1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+growl@1.9.2:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
+
+handlebars@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.0.12.tgz#18c6d3440c35e91b19b3ff582b9151ab4985d4fc"
+ dependencies:
+ optimist "~0.3"
+ uglify-js "~2.3"
+
+handlebars@1.3.x:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.3.0.tgz#9e9b130a93e389491322d975cf3ec1818c37ce34"
+ dependencies:
+ optimist "~0.3"
+ optionalDependencies:
+ uglify-js "~2.3"
+
+handlebars@^4.0.1:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7"
+ dependencies:
+ async "^1.4.0"
+ optimist "^0.6.1"
+ source-map "^0.4.4"
+ optionalDependencies:
+ uglify-js "^2.6"
+
+har-validator@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+ dependencies:
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ is-my-json-valid "^2.12.4"
+ pinkie-promise "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hash.js@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
+ dependencies:
+ inherits "^2.0.1"
+
+hawk@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9"
+ dependencies:
+ boom "0.4.x"
+ cryptiles "0.2.x"
+ hoek "0.9.x"
+ sntp "0.2.x"
+
+hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+hbs@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/hbs/-/hbs-2.4.0.tgz#f4c956cb660d6974dc61214b7c49a21f6aaa3f51"
+ dependencies:
+ handlebars "1.0.12"
+ walk "2.2.1"
+
+highlight.js@7.5.0:
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-7.5.0.tgz#0052595eef15845d842e02a03313afadc3ebd6cc"
+
+hoek@0.9.x:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505"
+
+hoek@2.x.x:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+htmlescape@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+http-errors@~1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750"
+ dependencies:
+ inherits "2.0.3"
+ setprototypeof "1.0.2"
+ statuses ">= 1.3.1 < 2"
+
+http-proxy@1.11.2:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.11.2.tgz#c50d2fb06eca79d4238e66fd94393d2e41e63740"
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "0.x.x"
+
+http-signature@~0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66"
+ dependencies:
+ asn1 "0.1.11"
+ assert-plus "^0.1.5"
+ ctype "0.5.3"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+humanize-duration@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-2.4.0.tgz#04da89e6784af1c881b06ebc9f494dda07b08a17"
+
+iconv-lite@0.4.15:
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@0.4.8:
+ version "0.4.8"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.8.tgz#c6019a7595f2cefca702eab694a010bcd9298d20"
+
+iconv-lite@~0.2.11:
+ version "0.2.11"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8"
+
+ieee754@^1.1.4:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inline-source-map@~0.6.0:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+ dependencies:
+ source-map "~0.5.3"
+
+insert-module-globals@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3"
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.7.1"
+ concat-stream "~1.5.1"
+ is-buffer "^1.1.0"
+ lexical-scope "^1.2.0"
+ process "~0.11.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+ipaddr.js@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.0.2, is-buffer@^1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b"
+
+is-dotfile@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-my-json-valid@^2.12.4:
+ version "2.15.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b"
+ dependencies:
+ generate-function "^2.0.0"
+ generate-object-property "^1.1.0"
+ jsonpointer "^4.0.0"
+ xtend "^4.0.0"
+
+is-number@^2.0.2, is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-property@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+isarray@0.0.1, isarray@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@~0.1.9:
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-0.1.9.tgz#15eece35c4ab708d8924da99fb874f2b5cc0b6c4"
+
+isexe@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-middleware@0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-middleware/-/istanbul-middleware-0.2.2.tgz#83c4c13c128e1a0d6a147792391af3c15a8ab8e0"
+ dependencies:
+ archiver "0.14.x"
+ body-parser "~1.12.3"
+ express "4.x"
+ istanbul "0.4.x"
+
+istanbul@0.4.x:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
+ dependencies:
+ abbrev "1.0.x"
+ async "1.x"
+ escodegen "1.8.x"
+ esprima "2.7.x"
+ glob "^5.0.15"
+ handlebars "^4.0.1"
+ js-yaml "3.x"
+ mkdirp "0.5.x"
+ nopt "3.x"
+ once "1.x"
+ resolve "1.1.x"
+ supports-color "^3.1.0"
+ which "^1.1.1"
+ wordwrap "^1.0.0"
+
+istanbul@^0.2.8:
+ version "0.2.16"
+ resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.2.16.tgz#870545a0d4f4b4ce161039e9e805a98c2c700bd9"
+ dependencies:
+ abbrev "1.0.x"
+ async "0.9.x"
+ escodegen "1.3.x"
+ esprima "1.2.x"
+ fileset "0.1.x"
+ handlebars "1.3.x"
+ js-yaml "3.x"
+ mkdirp "0.5.x"
+ nopt "3.x"
+ resolve "0.7.x"
+ which "1.0.x"
+ wordwrap "0.0.x"
+
+jodid25519@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
+ dependencies:
+ jsbn "~0.1.0"
+
+js-yaml@3.x:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^2.6.0"
+
+jsbn@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+jsonfile@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-1.1.1.tgz#da4fd6ad77f1a255203ea63c7bc32dc31ef64433"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8"
+
+jsonpointer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252"
+ dependencies:
+ extsprintf "1.0.2"
+ json-schema "0.2.3"
+ verror "1.3.6"
+
+keypress@0.1.x:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.1.0.tgz#4a3188d4291b66b4f65edb99f806aa9ae293592a"
+
+kind-of@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
+ dependencies:
+ is-buffer "^1.0.2"
+
+labeled-stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
+ dependencies:
+ inherits "^2.0.1"
+ isarray "~0.0.1"
+ stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazystream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920"
+ dependencies:
+ readable-stream "~1.0.2"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lexical-scope@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+ dependencies:
+ astw "^2.0.0"
+
+load-script@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/load-script/-/load-script-0.0.5.tgz#cbd54b27cd7309902b749640c70e996f4c643b63"
+
+localtunnel@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.5.0.tgz#5be949779325e9f3273021a3f38d2e7a8dcd7c4f"
+ dependencies:
+ debug "0.7.4"
+ optimist "0.3.4"
+ request "2.11.4"
+
+lodash._baseassign@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash.keys "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basecreate@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._isnative@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c"
+
+lodash._objecttypes@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11"
+
+lodash._shimkeys@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203"
+ dependencies:
+ lodash._objecttypes "~2.4.1"
+
+lodash.create@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
+ dependencies:
+ lodash._baseassign "^3.0.0"
+ lodash._basecreate "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+
+lodash.defaults@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54"
+ dependencies:
+ lodash._objecttypes "~2.4.1"
+ lodash.keys "~2.4.1"
+
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isobject@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5"
+ dependencies:
+ lodash._objecttypes "~2.4.1"
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
+lodash.keys@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727"
+ dependencies:
+ lodash._isnative "~2.4.1"
+ lodash._shimkeys "~2.4.1"
+ lodash.isobject "~2.4.1"
+
+lodash.memoize@~3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lodash@3.10.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+lodash@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.1.0.tgz#0637eaaa36a8a1cfc865c3adfb942189bfb0998d"
+
+lodash@~2.4.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
+
+lodash@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.2.0.tgz#4bf50a3243f9aeb0bac41a55d3d5990675a462fb"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+lru-cache@2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+
+marked@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+merge-descriptors@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-0.0.1.tgz#2ff0980c924cf81d0b5d1fb601177cb8bb56c0d0"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+methods@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-0.0.1.tgz#277c90f8bef39709645a8371c51c3b6c648e068c"
+
+methods@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-0.1.0.tgz#335d429eefd21b7bacf2e9c922a8d2bd14a30e4f"
+
+methods@^1.1.1, methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+"mime-db@>= 1.24.0 < 2", mime-db@~1.26.0:
+ version "1.26.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff"
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.6, mime-types@~2.1.7:
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee"
+ dependencies:
+ mime-db "~1.26.0"
+
+mime-types@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce"
+
+mime@1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.5.tgz#9eed073022a8bf5e16c8566c6867b8832bfbfa13"
+
+mime@1.3.4, mime@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+mime@~1.2.11, mime@~1.2.2, mime@~1.2.7, mime@~1.2.9:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimatch@0.3, minimatch@0.x:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimatch@^0.2.14, minimatch@~0.2.11, minimatch@~0.2.12:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimatch@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d"
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimatch@^2.0.1:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimist@0.0.8, minimist@~0.0.1:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce"
+
+minimist@^1.1.0, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.3.5, mkdirp@0.3.x:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
+
+mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+mocha@^3.1.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3"
+ dependencies:
+ browser-stdout "1.3.0"
+ commander "2.9.0"
+ debug "2.2.0"
+ diff "1.4.0"
+ escape-string-regexp "1.0.5"
+ glob "7.0.5"
+ growl "1.9.2"
+ json3 "3.3.2"
+ lodash.create "3.1.1"
+ mkdirp "0.5.1"
+ supports-color "3.1.2"
+
+module-deps@^4.0.2, module-deps@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.0.8.tgz#55fd70623399706c3288bef7a609ff1e8c0ed2bb"
+ dependencies:
+ JSONStream "^1.0.3"
+ browser-resolve "^1.7.0"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.0"
+ defined "^1.0.0"
+ detective "^4.0.0"
+ duplexer2 "^0.1.2"
+ inherits "^2.0.1"
+ parents "^1.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.3"
+ stream-combiner2 "^1.1.1"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+ms@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c"
+
+ms@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
+multer@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2"
+ dependencies:
+ append-field "^0.1.0"
+ busboy "^0.2.11"
+ concat-stream "^1.5.0"
+ mkdirp "^0.5.1"
+ object-assign "^3.0.0"
+ on-finished "^2.3.0"
+ type-is "^1.6.4"
+ xtend "^4.0.0"
+
+multiparty@2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-2.2.0.tgz#a567c2af000ad22dc8f2a653d91978ae1f5316f4"
+ dependencies:
+ readable-stream "~1.1.9"
+ stream-counter "~0.2.0"
+
+nan@^2.3.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2"
+
+natives@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31"
+
+ncp@~0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574"
+
+negotiator@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.3.0.tgz#706d692efeddf574d57ea9fb1ab89a4fa7ee8f60"
+
+negotiator@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+node-int64@~0.3.0:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.3.3.tgz#2d6e6b2ece5de8588b43d88d1bc41b26cd1fa84d"
+
+node-pre-gyp@^0.6.29:
+ version "0.6.33"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9"
+ dependencies:
+ mkdirp "~0.5.1"
+ nopt "~3.0.6"
+ npmlog "^4.0.1"
+ rc "~1.1.6"
+ request "^2.79.0"
+ rimraf "~2.5.4"
+ semver "~5.3.0"
+ tar "~2.2.1"
+ tar-pack "~3.3.0"
+
+node-uuid@~1.4.0, node-uuid@~1.4.1:
+ version "1.4.7"
+ resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f"
+
+nopt@3.x, nopt@~3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ dependencies:
+ abbrev "1"
+
+normalize-path@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a"
+
+npmlog@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.1"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.4.0.tgz#f22956f31ea7151a821e5f2fb32c113cad8b9f69"
+
+oauth-sign@~0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-keys@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+on-finished@^2.3.0, on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+on-finished@~2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.2.1.tgz#5c85c1cc36299f78029653f667f27b6b99ebc029"
+ dependencies:
+ ee-first "1.1.0"
+
+on-headers@~1.0.0, on-headers@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+
+once@1.x, once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+once@~1.3.0, once@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+ dependencies:
+ wrappy "1"
+
+opener@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.0.tgz#d11f86eeeb076883735c9d509f538fe82d10b941"
+
+optimist@0.3.4:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.4.tgz#4d6d0bd71ffad0da4ba4f6d876d5eeb04e07480b"
+ dependencies:
+ wordwrap "~0.0.2"
+
+optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optimist@~0.3, optimist@~0.3.5:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9"
+ dependencies:
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+os-browserify@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
+
+osenv@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.0.3.tgz#cd6ad8ddb290915ad9e22765576025d411f29cb6"
+
+outpipe@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2"
+ dependencies:
+ shell-quote "^1.4.2"
+
+pako@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+parents@^1.0.0, parents@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+ dependencies:
+ path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.0.0.tgz#35060f6d5015d37628c770f4e091a0b5a278bc23"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parseurl@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
+
+path-browserify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-platform@~0.11.15:
+ version "0.11.15"
+ resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+pause@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+
+pbkdf2@^3.0.3:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693"
+ dependencies:
+ create-hmac "^1.1.2"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@~0.11.0:
+ version "0.11.9"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1"
+
+proxy-addr@~1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.3.tgz#dc97502f5722e888467b3fa2297a7b1ff47df074"
+ dependencies:
+ forwarded "~0.1.0"
+ ipaddr.js "1.2.0"
+
+public-encrypt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.3.2, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.0.1.tgz#11872aeedee89268110b10a718448ffb10112a14"
+
+qs@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.5.tgz#294b268e4b0d4250f6dde19b3b8b34935dff14ef"
+
+qs@0.6.6:
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.6.tgz#6e015098ff51968b8a3c819001d5f2c89bc4b107"
+
+qs@2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-2.4.2.tgz#f7ce788e5777df0b5010da7f7c4e73ba32470f5a"
+
+qs@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b"
+
+qs@6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625"
+
+qs@^6.1.0, qs@~6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442"
+
+qs@~1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88"
+
+querystring-es3@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+random-bytes@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
+
+randomatic@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
+ dependencies:
+ is-number "^2.0.2"
+ kind-of "^3.0.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec"
+
+range-parser@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-0.0.4.tgz#c0427ffef51c10acba0782a46c9602e744ff620b"
+
+range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.2.tgz#c74b3004dea5defd1696171106ac740ec31d62be"
+ dependencies:
+ bytes "~0.2.1"
+
+raw-body@~2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.0.2.tgz#a2c2f98c8531cee99c63d8d238b7de97bb659fca"
+ dependencies:
+ bytes "2.1.0"
+ iconv-lite "0.4.8"
+
+raw-body@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.15"
+ unpipe "1.0.0"
+
+rc@~1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9"
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~1.0.4"
+
+read-only-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+ dependencies:
+ readable-stream "^2.0.2"
+
+readable-stream@1.1.x, readable-stream@^1.0.27-1, readable-stream@~1.1.11, readable-stream@~1.1.8, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e"
+ dependencies:
+ buffer-shims "^1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~0.10.x"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26, readable-stream@~1.0.33:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@~2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~0.10.x"
+ util-deprecate "~1.0.1"
+
+readable-stream@~2.1.4:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
+ dependencies:
+ buffer-shims "^1.0.0"
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~0.10.x"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+reduce-component@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/reduce-component/-/reduce-component-1.0.1.tgz#e0c93542c574521bea13df0f9488ed82ab77c5da"
+
+regex-cache@^0.4.2:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+ is-primitive "^2.0.0"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+request@2.11.4:
+ version "2.11.4"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.11.4.tgz#6347d7d44e52dc588108cc1ce5cee975fc8926de"
+ dependencies:
+ form-data "~0.0.3"
+ mime "~1.2.7"
+
+request@^2.79.0:
+ version "2.79.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.11.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~2.0.6"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ qs "~6.3.0"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "~0.4.1"
+ uuid "^3.0.0"
+
+request@~2.46.0:
+ version "2.46.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.46.0.tgz#359195d52eaf720bc69742579d04ad6d265a8274"
+ dependencies:
+ aws-sign2 "~0.5.0"
+ bl "~0.9.0"
+ caseless "~0.6.0"
+ forever-agent "~0.5.0"
+ form-data "~0.1.0"
+ hawk "1.1.1"
+ http-signature "~0.10.0"
+ json-stringify-safe "~5.0.0"
+ mime-types "~1.0.1"
+ node-uuid "~1.4.0"
+ oauth-sign "~0.4.0"
+ qs "~1.2.0"
+ stringstream "~0.0.4"
+ tough-cookie ">=0.12.0"
+ tunnel-agent "~0.4.0"
+
+requires-port@0.x.x:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d"
+
+resolve@0.7.x:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.7.4.tgz#395a9ef9e873fbfe12bd14408bd91bb936003d69"
+
+resolve@1.1.7, resolve@1.1.x:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.0, rimraf@~2.2.2:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e"
+
+runnel@~0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/runnel/-/runnel-0.5.3.tgz#f9362b165a05fc6f5e46e458f77a1f7ecdc0daec"
+
+sax@>=0.6.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
+
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+send@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.1.4.tgz#be70d8d1be01de61821af13780b50345a4f71abd"
+ dependencies:
+ debug "*"
+ fresh "0.2.0"
+ mime "~1.2.9"
+ range-parser "0.0.4"
+
+send@0.14.2:
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef"
+ dependencies:
+ debug "~2.2.0"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ etag "~1.7.0"
+ fresh "0.3.0"
+ http-errors "~1.5.1"
+ mime "1.3.4"
+ ms "0.7.2"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.3.1"
+
+sequence@2.x:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/sequence/-/sequence-2.2.1.tgz#7f5617895d44351c0a047e764467690490a16b03"
+
+serve-static@~1.11.2:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.2.tgz#2cf9889bd4435a320cc36895c9aa57bd662e6ac7"
+ dependencies:
+ encodeurl "~1.0.1"
+ escape-html "~1.0.3"
+ parseurl "~1.3.1"
+ send "0.14.2"
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+setprototypeof@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08"
+
+sha.js@^2.3.6, sha.js@~2.4.4:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f"
+ dependencies:
+ inherits "^2.0.1"
+
+shallow-copy@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
+
+shasum@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+ dependencies:
+ json-stable-stringify "~0.0.0"
+ sha.js "~2.4.4"
+
+shell-quote@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.4.1.tgz#ae18442b536a08c720239b079d2f228acbedee40"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shell-quote@^1.4.2, shell-quote@^1.4.3, shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+should-equal@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-1.0.1.tgz#0b6e9516f2601a9fb0bb2dcc369afa1c7e200af7"
+ dependencies:
+ should-type "^1.0.0"
+
+should-format@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.2.tgz#1a543ad3abfea5dc2bea4a0ba875ede60fe22b19"
+ dependencies:
+ should-type "^1.3.0"
+ should-type-adaptors "^1.0.1"
+
+should-http@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/should-http/-/should-http-0.0.4.tgz#b2a39a4780f90d9b238baeacb7bd4c4f3fc7da49"
+
+should-type-adaptors@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz#efe5553cdf68cff66e5c5f51b712dc351c77beaa"
+ dependencies:
+ should-type "^1.3.0"
+ should-util "^1.0.0"
+
+should-type@^1.0.0, should-type@^1.3.0, should-type@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3"
+
+should-util@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.0.tgz#c98cda374aa6b190df8ba87c9889c2b4db620063"
+
+should@^11.1.1:
+ version "11.2.0"
+ resolved "https://registry.yarnpkg.com/should/-/should-11.2.0.tgz#7afca3182c234781d786d2278a87805b5ecf0409"
+ dependencies:
+ should-equal "^1.0.0"
+ should-format "^3.0.2"
+ should-type "^1.4.0"
+ should-type-adaptors "^1.0.1"
+ should-util "^1.0.0"
+
+sigmund@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+sntp@0.2.x:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900"
+ dependencies:
+ hoek "0.9.x"
+
+sntp@1.x.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+ dependencies:
+ hoek "2.x.x"
+
+source-map-cjs@~0.1.31:
+ version "0.1.32"
+ resolved "https://registry.yarnpkg.com/source-map-cjs/-/source-map-cjs-0.1.32.tgz#b113f00065b484f4d3a1123ef084046a56228ce7"
+
+source-map@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@~0.1.33, source-map@~0.1.7:
+ version "0.1.43"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@~0.5.1, source-map@~0.5.3:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+split@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/split/-/split-0.1.2.tgz#f0710744c453d551fc7143ead983da6014e336cc"
+ dependencies:
+ through "1"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jodid25519 "^1.0.0"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+stack-mapper@0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/stack-mapper/-/stack-mapper-0.2.2.tgz#789029054937b7d47c1b5b67612cbb1e7cfe7071"
+ dependencies:
+ array-map "0.0.0"
+ foreach-shim "~0.1.1"
+ isarray "0.0.1"
+ source-map-cjs "~0.1.31"
+
+"stacktrace-js@http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712":
+ version "0.6.0"
+ resolved "http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712#62e2135deea45b38e7e5dd56e61e55da299607d4"
+
+"statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stream-browserify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+ dependencies:
+ duplexer2 "~0.1.0"
+ readable-stream "^2.0.2"
+
+stream-counter@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de"
+ dependencies:
+ readable-stream "~1.1.8"
+
+stream-http@^2.0.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.3.tgz#4c3ddbf9635968ea2cfd4e48d43de5def2625ac3"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.1.0"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+streamsearch@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string_decoder@~0.10.0, string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+stringstream@~0.0.4:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-json-comments@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
+
+subarg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+ dependencies:
+ minimist "^1.1.0"
+
+superagent@0.15.7:
+ version "0.15.7"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-0.15.7.tgz#095c70b8afffbc072f1458f39684d4854d6333a3"
+ dependencies:
+ cookiejar "1.3.0"
+ debug "~0.7.2"
+ emitter-component "1.0.0"
+ formidable "1.0.14"
+ methods "0.0.1"
+ mime "1.2.5"
+ qs "0.6.5"
+ reduce-component "1.0.1"
+
+supports-color@3.1.2, supports-color@^3.1.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+syntax-error@^1.1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.1.6.tgz#b4549706d386cc1c1dc7c2423f18579b6cade710"
+ dependencies:
+ acorn "^2.7.0"
+
+tap-finished@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tap-finished/-/tap-finished-0.0.1.tgz#08b5b543fdc04830290c6c561279552e71c4bd67"
+ dependencies:
+ tap-parser "~0.2.0"
+ through "~2.3.4"
+
+tap-parser@0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.7.0.tgz#728a61d64680a5b48d5dbd9dbd0a4d48f5c35bcb"
+ dependencies:
+ inherits "~2.0.1"
+ minimist "^0.2.0"
+ readable-stream "~1.1.11"
+
+tap-parser@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.2.1.tgz#8e1e823f2114ee21d032e2f31e4fb642a296f50b"
+ dependencies:
+ split "~0.1.2"
+
+tar-pack@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae"
+ dependencies:
+ debug "~2.2.0"
+ fstream "~1.0.10"
+ fstream-ignore "~1.0.5"
+ once "~1.3.3"
+ readable-stream "~2.1.4"
+ rimraf "~2.5.1"
+ tar "~2.2.1"
+ uid-number "~0.0.6"
+
+tar-stream@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.0.2.tgz#fd19b4a17900fa704f6a133e3045aead0562ab95"
+ dependencies:
+ bl "^0.9.0"
+ end-of-stream "^1.0.0"
+ readable-stream "^1.0.27-1"
+ xtend "^4.0.0"
+
+tar-stream@~1.1.0:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.1.5.tgz#be9218c130c20029e107b0f967fb23de0579d13c"
+ dependencies:
+ bl "^0.9.0"
+ end-of-stream "^1.0.0"
+ readable-stream "~1.0.33"
+ xtend "^4.0.0"
+
+tar@~2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.2"
+ inherits "2"
+
+through2@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+through@1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/through/-/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe"
+
+through@2.3.4:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.4.tgz#495e40e8d8a8eaebc7c275ea88c2b8fc14c56455"
+
+"through@>=2.2.7 <3", through@^2.3.4, through@~2.3.4:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+timers-browserify@^1.0.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+ dependencies:
+ process "~0.11.0"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+tough-cookie@>=0.12.0, tough-cookie@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+ dependencies:
+ punycode "^1.4.1"
+
+tty-browserify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@~0.4.0, tunnel-agent@~0.4.1:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-is@^1.6.4, type-is@~1.6.14, type-is@~1.6.2:
+ version "1.6.14"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.13"
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-js@^2.6:
+ version "2.7.5"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8"
+ dependencies:
+ async "~0.2.6"
+ source-map "~0.5.1"
+ uglify-to-browserify "~1.0.0"
+ yargs "~3.10.0"
+
+uglify-js@~2.3:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a"
+ dependencies:
+ async "~0.2.6"
+ optimist "~0.3.5"
+ source-map "~0.1.7"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uid-number@~0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+uid-safe@~2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.3.tgz#077e264a00b3187936b270bb7376a26473631071"
+ dependencies:
+ base64-url "1.3.3"
+ random-bytes "~1.0.0"
+
+uid2@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
+
+umd@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+underscore.string@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d"
+
+underscore.string@~2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b"
+
+underscore@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+url@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3, util@~0.10.1:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+utils-merge@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+vargs@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff"
+
+vary@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
+
+vary@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140"
+
+verror@1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+ dependencies:
+ extsprintf "1.0.2"
+
+vm-browserify@~0.0.1:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+walk@2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/walk/-/walk-2.2.1.tgz#5ada1f8e49e47d4b7445d8be7a2e1e631ab43016"
+ dependencies:
+ forEachAsync "~2.2"
+
+watchify@3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.7.0.tgz#ee2f2c5c8c37312303f998b818b2b3450eefe648"
+ dependencies:
+ anymatch "^1.3.0"
+ browserify "^13.0.0"
+ chokidar "^1.0.0"
+ defined "^1.0.0"
+ outpipe "^1.1.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+wd@0.3.11:
+ version "0.3.11"
+ resolved "https://registry.yarnpkg.com/wd/-/wd-0.3.11.tgz#522716c79a7a10e781acbb2c6cafe588f701fcc0"
+ dependencies:
+ archiver "~0.12.0"
+ async "~0.9.0"
+ lodash "~2.4.1"
+ q "~1.0.1"
+ request "~2.46.0"
+ underscore.string "~2.3.3"
+ vargs "~0.1.0"
+
+which@1.0.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f"
+
+which@^1.1.1:
+ version "1.2.12"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192"
+ dependencies:
+ isexe "^1.1.1"
+
+wide-align@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
+ dependencies:
+ string-width "^1.0.1"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@0.0.x, wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@^1.0.0, wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+wrench@~1.5.1:
+ version "1.5.9"
+ resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.5.9.tgz#411691c63a9b2531b1700267279bdeca23b2142a"
+
+xml2js@~0.4.0:
+ version "0.4.17"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868"
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "^4.1.0"
+
+xmlbuilder@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5"
+ dependencies:
+ lodash "^4.0.0"
+
+xtend@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+ dependencies:
+ object-keys "~0.4.0"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+yamljs@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.1.4.tgz#665789afc2ad4b902bf403f00e85b6434e0f3300"
+ dependencies:
+ argparse "~0.1.4"
+ glob "~3.1.11"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
+
+zip-stream@~0.2.0:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.2.3.tgz#aef095376cfe138959a81341981d26338b46d8d3"
+ dependencies:
+ debug "~0.7.4"
+ lodash.defaults "~2.4.1"
+ readable-stream "~1.0.24"
+
+zip-stream@~0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3"
+ dependencies:
+ compress-commons "~0.1.0"
+ lodash "~2.4.1"
+ readable-stream "~1.0.26"
+
+zip-stream@~0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.5.2.tgz#32dcbc506d0dab4d21372625bd7ebaac3c2fff56"
+ dependencies:
+ compress-commons "~0.2.0"
+ lodash "~3.2.0"
+ readable-stream "~1.0.26"
+
+zuul-localtunnel@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/zuul-localtunnel/-/zuul-localtunnel-1.1.0.tgz#70ad27fb0a6af968a2151fc5d5e895daa1aed15d"
+ dependencies:
+ localtunnel "1.5.0"
+
+zuul@^3.11.1:
+ version "3.11.1"
+ resolved "https://registry.yarnpkg.com/zuul/-/zuul-3.11.1.tgz#7080bbbf22a6d97f60879b3b8f2a823c5a99bab2"
+ dependencies:
+ JSON2 "0.1.0"
+ batch "0.5.0"
+ browserify "13.0.0"
+ browserify-istanbul "0.1.5"
+ char-split "0.2.0"
+ colors "0.6.2"
+ commander "2.1.0"
+ compression "1.5.0"
+ convert-source-map "1.0.0"
+ debug "2.1.0"
+ express "3.4.8"
+ express-state "1.0.3"
+ find-nearest-file "1.0.0"
+ firefox-profile "0.2.7"
+ globs-to-files "1.0.0"
+ hbs "2.4.0"
+ highlight.js "7.5.0"
+ http-proxy "1.11.2"
+ humanize-duration "2.4.0"
+ istanbul-middleware "0.2.2"
+ load-script "0.0.5"
+ lodash "3.10.1"
+ opener "1.4.0"
+ osenv "0.0.3"
+ shallow-copy "0.0.1"
+ shell-quote "1.4.1"
+ stack-mapper "0.2.2"
+ stacktrace-js "http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712"
+ superagent "0.15.7"
+ tap-finished "0.0.1"
+ tap-parser "0.7.0"
+ watchify "3.7.0"
+ wd "0.3.11"
+ xtend "2.1.2"
+ yamljs "0.1.4"
+ zuul-localtunnel "1.1.0"