| (function(global, factory) { | 
 |   /*jshint -W030 */ | 
 |   'use strict'; | 
 |   typeof exports === 'object' && typeof module !== 'undefined' | 
 |     ? factory(exports) | 
 |     : typeof define === 'function' && define.amd | 
 |     ? define(['exports'], factory) | 
 |     : global.async | 
 |     ? factory((global.neo_async = global.neo_async || {})) | 
 |     : factory((global.async = global.async || {})); | 
 | })(this, function(exports) { | 
 |   'use strict'; | 
 |  | 
 |   var noop = function noop() {}; | 
 |   var throwError = function throwError() { | 
 |     throw new Error('Callback was already called.'); | 
 |   }; | 
 |  | 
 |   var DEFAULT_TIMES = 5; | 
 |   var DEFAULT_INTERVAL = 0; | 
 |  | 
 |   var obj = 'object'; | 
 |   var func = 'function'; | 
 |   var isArray = Array.isArray; | 
 |   var nativeKeys = Object.keys; | 
 |   var nativePush = Array.prototype.push; | 
 |   var iteratorSymbol = typeof Symbol === func && Symbol.iterator; | 
 |  | 
 |   var nextTick, asyncNextTick, asyncSetImmediate; | 
 |   createImmediate(); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace each | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.each(array, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.each(array, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.each(object, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.each(object, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // break | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num !== 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.each(array, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 2] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var each = createEach(arrayEach, baseEach, symbolEach); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace map | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.map(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.map(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.map(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.map(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var map = createMap(arrayEachIndex, baseEachIndex, symbolEachIndex, true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace mapValues | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValues(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3, '2': 2 } | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValues(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3, '2': 2 } | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValues(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3, c: 2 } | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValues(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3, c: 2 } | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var mapValues = createMap(arrayEachIndex, baseEachKey, symbolEachKey, false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace filter | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filter(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filter(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3]; | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filter(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filter(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3]; | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var filter = createFilter(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue, true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace filterSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3]; | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3] | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3] | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var filterSeries = createFilterSeries(true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace filterLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3] | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.filterLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var filterLimit = createFilterLimit(true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace reject | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reject(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reject(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reject(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reject(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var reject = createFilter(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue, false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace rejectSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [2]; | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var rejectSeries = createFilterSeries(false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace rejectLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [4, 2] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [4, 2] | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [4, 2] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.rejectLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [4, 2] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var rejectLimit = createFilterLimit(false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace detect | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detect(array, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detect(array, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [[1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detect(object, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detect(object, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [[1, 'a']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var detect = createDetect(arrayEachValue, baseEachValue, symbolEachValue, true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace detectSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [[1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [[1, 'a']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var detectSeries = createDetectSeries(true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace detectLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [[1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.detectLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // 1 | 
 |    *   console.log(order); // [[1, 'a']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var detectLimit = createDetectLimit(true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace every | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.every(array, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [1, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.every(array, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [[1, 0], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.every(object, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [1, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.every(object, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var every = createEvery(arrayEachValue, baseEachValue, symbolEachValue); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace everySeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everySeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everySeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everySeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everySeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'] [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var everySeries = createEverySeries(); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace everyLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everyLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [1, 3, 5, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everyLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everyLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [1, 3, 5, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.everyLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // false | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var everyLimit = createEveryLimit(); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace pick | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pick(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3 } | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pick(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3 } | 
 |    *   console.log(order); // [[0, 1], [2, 2], [3, 1], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pick(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3 } | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pick(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3 } | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var pick = createPick(arrayEachIndexValue, baseEachKeyValue, symbolEachKeyValue, true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace pickSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3 } | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3 } | 
 |    *   console.log(order); // [[0, 1], [3, 1], [2, 2], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3 } | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var pickSeries = createPickSeries(true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace pickLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 5, '2': 3 } | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 5, '2': 3 } | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 5, c: 3 } | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.pickLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 5, c: 3 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var pickLimit = createPickLimit(true); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace omit | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omit(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '2': 2, '3': 4 } | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omit(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '2': 2, '3': 4 } | 
 |    *   console.log(order); // [[0, 1], [2, 2], [3, 1], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omit(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { c: 2, d: 4 } | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omit(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { c: 2, d: 4 } | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var omit = createPick(arrayEachIndexValue, baseEachKeyValue, symbolEachKeyValue, false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace omitSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '2': 2, '3': 4 } | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2, 4]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '2': 2, '3': 4 } | 
 |    *   console.log(order); // [[0, 1], [3, 1], [2, 2], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { c: 2, d: 4 } | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { c: 2, d: 4 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var omitSeries = createPickSeries(false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace omitLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '3': 4, '4': 2 } | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '3': 4, '4': 2 } | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { d: 4, e: 2 } | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.omitLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { d: 4, e: 2 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var omitLimit = createPickLimit(false); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace transform | 
 |    * @param {Array|Object} collection | 
 |    * @param {Array|Object|Function} [accumulator] | 
 |    * @param {Function} [iterator] | 
 |    * @param {Function} [callback] | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     result.push(num) | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transform(collection, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4] | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index and accumulator | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     result[index] = num; | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transform(collection, {}, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3, '2': 2, '3': 4 } | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with accumulator | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     result.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transform(collection, [], iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4] | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     result[key] = num; | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transform(collection, iterator, function(err, res) { | 
 |    *   console.log(res); //  { a: 1, b: 3, c: 2, d: 4 } | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var transform = createTransform(arrayEachResult, baseEachResult, symbolEachResult); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace sortBy | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBy(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBy(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBy(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBy(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var sortBy = createSortBy(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace concat | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concat(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3]; | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concat(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [[1, 0], [2, 2], [3, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concat(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [1, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concat(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var concat = createConcat(arrayEachIndex, baseEachIndex, symbolEachIndex); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace groupBy | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [4.2, 6.4, 6.1]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBy(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } | 
 |    *   console.log(order); // [4.2, 6.1, 6.4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [4.2, 6.4, 6.1]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBy(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } | 
 |    *   console.log(order); // [[4.2, 0], [6.1, 2], [6.4, 1]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 4.2, b: 6.4, c: 6.1 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBy(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } | 
 |    *   console.log(order); // [4.2, 6.1, 6.4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 4.2, b: 6.4, c: 6.1 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBy(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } | 
 |    *   console.log(order); // [[4.2, 'a'], [6.1, 'c'], [6.4, 'b']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var groupBy = createGroupBy(arrayEachValue, baseEachValue, symbolEachValue); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace parallel | 
 |    * @param {Array|Object} tasks - functions | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = [ | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(1); | 
 |    *      done(null, 1); | 
 |    *    }, 10); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(2); | 
 |    *      done(null, 2); | 
 |    *    }, 30); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(3); | 
 |    *      done(null, 3); | 
 |    *    }, 40); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(4); | 
 |    *      done(null, 4); | 
 |    *    }, 20); | 
 |    *  } | 
 |    * ]; | 
 |    * async.parallel(tasks, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4]; | 
 |    *   console.log(order); // [1, 4, 2, 3] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = { | 
 |    *   'a': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(1); | 
 |    *       done(null, 1); | 
 |    *     }, 10); | 
 |    *   }, | 
 |    *   'b': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(2); | 
 |    *       done(null, 2); | 
 |    *     }, 30); | 
 |    *   }, | 
 |    *   'c': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(3); | 
 |    *       done(null, 3); | 
 |    *     }, 40); | 
 |    *   }, | 
 |    *   'd': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(4); | 
 |    *       done(null, 4); | 
 |    *     }, 20); | 
 |    *   } | 
 |    * }; | 
 |    * async.parallel(tasks, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 2, c: 3, d:4 } | 
 |    *   console.log(order); // [1, 4, 2, 3] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   var parallel = createParallel(arrayEachFunc, baseEachFunc); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace applyEach | 
 |    */ | 
 |   var applyEach = createApplyEach(map); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace applyEachSeries | 
 |    */ | 
 |   var applyEachSeries = createApplyEach(mapSeries); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace log | 
 |    */ | 
 |   var log = createLogger('log'); | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace dir | 
 |    */ | 
 |   var dir = createLogger('dir'); | 
 |  | 
 |   /** | 
 |    * @version 2.6.1 | 
 |    * @namespace async | 
 |    */ | 
 |   var index = { | 
 |     VERSION: '2.6.1', | 
 |  | 
 |     // Collections | 
 |     each: each, | 
 |     eachSeries: eachSeries, | 
 |     eachLimit: eachLimit, | 
 |     forEach: each, | 
 |     forEachSeries: eachSeries, | 
 |     forEachLimit: eachLimit, | 
 |     eachOf: each, | 
 |     eachOfSeries: eachSeries, | 
 |     eachOfLimit: eachLimit, | 
 |     forEachOf: each, | 
 |     forEachOfSeries: eachSeries, | 
 |     forEachOfLimit: eachLimit, | 
 |     map: map, | 
 |     mapSeries: mapSeries, | 
 |     mapLimit: mapLimit, | 
 |     mapValues: mapValues, | 
 |     mapValuesSeries: mapValuesSeries, | 
 |     mapValuesLimit: mapValuesLimit, | 
 |     filter: filter, | 
 |     filterSeries: filterSeries, | 
 |     filterLimit: filterLimit, | 
 |     select: filter, | 
 |     selectSeries: filterSeries, | 
 |     selectLimit: filterLimit, | 
 |     reject: reject, | 
 |     rejectSeries: rejectSeries, | 
 |     rejectLimit: rejectLimit, | 
 |     detect: detect, | 
 |     detectSeries: detectSeries, | 
 |     detectLimit: detectLimit, | 
 |     find: detect, | 
 |     findSeries: detectSeries, | 
 |     findLimit: detectLimit, | 
 |     pick: pick, | 
 |     pickSeries: pickSeries, | 
 |     pickLimit: pickLimit, | 
 |     omit: omit, | 
 |     omitSeries: omitSeries, | 
 |     omitLimit: omitLimit, | 
 |     reduce: reduce, | 
 |     inject: reduce, | 
 |     foldl: reduce, | 
 |     reduceRight: reduceRight, | 
 |     foldr: reduceRight, | 
 |     transform: transform, | 
 |     transformSeries: transformSeries, | 
 |     transformLimit: transformLimit, | 
 |     sortBy: sortBy, | 
 |     sortBySeries: sortBySeries, | 
 |     sortByLimit: sortByLimit, | 
 |     some: some, | 
 |     someSeries: someSeries, | 
 |     someLimit: someLimit, | 
 |     any: some, | 
 |     anySeries: someSeries, | 
 |     anyLimit: someLimit, | 
 |     every: every, | 
 |     everySeries: everySeries, | 
 |     everyLimit: everyLimit, | 
 |     all: every, | 
 |     allSeries: everySeries, | 
 |     allLimit: everyLimit, | 
 |     concat: concat, | 
 |     concatSeries: concatSeries, | 
 |     concatLimit: concatLimit, | 
 |     groupBy: groupBy, | 
 |     groupBySeries: groupBySeries, | 
 |     groupByLimit: groupByLimit, | 
 |  | 
 |     // Control Flow | 
 |     parallel: parallel, | 
 |     series: series, | 
 |     parallelLimit: parallelLimit, | 
 |     tryEach: tryEach, | 
 |     waterfall: waterfall, | 
 |     angelFall: angelFall, | 
 |     angelfall: angelFall, | 
 |     whilst: whilst, | 
 |     doWhilst: doWhilst, | 
 |     until: until, | 
 |     doUntil: doUntil, | 
 |     during: during, | 
 |     doDuring: doDuring, | 
 |     forever: forever, | 
 |     compose: compose, | 
 |     seq: seq, | 
 |     applyEach: applyEach, | 
 |     applyEachSeries: applyEachSeries, | 
 |     queue: queue, | 
 |     priorityQueue: priorityQueue, | 
 |     cargo: cargo, | 
 |     auto: auto, | 
 |     autoInject: autoInject, | 
 |     retry: retry, | 
 |     retryable: retryable, | 
 |     iterator: iterator, | 
 |     times: times, | 
 |     timesSeries: timesSeries, | 
 |     timesLimit: timesLimit, | 
 |     race: race, | 
 |  | 
 |     // Utils | 
 |     apply: apply, | 
 |     nextTick: asyncNextTick, | 
 |     setImmediate: asyncSetImmediate, | 
 |     memoize: memoize, | 
 |     unmemoize: unmemoize, | 
 |     ensureAsync: ensureAsync, | 
 |     constant: constant, | 
 |     asyncify: asyncify, | 
 |     wrapSync: asyncify, | 
 |     log: log, | 
 |     dir: dir, | 
 |     reflect: reflect, | 
 |     reflectAll: reflectAll, | 
 |     timeout: timeout, | 
 |     createLogger: createLogger, | 
 |  | 
 |     // Mode | 
 |     safe: safe, | 
 |     fast: fast | 
 |   }; | 
 |  | 
 |   exports['default'] = index; | 
 |   baseEachSync( | 
 |     index, | 
 |     function(func, key) { | 
 |       exports[key] = func; | 
 |     }, | 
 |     nativeKeys(index) | 
 |   ); | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function createImmediate(safeMode) { | 
 |     var delay = function delay(fn) { | 
 |       var args = slice(arguments, 1); | 
 |       setTimeout(function() { | 
 |         fn.apply(null, args); | 
 |       }); | 
 |     }; | 
 |     asyncSetImmediate = typeof setImmediate === func ? setImmediate : delay; | 
 |     if (typeof process === obj && typeof process.nextTick === func) { | 
 |       nextTick = /^v0.10/.test(process.version) ? asyncSetImmediate : process.nextTick; | 
 |       asyncNextTick = /^v0/.test(process.version) ? asyncSetImmediate : process.nextTick; | 
 |     } else { | 
 |       asyncNextTick = nextTick = asyncSetImmediate; | 
 |     } | 
 |     if (safeMode === false) { | 
 |       nextTick = function(cb) { | 
 |         cb(); | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /* sync functions based on lodash */ | 
 |  | 
 |   /** | 
 |    * Converts `arguments` to an array. | 
 |    * | 
 |    * @private | 
 |    * @param {Array} array = The array to slice. | 
 |    */ | 
 |   function createArray(array) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |     var result = Array(size); | 
 |  | 
 |     while (++index < size) { | 
 |       result[index] = array[index]; | 
 |     } | 
 |     return result; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Create an array from `start` | 
 |    * | 
 |    * @private | 
 |    * @param {Array} array - The array to slice. | 
 |    * @param {number} start - The start position. | 
 |    */ | 
 |   function slice(array, start) { | 
 |     var end = array.length; | 
 |     var index = -1; | 
 |     var size = end - start; | 
 |     if (size <= 0) { | 
 |       return []; | 
 |     } | 
 |     var result = Array(size); | 
 |  | 
 |     while (++index < size) { | 
 |       result[index] = array[index + start]; | 
 |     } | 
 |     return result; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Object} object | 
 |    */ | 
 |   function objectClone(object) { | 
 |     var keys = nativeKeys(object); | 
 |     var size = keys.length; | 
 |     var index = -1; | 
 |     var result = {}; | 
 |  | 
 |     while (++index < size) { | 
 |       var key = keys[index]; | 
 |       result[key] = object[key]; | 
 |     } | 
 |     return result; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Create an array with all falsey values removed. | 
 |    * | 
 |    * @private | 
 |    * @param {Array} array - The array to compact. | 
 |    */ | 
 |   function compact(array) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |     var result = []; | 
 |  | 
 |     while (++index < size) { | 
 |       var value = array[index]; | 
 |       if (value) { | 
 |         result[result.length] = value; | 
 |       } | 
 |     } | 
 |     return result; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Create an array of reverse sequence. | 
 |    * | 
 |    * @private | 
 |    * @param {Array} array - The array to reverse. | 
 |    */ | 
 |   function reverse(array) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |     var result = Array(size); | 
 |     var resIndex = size; | 
 |  | 
 |     while (++index < size) { | 
 |       result[--resIndex] = array[index]; | 
 |     } | 
 |     return result; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Checks if key exists in object property. | 
 |    * | 
 |    * @private | 
 |    * @param {Object} object - The object to inspect. | 
 |    * @param {string} key - The key to check. | 
 |    */ | 
 |   function has(object, key) { | 
 |     return object.hasOwnProperty(key); | 
 |   } | 
 |  | 
 |   /** | 
 |    * Check if target exists in array. | 
 |    * @private | 
 |    * @param {Array} array | 
 |    * @param {*} target | 
 |    */ | 
 |   function notInclude(array, target) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     while (++index < size) { | 
 |       if (array[index] === target) { | 
 |         return false; | 
 |       } | 
 |     } | 
 |     return true; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Array} array - The array to iterate over. | 
 |    * @param {Function} iterator - The function invoked per iteration. | 
 |    */ | 
 |   function arrayEachSync(array, iterator) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     while (++index < size) { | 
 |       iterator(array[index], index); | 
 |     } | 
 |     return array; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Object} object - The object to iterate over. | 
 |    * @param {Function} iterator - The function invoked per iteration. | 
 |    * @param {Array} keys | 
 |    */ | 
 |   function baseEachSync(object, iterator, keys) { | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     while (++index < size) { | 
 |       var key = keys[index]; | 
 |       iterator(object[key], key); | 
 |     } | 
 |     return object; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {number} n | 
 |    * @param {Function} iterator | 
 |    */ | 
 |   function timesSync(n, iterator) { | 
 |     var index = -1; | 
 |     while (++index < n) { | 
 |       iterator(index); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Array} array | 
 |    * @param {number[]} criteria | 
 |    */ | 
 |   function sortByCriteria(array, criteria) { | 
 |     var l = array.length; | 
 |     var indices = Array(l); | 
 |     var i; | 
 |     for (i = 0; i < l; i++) { | 
 |       indices[i] = i; | 
 |     } | 
 |     quickSort(criteria, 0, l - 1, indices); | 
 |     var result = Array(l); | 
 |     for (var n = 0; n < l; n++) { | 
 |       i = indices[n]; | 
 |       result[n] = i === undefined ? array[n] : array[i]; | 
 |     } | 
 |     return result; | 
 |   } | 
 |  | 
 |   function partition(array, i, j, mid, indices) { | 
 |     var l = i; | 
 |     var r = j; | 
 |     while (l <= r) { | 
 |       i = l; | 
 |       while (l < r && array[l] < mid) { | 
 |         l++; | 
 |       } | 
 |       while (r >= i && array[r] >= mid) { | 
 |         r--; | 
 |       } | 
 |       if (l > r) { | 
 |         break; | 
 |       } | 
 |       swap(array, indices, l++, r--); | 
 |     } | 
 |     return l; | 
 |   } | 
 |  | 
 |   function swap(array, indices, l, r) { | 
 |     var n = array[l]; | 
 |     array[l] = array[r]; | 
 |     array[r] = n; | 
 |     var i = indices[l]; | 
 |     indices[l] = indices[r]; | 
 |     indices[r] = i; | 
 |   } | 
 |  | 
 |   function quickSort(array, i, j, indices) { | 
 |     if (i === j) { | 
 |       return; | 
 |     } | 
 |     var k = i; | 
 |     while (++k <= j && array[i] === array[k]) { | 
 |       var l = k - 1; | 
 |       if (indices[l] > indices[k]) { | 
 |         var index = indices[l]; | 
 |         indices[l] = indices[k]; | 
 |         indices[k] = index; | 
 |       } | 
 |     } | 
 |     if (k > j) { | 
 |       return; | 
 |     } | 
 |     var p = array[i] > array[k] ? i : k; | 
 |     k = partition(array, i, j, array[p], indices); | 
 |     quickSort(array, i, k - 1, indices); | 
 |     quickSort(array, k, j, indices); | 
 |   } | 
 |  | 
 |   /** | 
 |    * @Private | 
 |    */ | 
 |   function makeConcatResult(array) { | 
 |     var result = []; | 
 |     arrayEachSync(array, function(value) { | 
 |       if (value === noop) { | 
 |         return; | 
 |       } | 
 |       if (isArray(value)) { | 
 |         nativePush.apply(result, value); | 
 |       } else { | 
 |         result.push(value); | 
 |       } | 
 |     }); | 
 |     return result; | 
 |   } | 
 |  | 
 |   /* async functions */ | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function arrayEach(array, iterator, callback) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         iterator(array[index], index, onlyOnce(callback)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         iterator(array[index], onlyOnce(callback)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEach(object, iterator, callback, keys) { | 
 |     var key; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         iterator(object[key], key, onlyOnce(callback)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         iterator(object[keys[index]], onlyOnce(callback)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEach(collection, iterator, callback) { | 
 |     var iter = collection[iteratorSymbol](); | 
 |     var index = 0; | 
 |     var item; | 
 |     if (iterator.length === 3) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         iterator(item.value, index++, onlyOnce(callback)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         index++; | 
 |         iterator(item.value, onlyOnce(callback)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function arrayEachResult(array, result, iterator, callback) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     if (iterator.length === 4) { | 
 |       while (++index < size) { | 
 |         iterator(result, array[index], index, onlyOnce(callback)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         iterator(result, array[index], onlyOnce(callback)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachResult(object, result, iterator, callback, keys) { | 
 |     var key; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 4) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         iterator(result, object[key], key, onlyOnce(callback)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         iterator(result, object[keys[index]], onlyOnce(callback)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEachResult(collection, result, iterator, callback) { | 
 |     var item; | 
 |     var index = 0; | 
 |     var iter = collection[iteratorSymbol](); | 
 |  | 
 |     if (iterator.length === 4) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         iterator(result, item.value, index++, onlyOnce(callback)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         index++; | 
 |         iterator(result, item.value, onlyOnce(callback)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function arrayEachFunc(array, createCallback) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     while (++index < size) { | 
 |       array[index](createCallback(index)); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachFunc(object, createCallback, keys) { | 
 |     var key; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     while (++index < size) { | 
 |       key = keys[index]; | 
 |       object[key](createCallback(key)); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function arrayEachIndex(array, iterator, createCallback) { | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         iterator(array[index], index, createCallback(index)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         iterator(array[index], createCallback(index)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachIndex(object, iterator, createCallback, keys) { | 
 |     var key; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         iterator(object[key], key, createCallback(index)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         iterator(object[keys[index]], createCallback(index)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEachIndex(collection, iterator, createCallback) { | 
 |     var item; | 
 |     var index = 0; | 
 |     var iter = collection[iteratorSymbol](); | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         iterator(item.value, index, createCallback(index++)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         iterator(item.value, createCallback(index++)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachKey(object, iterator, createCallback, keys) { | 
 |     var key; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         iterator(object[key], key, createCallback(key)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         iterator(object[key], createCallback(key)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEachKey(collection, iterator, createCallback) { | 
 |     var item; | 
 |     var index = 0; | 
 |     var iter = collection[iteratorSymbol](); | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         iterator(item.value, index, createCallback(index++)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         iterator(item.value, createCallback(index++)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function arrayEachValue(array, iterator, createCallback) { | 
 |     var value; | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         value = array[index]; | 
 |         iterator(value, index, createCallback(value)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         value = array[index]; | 
 |         iterator(value, createCallback(value)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachValue(object, iterator, createCallback, keys) { | 
 |     var key, value; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         value = object[key]; | 
 |         iterator(value, key, createCallback(value)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         value = object[keys[index]]; | 
 |         iterator(value, createCallback(value)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEachValue(collection, iterator, createCallback) { | 
 |     var value, item; | 
 |     var index = 0; | 
 |     var iter = collection[iteratorSymbol](); | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         value = item.value; | 
 |         iterator(value, index++, createCallback(value)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         index++; | 
 |         value = item.value; | 
 |         iterator(value, createCallback(value)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function arrayEachIndexValue(array, iterator, createCallback) { | 
 |     var value; | 
 |     var index = -1; | 
 |     var size = array.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         value = array[index]; | 
 |         iterator(value, index, createCallback(index, value)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         value = array[index]; | 
 |         iterator(value, createCallback(index, value)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachIndexValue(object, iterator, createCallback, keys) { | 
 |     var key, value; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         value = object[key]; | 
 |         iterator(value, key, createCallback(index, value)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         value = object[keys[index]]; | 
 |         iterator(value, createCallback(index, value)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEachIndexValue(collection, iterator, createCallback) { | 
 |     var value, item; | 
 |     var index = 0; | 
 |     var iter = collection[iteratorSymbol](); | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         value = item.value; | 
 |         iterator(value, index, createCallback(index++, value)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         value = item.value; | 
 |         iterator(value, createCallback(index++, value)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseEachKeyValue(object, iterator, createCallback, keys) { | 
 |     var key, value; | 
 |     var index = -1; | 
 |     var size = keys.length; | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         value = object[key]; | 
 |         iterator(value, key, createCallback(key, value)); | 
 |       } | 
 |     } else { | 
 |       while (++index < size) { | 
 |         key = keys[index]; | 
 |         value = object[key]; | 
 |         iterator(value, createCallback(key, value)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function symbolEachKeyValue(collection, iterator, createCallback) { | 
 |     var value, item; | 
 |     var index = 0; | 
 |     var iter = collection[iteratorSymbol](); | 
 |  | 
 |     if (iterator.length === 3) { | 
 |       while ((item = iter.next()).done === false) { | 
 |         value = item.value; | 
 |         iterator(value, index, createCallback(index++, value)); | 
 |       } | 
 |     } else { | 
 |       while ((item = iter.next()).done === false) { | 
 |         value = item.value; | 
 |         iterator(value, createCallback(index++, value)); | 
 |       } | 
 |     } | 
 |     return index; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} func | 
 |    */ | 
 |   function onlyOnce(func) { | 
 |     return function(err, res) { | 
 |       var fn = func; | 
 |       func = throwError; | 
 |       fn(err, res); | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} func | 
 |    */ | 
 |   function once(func) { | 
 |     return function(err, res) { | 
 |       var fn = func; | 
 |       func = noop; | 
 |       fn(err, res); | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    */ | 
 |   function createEach(arrayEach, baseEach, symbolEach) { | 
 |     return function each(collection, iterator, callback) { | 
 |       callback = once(callback || noop); | 
 |       var size, keys; | 
 |       var completed = 0; | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         arrayEach(collection, iterator, done); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = symbolEach(collection, iterator, done); | 
 |         size && size === completed && callback(null); | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         baseEach(collection, iterator, done, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null); | 
 |       } | 
 |  | 
 |       function done(err, bool) { | 
 |         if (err) { | 
 |           callback = once(callback); | 
 |           callback(err); | 
 |         } else if (++completed === size) { | 
 |           callback(null); | 
 |         } else if (bool === false) { | 
 |           callback = once(callback); | 
 |           callback(null); | 
 |         } | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    */ | 
 |   function createMap(arrayEach, baseEach, symbolEach, useArray) { | 
 |     var init, clone; | 
 |     if (useArray) { | 
 |       init = Array; | 
 |       clone = createArray; | 
 |     } else { | 
 |       init = function() { | 
 |         return {}; | 
 |       }; | 
 |       clone = objectClone; | 
 |     } | 
 |  | 
 |     return function(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, keys, result; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         result = init(size); | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         // TODO: size could be changed | 
 |         result = init(0); | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null, result); | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         result = init(size); | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null, init()); | 
 |       } | 
 |  | 
 |       function createCallback(key) { | 
 |         return function done(err, res) { | 
 |           if (key === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             key = null; | 
 |             callback = once(callback); | 
 |             callback(err, clone(result)); | 
 |             return; | 
 |           } | 
 |           result[key] = res; | 
 |           key = null; | 
 |           if (++completed === size) { | 
 |             callback(null, result); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createFilter(arrayEach, baseEach, symbolEach, bool) { | 
 |     return function(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, keys, result; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         result = Array(size); | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         result = []; | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null, compact(result)); | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         result = Array(size); | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         return callback(null, []); | 
 |       } | 
 |  | 
 |       function createCallback(index, value) { | 
 |         return function done(err, res) { | 
 |           if (index === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             index = null; | 
 |             callback = once(callback); | 
 |             callback(err); | 
 |             return; | 
 |           } | 
 |           if (!!res === bool) { | 
 |             result[index] = value; | 
 |           } | 
 |           index = null; | 
 |           if (++completed === size) { | 
 |             callback(null, compact(result)); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createFilterSeries(bool) { | 
 |     return function(collection, iterator, callback) { | 
 |       callback = onlyOnce(callback || noop); | 
 |       var size, key, value, keys, iter, item, iterate; | 
 |       var sync = false; | 
 |       var completed = 0; | 
 |       var result = []; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = Infinity; | 
 |         iter = collection[iteratorSymbol](); | 
 |         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |       } | 
 |       if (!size) { | 
 |         return callback(null, []); | 
 |       } | 
 |       iterate(); | 
 |  | 
 |       function arrayIterator() { | 
 |         value = collection[completed]; | 
 |         iterator(value, done); | 
 |       } | 
 |  | 
 |       function arrayIteratorWithIndex() { | 
 |         value = collection[completed]; | 
 |         iterator(value, completed, done); | 
 |       } | 
 |  | 
 |       function symbolIterator() { | 
 |         item = iter.next(); | 
 |         value = item.value; | 
 |         item.done ? callback(null, result) : iterator(value, done); | 
 |       } | 
 |  | 
 |       function symbolIteratorWithKey() { | 
 |         item = iter.next(); | 
 |         value = item.value; | 
 |         item.done ? callback(null, result) : iterator(value, completed, done); | 
 |       } | 
 |  | 
 |       function objectIterator() { | 
 |         key = keys[completed]; | 
 |         value = collection[key]; | 
 |         iterator(value, done); | 
 |       } | 
 |  | 
 |       function objectIteratorWithKey() { | 
 |         key = keys[completed]; | 
 |         value = collection[key]; | 
 |         iterator(value, key, done); | 
 |       } | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           callback(err); | 
 |           return; | 
 |         } | 
 |         if (!!res === bool) { | 
 |           result[result.length] = value; | 
 |         } | 
 |         if (++completed === size) { | 
 |           iterate = throwError; | 
 |           callback(null, result); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createFilterLimit(bool) { | 
 |     return function(collection, limit, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, index, key, value, keys, iter, item, iterate, result; | 
 |       var sync = false; | 
 |       var started = 0; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = Infinity; | 
 |         result = []; | 
 |         iter = collection[iteratorSymbol](); | 
 |         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |       } | 
 |       if (!size || isNaN(limit) || limit < 1) { | 
 |         return callback(null, []); | 
 |       } | 
 |       result = result || Array(size); | 
 |       timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |       function arrayIterator() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[index]; | 
 |           iterator(value, createCallback(value, index)); | 
 |         } | 
 |       } | 
 |  | 
 |       function arrayIteratorWithIndex() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[index]; | 
 |           iterator(value, index, createCallback(value, index)); | 
 |         } | 
 |       } | 
 |  | 
 |       function symbolIterator() { | 
 |         item = iter.next(); | 
 |         if (item.done === false) { | 
 |           value = item.value; | 
 |           iterator(value, createCallback(value, started++)); | 
 |         } else if (completed === started && iterator !== noop) { | 
 |           iterator = noop; | 
 |           callback(null, compact(result)); | 
 |         } | 
 |       } | 
 |  | 
 |       function symbolIteratorWithKey() { | 
 |         item = iter.next(); | 
 |         if (item.done === false) { | 
 |           value = item.value; | 
 |           iterator(value, started, createCallback(value, started++)); | 
 |         } else if (completed === started && iterator !== noop) { | 
 |           iterator = noop; | 
 |           callback(null, compact(result)); | 
 |         } | 
 |       } | 
 |  | 
 |       function objectIterator() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[keys[index]]; | 
 |           iterator(value, createCallback(value, index)); | 
 |         } | 
 |       } | 
 |  | 
 |       function objectIteratorWithKey() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           key = keys[index]; | 
 |           value = collection[key]; | 
 |           iterator(value, key, createCallback(value, index)); | 
 |         } | 
 |       } | 
 |  | 
 |       function createCallback(value, index) { | 
 |         return function(err, res) { | 
 |           if (index === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             index = null; | 
 |             iterate = noop; | 
 |             callback = once(callback); | 
 |             callback(err); | 
 |             return; | 
 |           } | 
 |           if (!!res === bool) { | 
 |             result[index] = value; | 
 |           } | 
 |           index = null; | 
 |           if (++completed === size) { | 
 |             callback = onlyOnce(callback); | 
 |             callback(null, compact(result)); | 
 |           } else if (sync) { | 
 |             nextTick(iterate); | 
 |           } else { | 
 |             sync = true; | 
 |             iterate(); | 
 |           } | 
 |           sync = false; | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace eachSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'b']] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // break | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num !== 3); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 3] | 
 |    * }); | 
 |    */ | 
 |   function eachSeries(collection, iterator, callback) { | 
 |     callback = onlyOnce(callback || noop); | 
 |     var size, key, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       iterator(collection[completed], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       iterator(collection[completed], completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null) : iterator(item.value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null) : iterator(item.value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       iterator(collection[keys[completed]], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       iterator(collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, bool) { | 
 |       if (err) { | 
 |         callback(err); | 
 |       } else if (++completed === size || bool === false) { | 
 |         iterate = throwError; | 
 |         callback(null); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace eachLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // break | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num !== 5); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.eachLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // undefined | 
 |    *   console.log(order); // [1, 3, 5] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function eachLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, index, key, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } else { | 
 |       return callback(null); | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null); | 
 |     } | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       if (started < size) { | 
 |         iterator(collection[started++], done); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(collection[index], index, done); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         started++; | 
 |         iterator(item.value, done); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, started++, done); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       if (started < size) { | 
 |         iterator(collection[keys[started++]], done); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         key = keys[index]; | 
 |         iterator(collection[key], key, done); | 
 |       } | 
 |     } | 
 |  | 
 |     function done(err, bool) { | 
 |       if (err || bool === false) { | 
 |         iterate = noop; | 
 |         callback = once(callback); | 
 |         callback(err); | 
 |       } else if (++completed === size) { | 
 |         iterator = noop; | 
 |         iterate = throwError; | 
 |         callback = onlyOnce(callback); | 
 |         callback(null); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace mapSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2]; | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function mapSeries(collection, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, key, keys, iter, item, result, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       result = []; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, []); | 
 |     } | 
 |     result = result || Array(size); | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       iterator(collection[completed], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       iterator(collection[completed], completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(item.value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(item.value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       iterator(collection[keys[completed]], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       iterator(collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         iterate = throwError; | 
 |         callback = onlyOnce(callback); | 
 |         callback(err, createArray(result)); | 
 |         return; | 
 |       } | 
 |       result[completed] = res; | 
 |       if (++completed === size) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |         callback = throwError; | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace mapLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3, 4, 2] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3, 4, 2] | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3, 4, 2] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 5, 3, 4, 2] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function mapLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, index, key, keys, iter, item, result, iterate; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       result = []; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, []); | 
 |     } | 
 |     result = result || Array(size); | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(collection[index], createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(collection[index], index, createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, createCallback(started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, started, createCallback(started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(collection[keys[index]], createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         key = keys[index]; | 
 |         iterator(collection[key], key, createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(index) { | 
 |       return function(err, res) { | 
 |         if (index === null) { | 
 |           throwError(); | 
 |         } | 
 |         if (err) { | 
 |           index = null; | 
 |           iterate = noop; | 
 |           callback = once(callback); | 
 |           callback(err, createArray(result)); | 
 |           return; | 
 |         } | 
 |         result[index] = res; | 
 |         index = null; | 
 |         if (++completed === size) { | 
 |           iterate = throwError; | 
 |           callback(null, result); | 
 |           callback = throwError; | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace mapValuesSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3, '2': 2 } | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3, '2': 2 } | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3, c: 2 } | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 3, c: 2 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function mapValuesSeries(collection, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, key, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var result = {}; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, result); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       key = completed; | 
 |       iterator(collection[completed], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       key = completed; | 
 |       iterator(collection[completed], completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       key = completed; | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(item.value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       key = completed; | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(item.value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       key = keys[completed]; | 
 |       iterator(collection[key], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       iterator(collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         iterate = throwError; | 
 |         callback = onlyOnce(callback); | 
 |         callback(err, objectClone(result)); | 
 |         return; | 
 |       } | 
 |       result[key] = res; | 
 |       if (++completed === size) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |         callback = throwError; | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace mapValuesLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 5, '2': 3, '3': 4, '4': 2 } | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 5, '2': 3, '3': 4, '4': 2 } | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 5, c: 3, d: 4, e: 2 } | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.mapValuesLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 5, c: 3, d: 4, e: 2 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function mapValuesLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, index, key, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var result = {}; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, result); | 
 |     } | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(collection[index], createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(collection[index], index, createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, createCallback(started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, started, createCallback(started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         key = keys[index]; | 
 |         iterator(collection[key], createCallback(key)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         key = keys[index]; | 
 |         iterator(collection[key], key, createCallback(key)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(key) { | 
 |       return function(err, res) { | 
 |         if (key === null) { | 
 |           throwError(); | 
 |         } | 
 |         if (err) { | 
 |           key = null; | 
 |           iterate = noop; | 
 |           callback = once(callback); | 
 |           callback(err, objectClone(result)); | 
 |           return; | 
 |         } | 
 |         result[key] = res; | 
 |         key = null; | 
 |         if (++completed === size) { | 
 |           callback(null, result); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createDetect(arrayEach, baseEach, symbolEach, bool) { | 
 |     return function(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, keys; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null); | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null); | 
 |       } | 
 |  | 
 |       function createCallback(value) { | 
 |         var called = false; | 
 |         return function done(err, res) { | 
 |           if (called) { | 
 |             throwError(); | 
 |           } | 
 |           called = true; | 
 |           if (err) { | 
 |             callback = once(callback); | 
 |             callback(err); | 
 |           } else if (!!res === bool) { | 
 |             callback = once(callback); | 
 |             callback(null, value); | 
 |           } else if (++completed === size) { | 
 |             callback(null); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createDetectSeries(bool) { | 
 |     return function(collection, iterator, callback) { | 
 |       callback = onlyOnce(callback || noop); | 
 |       var size, key, value, keys, iter, item, iterate; | 
 |       var sync = false; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = Infinity; | 
 |         iter = collection[iteratorSymbol](); | 
 |         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |       } | 
 |       if (!size) { | 
 |         return callback(null); | 
 |       } | 
 |       iterate(); | 
 |  | 
 |       function arrayIterator() { | 
 |         value = collection[completed]; | 
 |         iterator(value, done); | 
 |       } | 
 |  | 
 |       function arrayIteratorWithIndex() { | 
 |         value = collection[completed]; | 
 |         iterator(value, completed, done); | 
 |       } | 
 |  | 
 |       function symbolIterator() { | 
 |         item = iter.next(); | 
 |         value = item.value; | 
 |         item.done ? callback(null) : iterator(value, done); | 
 |       } | 
 |  | 
 |       function symbolIteratorWithKey() { | 
 |         item = iter.next(); | 
 |         value = item.value; | 
 |         item.done ? callback(null) : iterator(value, completed, done); | 
 |       } | 
 |  | 
 |       function objectIterator() { | 
 |         value = collection[keys[completed]]; | 
 |         iterator(value, done); | 
 |       } | 
 |  | 
 |       function objectIteratorWithKey() { | 
 |         key = keys[completed]; | 
 |         value = collection[key]; | 
 |         iterator(value, key, done); | 
 |       } | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           callback(err); | 
 |         } else if (!!res === bool) { | 
 |           iterate = throwError; | 
 |           callback(null, value); | 
 |         } else if (++completed === size) { | 
 |           iterate = throwError; | 
 |           callback(null); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createDetectLimit(bool) { | 
 |     return function(collection, limit, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, index, key, value, keys, iter, item, iterate; | 
 |       var sync = false; | 
 |       var started = 0; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = Infinity; | 
 |         iter = collection[iteratorSymbol](); | 
 |         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |       } | 
 |       if (!size || isNaN(limit) || limit < 1) { | 
 |         return callback(null); | 
 |       } | 
 |       timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |       function arrayIterator() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[index]; | 
 |           iterator(value, createCallback(value)); | 
 |         } | 
 |       } | 
 |  | 
 |       function arrayIteratorWithIndex() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[index]; | 
 |           iterator(value, index, createCallback(value)); | 
 |         } | 
 |       } | 
 |  | 
 |       function symbolIterator() { | 
 |         item = iter.next(); | 
 |         if (item.done === false) { | 
 |           started++; | 
 |           value = item.value; | 
 |           iterator(value, createCallback(value)); | 
 |         } else if (completed === started && iterator !== noop) { | 
 |           iterator = noop; | 
 |           callback(null); | 
 |         } | 
 |       } | 
 |  | 
 |       function symbolIteratorWithKey() { | 
 |         item = iter.next(); | 
 |         if (item.done === false) { | 
 |           value = item.value; | 
 |           iterator(value, started++, createCallback(value)); | 
 |         } else if (completed === started && iterator !== noop) { | 
 |           iterator = noop; | 
 |           callback(null); | 
 |         } | 
 |       } | 
 |  | 
 |       function objectIterator() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[keys[index]]; | 
 |           iterator(value, createCallback(value)); | 
 |         } | 
 |       } | 
 |  | 
 |       function objectIteratorWithKey() { | 
 |         if (started < size) { | 
 |           key = keys[started++]; | 
 |           value = collection[key]; | 
 |           iterator(value, key, createCallback(value)); | 
 |         } | 
 |       } | 
 |  | 
 |       function createCallback(value) { | 
 |         var called = false; | 
 |         return function(err, res) { | 
 |           if (called) { | 
 |             throwError(); | 
 |           } | 
 |           called = true; | 
 |           if (err) { | 
 |             iterate = noop; | 
 |             callback = once(callback); | 
 |             callback(err); | 
 |           } else if (!!res === bool) { | 
 |             iterate = noop; | 
 |             callback = once(callback); | 
 |             callback(null, value); | 
 |           } else if (++completed === size) { | 
 |             callback(null); | 
 |           } else if (sync) { | 
 |             nextTick(iterate); | 
 |           } else { | 
 |             sync = true; | 
 |             iterate(); | 
 |           } | 
 |           sync = false; | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createPick(arrayEach, baseEach, symbolEach, bool) { | 
 |     return function(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, keys; | 
 |       var completed = 0; | 
 |       var result = {}; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null, result); | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         return callback(null, {}); | 
 |       } | 
 |  | 
 |       function createCallback(key, value) { | 
 |         return function done(err, res) { | 
 |           if (key === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             key = null; | 
 |             callback = once(callback); | 
 |             callback(err, objectClone(result)); | 
 |             return; | 
 |           } | 
 |           if (!!res === bool) { | 
 |             result[key] = value; | 
 |           } | 
 |           key = null; | 
 |           if (++completed === size) { | 
 |             callback(null, result); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createPickSeries(bool) { | 
 |     return function(collection, iterator, callback) { | 
 |       callback = onlyOnce(callback || noop); | 
 |       var size, key, value, keys, iter, item, iterate; | 
 |       var sync = false; | 
 |       var result = {}; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = Infinity; | 
 |         iter = collection[iteratorSymbol](); | 
 |         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |       } | 
 |       if (!size) { | 
 |         return callback(null, {}); | 
 |       } | 
 |       iterate(); | 
 |  | 
 |       function arrayIterator() { | 
 |         key = completed; | 
 |         value = collection[completed]; | 
 |         iterator(value, done); | 
 |       } | 
 |  | 
 |       function arrayIteratorWithIndex() { | 
 |         key = completed; | 
 |         value = collection[completed]; | 
 |         iterator(value, completed, done); | 
 |       } | 
 |  | 
 |       function symbolIterator() { | 
 |         key = completed; | 
 |         item = iter.next(); | 
 |         value = item.value; | 
 |         item.done ? callback(null, result) : iterator(value, done); | 
 |       } | 
 |  | 
 |       function symbolIteratorWithKey() { | 
 |         key = completed; | 
 |         item = iter.next(); | 
 |         value = item.value; | 
 |         item.done ? callback(null, result) : iterator(value, key, done); | 
 |       } | 
 |  | 
 |       function objectIterator() { | 
 |         key = keys[completed]; | 
 |         value = collection[key]; | 
 |         iterator(value, done); | 
 |       } | 
 |  | 
 |       function objectIteratorWithKey() { | 
 |         key = keys[completed]; | 
 |         value = collection[key]; | 
 |         iterator(value, key, done); | 
 |       } | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           callback(err, result); | 
 |           return; | 
 |         } | 
 |         if (!!res === bool) { | 
 |           result[key] = value; | 
 |         } | 
 |         if (++completed === size) { | 
 |           iterate = throwError; | 
 |           callback(null, result); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {boolean} bool | 
 |    */ | 
 |   function createPickLimit(bool) { | 
 |     return function(collection, limit, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, index, key, value, keys, iter, item, iterate; | 
 |       var sync = false; | 
 |       var result = {}; | 
 |       var started = 0; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = Infinity; | 
 |         iter = collection[iteratorSymbol](); | 
 |         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |       } | 
 |       if (!size || isNaN(limit) || limit < 1) { | 
 |         return callback(null, {}); | 
 |       } | 
 |       timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |       function arrayIterator() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[index]; | 
 |           iterator(value, createCallback(value, index)); | 
 |         } | 
 |       } | 
 |  | 
 |       function arrayIteratorWithIndex() { | 
 |         index = started++; | 
 |         if (index < size) { | 
 |           value = collection[index]; | 
 |           iterator(value, index, createCallback(value, index)); | 
 |         } | 
 |       } | 
 |  | 
 |       function symbolIterator() { | 
 |         item = iter.next(); | 
 |         if (item.done === false) { | 
 |           value = item.value; | 
 |           iterator(value, createCallback(value, started++)); | 
 |         } else if (completed === started && iterator !== noop) { | 
 |           iterator = noop; | 
 |           callback(null, result); | 
 |         } | 
 |       } | 
 |  | 
 |       function symbolIteratorWithKey() { | 
 |         item = iter.next(); | 
 |         if (item.done === false) { | 
 |           value = item.value; | 
 |           iterator(value, started, createCallback(value, started++)); | 
 |         } else if (completed === started && iterator !== noop) { | 
 |           iterator = noop; | 
 |           callback(null, result); | 
 |         } | 
 |       } | 
 |  | 
 |       function objectIterator() { | 
 |         if (started < size) { | 
 |           key = keys[started++]; | 
 |           value = collection[key]; | 
 |           iterator(value, createCallback(value, key)); | 
 |         } | 
 |       } | 
 |  | 
 |       function objectIteratorWithKey() { | 
 |         if (started < size) { | 
 |           key = keys[started++]; | 
 |           value = collection[key]; | 
 |           iterator(value, key, createCallback(value, key)); | 
 |         } | 
 |       } | 
 |  | 
 |       function createCallback(value, key) { | 
 |         return function(err, res) { | 
 |           if (key === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             key = null; | 
 |             iterate = noop; | 
 |             callback = once(callback); | 
 |             callback(err, objectClone(result)); | 
 |             return; | 
 |           } | 
 |           if (!!res === bool) { | 
 |             result[key] = value; | 
 |           } | 
 |           key = null; | 
 |           if (++completed === size) { | 
 |             iterate = throwError; | 
 |             callback = onlyOnce(callback); | 
 |             callback(null, result); | 
 |           } else if (sync) { | 
 |             nextTick(iterate); | 
 |           } else { | 
 |             sync = true; | 
 |             iterate(); | 
 |           } | 
 |           sync = false; | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace reduce | 
 |    * @param {Array|Object} collection | 
 |    * @param {*} result | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduce(collection, 0, iterator, function(err, res) { | 
 |    *   console.log(res); // 10 | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduce(collection, '', iterator, function(err, res) { | 
 |    *   console.log(res); // '1324' | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduce(collection, '', iterator, function(err, res) { | 
 |    *   console.log(res); // '1324' | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduce(collection, 0, iterator, function(err, res) { | 
 |    *   console.log(res); // 10 | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'b'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function reduce(collection, result, iterator, callback) { | 
 |     callback = onlyOnce(callback || noop); | 
 |     var size, key, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 4 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, result); | 
 |     } | 
 |     iterate(result); | 
 |  | 
 |     function arrayIterator(result) { | 
 |       iterator(result, collection[completed], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex(result) { | 
 |       iterator(result, collection[completed], completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator(result) { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(result, item.value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey(result) { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(result, item.value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator(result) { | 
 |       iterator(result, collection[keys[completed]], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey(result) { | 
 |       key = keys[completed]; | 
 |       iterator(result, collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, result) { | 
 |       if (err) { | 
 |         callback(err, result); | 
 |       } else if (++completed === size) { | 
 |         iterator = throwError; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(function() { | 
 |           iterate(result); | 
 |         }); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(result); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace reduceRight | 
 |    * @param {Array|Object} collection | 
 |    * @param {*} result | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduceRight(collection, 0, iterator, function(err, res) { | 
 |    *   console.log(res); // 10 | 
 |    *   console.log(order); // [4, 2, 3, 1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduceRight(collection, '', iterator, function(err, res) { | 
 |    *   console.log(res); // '4231' | 
 |    *   console.log(order); // [[4, 3], [2, 2], [3, 1], [1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduceRight(collection, '', iterator, function(err, res) { | 
 |    *   console.log(res); // '4231' | 
 |    *   console.log(order); // [4, 2, 3, 1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, result + num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.reduceRight(collection, 0, iterator, function(err, res) { | 
 |    *   console.log(res); // 10 | 
 |    *   console.log(order); // [[4, 3], [2, 2], [3, 1], [1, 0]] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function reduceRight(collection, result, iterator, callback) { | 
 |     callback = onlyOnce(callback || noop); | 
 |     var resIndex, index, key, keys, iter, item, col, iterate; | 
 |     var sync = false; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       resIndex = collection.length; | 
 |       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       col = []; | 
 |       iter = collection[iteratorSymbol](); | 
 |       index = -1; | 
 |       while ((item = iter.next()).done === false) { | 
 |         col[++index] = item.value; | 
 |       } | 
 |       collection = col; | 
 |       resIndex = col.length; | 
 |       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       resIndex = keys.length; | 
 |       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!resIndex) { | 
 |       return callback(null, result); | 
 |     } | 
 |     iterate(result); | 
 |  | 
 |     function arrayIterator(result) { | 
 |       iterator(result, collection[--resIndex], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex(result) { | 
 |       iterator(result, collection[--resIndex], resIndex, done); | 
 |     } | 
 |  | 
 |     function objectIterator(result) { | 
 |       iterator(result, collection[keys[--resIndex]], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey(result) { | 
 |       key = keys[--resIndex]; | 
 |       iterator(result, collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, result) { | 
 |       if (err) { | 
 |         callback(err, result); | 
 |       } else if (resIndex === 0) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(function() { | 
 |           iterate(result); | 
 |         }); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(result); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    */ | 
 |   function createTransform(arrayEach, baseEach, symbolEach) { | 
 |     return function transform(collection, accumulator, iterator, callback) { | 
 |       if (arguments.length === 3) { | 
 |         callback = iterator; | 
 |         iterator = accumulator; | 
 |         accumulator = undefined; | 
 |       } | 
 |       callback = callback || noop; | 
 |       var size, keys, result; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         result = accumulator !== undefined ? accumulator : []; | 
 |         arrayEach(collection, result, iterator, done); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         result = accumulator !== undefined ? accumulator : {}; | 
 |         size = symbolEach(collection, result, iterator, done); | 
 |         size && size === completed && callback(null, result); | 
 |       } else if (typeof collection === obj) { | 
 |         keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         result = accumulator !== undefined ? accumulator : {}; | 
 |         baseEach(collection, result, iterator, done, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null, accumulator !== undefined ? accumulator : result || {}); | 
 |       } | 
 |  | 
 |       function done(err, bool) { | 
 |         if (err) { | 
 |           callback = once(callback); | 
 |           callback(err, isArray(result) ? createArray(result) : objectClone(result)); | 
 |         } else if (++completed === size) { | 
 |           callback(null, result); | 
 |         } else if (bool === false) { | 
 |           callback = once(callback); | 
 |           callback(null, isArray(result) ? createArray(result) : objectClone(result)); | 
 |         } | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace transformSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Array|Object|Function} [accumulator] | 
 |    * @param {Function} [iterator] | 
 |    * @param {Function} [callback] | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     result.push(num) | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformSeries(collection, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2, 4] | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index and accumulator | 
 |    * var order = []; | 
 |    * var collection = [1, 3, 2, 4]; | 
 |    * var iterator = function(result, num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     result[index] = num; | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformSeries(collection, {}, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 3, '2': 2, '3': 4 } | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with accumulator | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     result.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformSeries(collection, [], iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2, 4] | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2, d: 4 }; | 
 |    * var iterator = function(result, num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     result[key] = num; | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformSeries(collection, iterator, function(err, res) { | 
 |    *   console.log(res); //  { a: 1, b: 3, c: 2, d: 4 } | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'b'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function transformSeries(collection, accumulator, iterator, callback) { | 
 |     if (arguments.length === 3) { | 
 |       callback = iterator; | 
 |       iterator = accumulator; | 
 |       accumulator = undefined; | 
 |     } | 
 |     callback = onlyOnce(callback || noop); | 
 |     var size, key, keys, iter, item, iterate, result; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       result = accumulator !== undefined ? accumulator : []; | 
 |       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       result = accumulator !== undefined ? accumulator : {}; | 
 |       iterate = iterator.length === 4 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       result = accumulator !== undefined ? accumulator : {}; | 
 |       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, accumulator !== undefined ? accumulator : result || {}); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       iterator(result, collection[completed], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       iterator(result, collection[completed], completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(result, item.value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(result, item.value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       iterator(result, collection[keys[completed]], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       iterator(result, collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, bool) { | 
 |       if (err) { | 
 |         callback(err, result); | 
 |       } else if (++completed === size || bool === false) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace transformLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Array|Object|Function} [accumulator] | 
 |    * @param {Function} [iterator] | 
 |    * @param {Function} [callback] | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     result.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 5, 2, 4] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index and accumulator | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(result, num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     result[index] = key; | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformLimit(array, 2, {}, iterator, function(err, res) { | 
 |    *   console.log(res); // { '0': 1, '1': 5, '2': 3, '3': 4, '4': 2 } | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with accumulator | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(result, num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     result.push(num); | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformLimit(object, 2, [], iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 5, 2, 4] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(result, num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     result[key] = num; | 
 |    *     done(); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.transformLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function transformLimit(collection, limit, accumulator, iterator, callback) { | 
 |     if (arguments.length === 4) { | 
 |       callback = iterator; | 
 |       iterator = accumulator; | 
 |       accumulator = undefined; | 
 |     } | 
 |     callback = callback || noop; | 
 |     var size, index, key, keys, iter, item, iterate, result; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       result = accumulator !== undefined ? accumulator : []; | 
 |       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       result = accumulator !== undefined ? accumulator : {}; | 
 |       iterate = iterator.length === 4 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       result = accumulator !== undefined ? accumulator : {}; | 
 |       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, accumulator !== undefined ? accumulator : result || {}); | 
 |     } | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(result, collection[index], onlyOnce(done)); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(result, collection[index], index, onlyOnce(done)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         started++; | 
 |         iterator(result, item.value, onlyOnce(done)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(result, item.value, started++, onlyOnce(done)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         iterator(result, collection[keys[index]], onlyOnce(done)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         key = keys[index]; | 
 |         iterator(result, collection[key], key, onlyOnce(done)); | 
 |       } | 
 |     } | 
 |  | 
 |     function done(err, bool) { | 
 |       if (err || bool === false) { | 
 |         iterate = noop; | 
 |         callback(err || null, isArray(result) ? createArray(result) : objectClone(result)); | 
 |         callback = noop; | 
 |       } else if (++completed === size) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {function} arrayEach | 
 |    * @param {function} baseEach | 
 |    * @param {function} symbolEach | 
 |    */ | 
 |   function createSortBy(arrayEach, baseEach, symbolEach) { | 
 |     return function sortBy(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, array, criteria; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         array = Array(size); | 
 |         criteria = Array(size); | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         array = []; | 
 |         criteria = []; | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null, sortByCriteria(array, criteria)); | 
 |       } else if (typeof collection === obj) { | 
 |         var keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         array = Array(size); | 
 |         criteria = Array(size); | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null, []); | 
 |       } | 
 |  | 
 |       function createCallback(index, value) { | 
 |         var called = false; | 
 |         array[index] = value; | 
 |         return function done(err, criterion) { | 
 |           if (called) { | 
 |             throwError(); | 
 |           } | 
 |           called = true; | 
 |           criteria[index] = criterion; | 
 |           if (err) { | 
 |             callback = once(callback); | 
 |             callback(err); | 
 |           } else if (++completed === size) { | 
 |             callback(null, sortByCriteria(array, criteria)); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace sortBySeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBySeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3]; | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBySeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBySeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortBySeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function sortBySeries(collection, iterator, callback) { | 
 |     callback = onlyOnce(callback || noop); | 
 |     var size, key, value, keys, iter, item, array, criteria, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       array = collection; | 
 |       criteria = Array(size); | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       array = []; | 
 |       criteria = []; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       array = Array(size); | 
 |       criteria = Array(size); | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, []); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       value = collection[completed]; | 
 |       iterator(value, done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       value = collection[completed]; | 
 |       iterator(value, completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done) { | 
 |         return callback(null, sortByCriteria(array, criteria)); | 
 |       } | 
 |       value = item.value; | 
 |       array[completed] = value; | 
 |       iterator(value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done) { | 
 |         return callback(null, sortByCriteria(array, criteria)); | 
 |       } | 
 |       value = item.value; | 
 |       array[completed] = value; | 
 |       iterator(value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       value = collection[keys[completed]]; | 
 |       array[completed] = value; | 
 |       iterator(value, done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       value = collection[key]; | 
 |       array[completed] = value; | 
 |       iterator(value, key, done); | 
 |     } | 
 |  | 
 |     function done(err, criterion) { | 
 |       criteria[completed] = criterion; | 
 |       if (err) { | 
 |         callback(err); | 
 |       } else if (++completed === size) { | 
 |         iterate = throwError; | 
 |         callback(null, sortByCriteria(array, criteria)); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace sortByLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortByLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4, 5] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortByLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4, 5] | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortByLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4, 5] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.sortByLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4, 5] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function sortByLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, index, key, value, array, keys, iter, item, criteria, iterate; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       array = collection; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       array = []; | 
 |       criteria = []; | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       array = Array(size); | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, []); | 
 |     } | 
 |     criteria = criteria || Array(size); | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       if (started < size) { | 
 |         value = collection[started]; | 
 |         iterator(value, createCallback(value, started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         value = collection[index]; | 
 |         iterator(value, index, createCallback(value, index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         value = item.value; | 
 |         array[started] = value; | 
 |         iterator(value, createCallback(value, started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, sortByCriteria(array, criteria)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         value = item.value; | 
 |         array[started] = value; | 
 |         iterator(value, started, createCallback(value, started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, sortByCriteria(array, criteria)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       if (started < size) { | 
 |         value = collection[keys[started]]; | 
 |         array[started] = value; | 
 |         iterator(value, createCallback(value, started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       if (started < size) { | 
 |         key = keys[started]; | 
 |         value = collection[key]; | 
 |         array[started] = value; | 
 |         iterator(value, key, createCallback(value, started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(value, index) { | 
 |       var called = false; | 
 |       return function(err, criterion) { | 
 |         if (called) { | 
 |           throwError(); | 
 |         } | 
 |         called = true; | 
 |         criteria[index] = criterion; | 
 |         if (err) { | 
 |           iterate = noop; | 
 |           callback(err); | 
 |           callback = noop; | 
 |         } else if (++completed === size) { | 
 |           callback(null, sortByCriteria(array, criteria)); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace some | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.some(array, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.some(array, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [[1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.some(object, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.some(object, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [[1, 'a']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function some(collection, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     detect(collection, iterator, done); | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       callback(null, !!res); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace someSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [[1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [[1, 'a']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function someSeries(collection, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     detectSeries(collection, iterator, done); | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       callback(null, !!res); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace someLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [[1, 0]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num % 2); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.someLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // true | 
 |    *   console.log(order); // [[1, 'a']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function someLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     detectLimit(collection, limit, iterator, done); | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       callback(null, !!res); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    */ | 
 |   function createEvery(arrayEach, baseEach, symbolEach) { | 
 |     var deny = createDetect(arrayEach, baseEach, symbolEach, false); | 
 |  | 
 |     return function every(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       deny(collection, iterator, done); | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           return callback(err); | 
 |         } | 
 |         callback(null, !res); | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function createEverySeries() { | 
 |     var denySeries = createDetectSeries(false); | 
 |  | 
 |     return function everySeries(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       denySeries(collection, iterator, done); | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           return callback(err); | 
 |         } | 
 |         callback(null, !res); | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function createEveryLimit() { | 
 |     var denyLimit = createDetectLimit(false); | 
 |  | 
 |     return function everyLimit(collection, limit, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       denyLimit(collection, limit, iterator, done); | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           return callback(err); | 
 |         } | 
 |         callback(null, !res); | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    */ | 
 |   function createConcat(arrayEach, baseEach, symbolEach) { | 
 |     return function concat(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size, result; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         result = Array(size); | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         result = []; | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null, result); | 
 |       } else if (typeof collection === obj) { | 
 |         var keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         result = Array(size); | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null, []); | 
 |       } | 
 |  | 
 |       function createCallback(index) { | 
 |         return function done(err, res) { | 
 |           if (index === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             index = null; | 
 |             callback = once(callback); | 
 |             arrayEachSync(result, function(array, index) { | 
 |               if (array === undefined) { | 
 |                 result[index] = noop; | 
 |               } | 
 |             }); | 
 |             callback(err, makeConcatResult(result)); | 
 |             return; | 
 |           } | 
 |           switch (arguments.length) { | 
 |             case 0: | 
 |             case 1: | 
 |               result[index] = noop; | 
 |               break; | 
 |             case 2: | 
 |               result[index] = res; | 
 |               break; | 
 |             default: | 
 |               result[index] = slice(arguments, 1); | 
 |               break; | 
 |           } | 
 |           index = null; | 
 |           if (++completed === size) { | 
 |             callback(null, makeConcatResult(result)); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace concatSeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concatSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2]; | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 3, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concatSeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [[1, 0], [3, 1], [2, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concatSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [1, 3, 2] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 3, c: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concatSeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 2] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function concatSeries(collection, iterator, callback) { | 
 |     callback = onlyOnce(callback || noop); | 
 |     var size, key, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var result = []; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, result); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       iterator(collection[completed], done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       iterator(collection[completed], completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(item.value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       item.done ? callback(null, result) : iterator(item.value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       iterator(collection[keys[completed]], done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       iterator(collection[key], key, done); | 
 |     } | 
 |  | 
 |     function done(err, array) { | 
 |       if (isArray(array)) { | 
 |         nativePush.apply(result, array); | 
 |       } else if (arguments.length >= 2) { | 
 |         nativePush.apply(result, slice(arguments, 1)); | 
 |       } | 
 |       if (err) { | 
 |         callback(err, result); | 
 |       } else if (++completed === size) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace concatLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concatLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 5, 2, 4] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1, 5, 3, 4, 2]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.cocnatLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 5, 2, 4] | 
 |    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, [num]); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.concatLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 5, 2, 4] | 
 |    *   console.log(order); // [1, 3, 5, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, num); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.cocnatLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [1, 3, 5, 2, 4] | 
 |    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function concatLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, key, iter, item, iterate, result; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       result = []; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       var keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, []); | 
 |     } | 
 |     result = result || Array(size); | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       if (started < size) { | 
 |         iterator(collection[started], createCallback(started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       if (started < size) { | 
 |         iterator(collection[started], started, createCallback(started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, createCallback(started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, makeConcatResult(result)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         iterator(item.value, started, createCallback(started++)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, makeConcatResult(result)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       if (started < size) { | 
 |         iterator(collection[keys[started]], createCallback(started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       if (started < size) { | 
 |         key = keys[started]; | 
 |         iterator(collection[key], key, createCallback(started++)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(index) { | 
 |       return function(err, res) { | 
 |         if (index === null) { | 
 |           throwError(); | 
 |         } | 
 |         if (err) { | 
 |           index = null; | 
 |           iterate = noop; | 
 |           callback = once(callback); | 
 |           arrayEachSync(result, function(array, index) { | 
 |             if (array === undefined) { | 
 |               result[index] = noop; | 
 |             } | 
 |           }); | 
 |           callback(err, makeConcatResult(result)); | 
 |           return; | 
 |         } | 
 |         switch (arguments.length) { | 
 |           case 0: | 
 |           case 1: | 
 |             result[index] = noop; | 
 |             break; | 
 |           case 2: | 
 |             result[index] = res; | 
 |             break; | 
 |           default: | 
 |             result[index] = slice(arguments, 1); | 
 |             break; | 
 |         } | 
 |         index = null; | 
 |         if (++completed === size) { | 
 |           iterate = throwError; | 
 |           callback(null, makeConcatResult(result)); | 
 |           callback = throwError; | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    * @param {Function} symbolEach | 
 |    */ | 
 |   function createGroupBy(arrayEach, baseEach, symbolEach) { | 
 |     return function groupBy(collection, iterator, callback) { | 
 |       callback = callback || noop; | 
 |       var size; | 
 |       var completed = 0; | 
 |       var result = {}; | 
 |  | 
 |       if (isArray(collection)) { | 
 |         size = collection.length; | 
 |         arrayEach(collection, iterator, createCallback); | 
 |       } else if (!collection) { | 
 |       } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |         size = symbolEach(collection, iterator, createCallback); | 
 |         size && size === completed && callback(null, result); | 
 |       } else if (typeof collection === obj) { | 
 |         var keys = nativeKeys(collection); | 
 |         size = keys.length; | 
 |         baseEach(collection, iterator, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null, {}); | 
 |       } | 
 |  | 
 |       function createCallback(value) { | 
 |         var called = false; | 
 |         return function done(err, key) { | 
 |           if (called) { | 
 |             throwError(); | 
 |           } | 
 |           called = true; | 
 |           if (err) { | 
 |             callback = once(callback); | 
 |             callback(err, objectClone(result)); | 
 |             return; | 
 |           } | 
 |           var array = result[key]; | 
 |           if (!array) { | 
 |             result[key] = [value]; | 
 |           } else { | 
 |             array.push(value); | 
 |           } | 
 |           if (++completed === size) { | 
 |             callback(null, result); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace groupBySeries | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [4.2, 6.4, 6.1]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBySeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] } | 
 |    *   console.log(order); // [4.2, 6.4, 6.1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [4.2, 6.4, 6.1]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBySeries(array, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] } | 
 |    *   console.log(order); // [[4.2, 0], [6.4, 1], [6.1, 2]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 4.2, b: 6.4, c: 6.1 }; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBySeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] } | 
 |    *   console.log(order); // [4.2, 6.4, 6.1] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 4.2, b: 6.4, c: 6.1 }; | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupBySeries(object, iterator, function(err, res) { | 
 |    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] } | 
 |    *   console.log(order); // [[4.2, 'a'], [6.4, 'b'], [6.1, 'c']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function groupBySeries(collection, iterator, callback) { | 
 |     callback = onlyOnce(callback || noop); | 
 |     var size, key, value, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |     var result = {}; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, result); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       value = collection[completed]; | 
 |       iterator(value, done); | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       value = collection[completed]; | 
 |       iterator(value, completed, done); | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       value = item.value; | 
 |       item.done ? callback(null, result) : iterator(value, done); | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       value = item.value; | 
 |       item.done ? callback(null, result) : iterator(value, completed, done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       value = collection[keys[completed]]; | 
 |       iterator(value, done); | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       key = keys[completed]; | 
 |       value = collection[key]; | 
 |       iterator(value, key, done); | 
 |     } | 
 |  | 
 |     function done(err, key) { | 
 |       if (err) { | 
 |         iterate = throwError; | 
 |         callback = onlyOnce(callback); | 
 |         callback(err, objectClone(result)); | 
 |         return; | 
 |       } | 
 |       var array = result[key]; | 
 |       if (!array) { | 
 |         result[key] = [value]; | 
 |       } else { | 
 |         array.push(value); | 
 |       } | 
 |       if (++completed === size) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace groupByLimit | 
 |    * @param {Array|Object} collection | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var order = []; | 
 |    * var array = [1.1, 5.9, 3.2, 3.9, 2.1]; | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupByLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] } | 
 |    *   console.log(order); // [1.1, 3.2, 5.9, 2.1, 3.9] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // array with index | 
 |    * var order = []; | 
 |    * var array = [1.1, 5.9, 3.2, 3.9, 2.1]; | 
 |    * var iterator = function(num, index, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, index]); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupByLimit(array, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] } | 
 |    *   console.log(order); // [[1.1, 0], [3.2, 2], [5.9, 1], [2.1, 4], [3.9, 3]] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var order = []; | 
 |    * var object = { a: 1.1, b: 5.9, c: 3.2, d: 3.9, e: 2.1 } | 
 |    * var iterator = function(num, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push(num); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupByLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] } | 
 |    *   console.log(order); // [1.1, 3.2, 5.9, 2.1, 3.9] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object with key | 
 |    * var order = []; | 
 |    * var object = { a: 1.1, b: 5.9, c: 3.2, d: 3.9, e: 2.1 } | 
 |    * var iterator = function(num, key, done) { | 
 |    *   setTimeout(function() { | 
 |    *     order.push([num, key]); | 
 |    *     done(null, Math.floor(num)); | 
 |    *   }, num * 10); | 
 |    * }; | 
 |    * async.groupByLimit(object, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] } | 
 |    *   console.log(order); // [[1.1, 'a'], [3.2, 'c'], [5.9, 'b'], [2.1, 'e'], [3.9, 'd']] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function groupByLimit(collection, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var size, index, key, value, keys, iter, item, iterate; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |     var result = {}; | 
 |  | 
 |     if (isArray(collection)) { | 
 |       size = collection.length; | 
 |       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator; | 
 |     } else if (!collection) { | 
 |     } else if (iteratorSymbol && collection[iteratorSymbol]) { | 
 |       size = Infinity; | 
 |       iter = collection[iteratorSymbol](); | 
 |       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator; | 
 |     } else if (typeof collection === obj) { | 
 |       keys = nativeKeys(collection); | 
 |       size = keys.length; | 
 |       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, result); | 
 |     } | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       if (started < size) { | 
 |         value = collection[started++]; | 
 |         iterator(value, createCallback(value)); | 
 |       } | 
 |     } | 
 |  | 
 |     function arrayIteratorWithIndex() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         value = collection[index]; | 
 |         iterator(value, index, createCallback(value)); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIterator() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         started++; | 
 |         value = item.value; | 
 |         iterator(value, createCallback(value)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function symbolIteratorWithKey() { | 
 |       item = iter.next(); | 
 |       if (item.done === false) { | 
 |         value = item.value; | 
 |         iterator(value, started++, createCallback(value)); | 
 |       } else if (completed === started && iterator !== noop) { | 
 |         iterator = noop; | 
 |         callback(null, result); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       if (started < size) { | 
 |         value = collection[keys[started++]]; | 
 |         iterator(value, createCallback(value)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIteratorWithKey() { | 
 |       if (started < size) { | 
 |         key = keys[started++]; | 
 |         value = collection[key]; | 
 |         iterator(value, key, createCallback(value)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(value) { | 
 |       var called = false; | 
 |       return function(err, key) { | 
 |         if (called) { | 
 |           throwError(); | 
 |         } | 
 |         called = true; | 
 |         if (err) { | 
 |           iterate = noop; | 
 |           callback = once(callback); | 
 |           callback(err, objectClone(result)); | 
 |           return; | 
 |         } | 
 |         var array = result[key]; | 
 |         if (!array) { | 
 |           result[key] = [value]; | 
 |         } else { | 
 |           array.push(value); | 
 |         } | 
 |         if (++completed === size) { | 
 |           callback(null, result); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @private | 
 |    * @param {Function} arrayEach | 
 |    * @param {Function} baseEach | 
 |    */ | 
 |   function createParallel(arrayEach, baseEach) { | 
 |     return function parallel(tasks, callback) { | 
 |       callback = callback || noop; | 
 |       var size, keys, result; | 
 |       var completed = 0; | 
 |  | 
 |       if (isArray(tasks)) { | 
 |         size = tasks.length; | 
 |         result = Array(size); | 
 |         arrayEach(tasks, createCallback); | 
 |       } else if (tasks && typeof tasks === obj) { | 
 |         keys = nativeKeys(tasks); | 
 |         size = keys.length; | 
 |         result = {}; | 
 |         baseEach(tasks, createCallback, keys); | 
 |       } | 
 |       if (!size) { | 
 |         callback(null, result); | 
 |       } | 
 |  | 
 |       function createCallback(key) { | 
 |         return function(err, res) { | 
 |           if (key === null) { | 
 |             throwError(); | 
 |           } | 
 |           if (err) { | 
 |             key = null; | 
 |             callback = once(callback); | 
 |             callback(err, result); | 
 |             return; | 
 |           } | 
 |           result[key] = arguments.length <= 2 ? res : slice(arguments, 1); | 
 |           key = null; | 
 |           if (++completed === size) { | 
 |             callback(null, result); | 
 |           } | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace series | 
 |    * @param {Array|Object} tasks - functions | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = [ | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(1); | 
 |    *      done(null, 1); | 
 |    *    }, 10); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(2); | 
 |    *      done(null, 2); | 
 |    *    }, 30); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(3); | 
 |    *      done(null, 3); | 
 |    *    }, 40); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(4); | 
 |    *      done(null, 4); | 
 |    *    }, 20); | 
 |    *  } | 
 |    * ]; | 
 |    * async.series(tasks, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4]; | 
 |    *   console.log(order); // [1, 2, 3, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = { | 
 |    *   'a': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(1); | 
 |    *       done(null, 1); | 
 |    *     }, 10); | 
 |    *   }, | 
 |    *   'b': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(2); | 
 |    *       done(null, 2); | 
 |    *     }, 30); | 
 |    *   }, | 
 |    *   'c': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(3); | 
 |    *       done(null, 3); | 
 |    *     }, 40); | 
 |    *   }, | 
 |    *   'd': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(4); | 
 |    *       done(null, 4); | 
 |    *     }, 20); | 
 |    *   } | 
 |    * }; | 
 |    * async.series(tasks, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 2, c: 3, d:4 } | 
 |    *   console.log(order); // [1, 4, 2, 3] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function series(tasks, callback) { | 
 |     callback = callback || noop; | 
 |     var size, key, keys, result, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(tasks)) { | 
 |       size = tasks.length; | 
 |       result = Array(size); | 
 |       iterate = arrayIterator; | 
 |     } else if (tasks && typeof tasks === obj) { | 
 |       keys = nativeKeys(tasks); | 
 |       size = keys.length; | 
 |       result = {}; | 
 |       iterate = objectIterator; | 
 |     } else { | 
 |       return callback(null); | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null, result); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       key = completed; | 
 |       tasks[completed](done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       key = keys[completed]; | 
 |       tasks[key](done); | 
 |     } | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         iterate = throwError; | 
 |         callback = onlyOnce(callback); | 
 |         callback(err, result); | 
 |         return; | 
 |       } | 
 |       result[key] = arguments.length <= 2 ? res : slice(arguments, 1); | 
 |       if (++completed === size) { | 
 |         iterate = throwError; | 
 |         callback(null, result); | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace parallelLimit | 
 |    * @param {Array|Object} tasks - functions | 
 |    * @param {number} limit - limit >= 1 | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = [ | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(1); | 
 |    *      done(null, 1); | 
 |    *    }, 10); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(2); | 
 |    *      done(null, 2); | 
 |    *    }, 50); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(3); | 
 |    *      done(null, 3); | 
 |    *    }, 30); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      order.push(4); | 
 |    *      done(null, 4); | 
 |    *    }, 40); | 
 |    *  } | 
 |    * ]; | 
 |    * async.parallelLimit(tasks, 2, function(err, res) { | 
 |    *   console.log(res); // [1, 2, 3, 4]; | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = { | 
 |    *   'a': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(1); | 
 |    *       done(null, 1); | 
 |    *     }, 10); | 
 |    *   }, | 
 |    *   'b': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(2); | 
 |    *       done(null, 2); | 
 |    *     }, 50); | 
 |    *   }, | 
 |    *   'c': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(3); | 
 |    *       done(null, 3); | 
 |    *     }, 20); | 
 |    *   }, | 
 |    *   'd': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(4); | 
 |    *       done(null, 4); | 
 |    *     }, 40); | 
 |    *   } | 
 |    * }; | 
 |    * async.parallelLimit(tasks, 2, function(err, res) { | 
 |    *   console.log(res); // { a: 1, b: 2, c: 3, d:4 } | 
 |    *   console.log(order); // [1, 3, 2, 4] | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function parallelLimit(tasks, limit, callback) { | 
 |     callback = callback || noop; | 
 |     var size, index, key, keys, result, iterate; | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(tasks)) { | 
 |       size = tasks.length; | 
 |       result = Array(size); | 
 |       iterate = arrayIterator; | 
 |     } else if (tasks && typeof tasks === obj) { | 
 |       keys = nativeKeys(tasks); | 
 |       size = keys.length; | 
 |       result = {}; | 
 |       iterate = objectIterator; | 
 |     } | 
 |     if (!size || isNaN(limit) || limit < 1) { | 
 |       return callback(null, result); | 
 |     } | 
 |     timesSync(limit > size ? size : limit, iterate); | 
 |  | 
 |     function arrayIterator() { | 
 |       index = started++; | 
 |       if (index < size) { | 
 |         tasks[index](createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       if (started < size) { | 
 |         key = keys[started++]; | 
 |         tasks[key](createCallback(key)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(key) { | 
 |       return function(err, res) { | 
 |         if (key === null) { | 
 |           throwError(); | 
 |         } | 
 |         if (err) { | 
 |           key = null; | 
 |           iterate = noop; | 
 |           callback = once(callback); | 
 |           callback(err, result); | 
 |           return; | 
 |         } | 
 |         result[key] = arguments.length <= 2 ? res : slice(arguments, 1); | 
 |         key = null; | 
 |         if (++completed === size) { | 
 |           callback(null, result); | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace tryEach | 
 |    * @param {Array|Object} tasks - functions | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var tasks = [ | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      done(new Error('error')); | 
 |    *    }, 10); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      done(null, 2); | 
 |    *    }, 10); | 
 |    *  } | 
 |    * ]; | 
 |    * async.tryEach(tasks, function(err, res) { | 
 |    *   console.log(res); // 2 | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * var tasks = [ | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      done(new Error('error1')); | 
 |    *    }, 10); | 
 |    *  }, | 
 |    *  function(done) { | 
 |    *    setTimeout(function() { | 
 |    *      done(new Error('error2'); | 
 |    *    }, 10); | 
 |    *  } | 
 |    * ]; | 
 |    * async.tryEach(tasks, function(err, res) { | 
 |    *   console.log(err); // error2 | 
 |    *   console.log(res); // undefined | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function tryEach(tasks, callback) { | 
 |     callback = callback || noop; | 
 |     var size, keys, iterate; | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |  | 
 |     if (isArray(tasks)) { | 
 |       size = tasks.length; | 
 |       iterate = arrayIterator; | 
 |     } else if (tasks && typeof tasks === obj) { | 
 |       keys = nativeKeys(tasks); | 
 |       size = keys.length; | 
 |       iterate = objectIterator; | 
 |     } | 
 |     if (!size) { | 
 |       return callback(null); | 
 |     } | 
 |     iterate(); | 
 |  | 
 |     function arrayIterator() { | 
 |       tasks[completed](done); | 
 |     } | 
 |  | 
 |     function objectIterator() { | 
 |       tasks[keys[completed]](done); | 
 |     } | 
 |  | 
 |     function done(err, res) { | 
 |       if (!err) { | 
 |         if (arguments.length <= 2) { | 
 |           callback(null, res); | 
 |         } else { | 
 |           callback(null, slice(arguments, 1)); | 
 |         } | 
 |       } else if (++completed === size) { | 
 |         callback(err); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * check for waterfall tasks | 
 |    * @private | 
 |    * @param {Array} tasks | 
 |    * @param {Function} callback | 
 |    * @return {boolean} | 
 |    */ | 
 |   function checkWaterfallTasks(tasks, callback) { | 
 |     if (!isArray(tasks)) { | 
 |       callback(new Error('First argument to waterfall must be an array of functions')); | 
 |       return false; | 
 |     } | 
 |     if (tasks.length === 0) { | 
 |       callback(null); | 
 |       return false; | 
 |     } | 
 |     return true; | 
 |   } | 
 |  | 
 |   /** | 
 |    * check for waterfall tasks | 
 |    * @private | 
 |    * @param {function} func | 
 |    * @param {Array|Object} args - arguments | 
 |    * @return {function} next | 
 |    */ | 
 |   function waterfallIterator(func, args, next) { | 
 |     switch (args.length) { | 
 |       case 0: | 
 |       case 1: | 
 |         return func(next); | 
 |       case 2: | 
 |         return func(args[1], next); | 
 |       case 3: | 
 |         return func(args[1], args[2], next); | 
 |       case 4: | 
 |         return func(args[1], args[2], args[3], next); | 
 |       case 5: | 
 |         return func(args[1], args[2], args[3], args[4], next); | 
 |       case 6: | 
 |         return func(args[1], args[2], args[3], args[4], args[5], next); | 
 |       default: | 
 |         args = slice(args, 1); | 
 |         args.push(next); | 
 |         return func.apply(null, args); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace waterfall | 
 |    * @param {Array} tasks - functions | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = [ | 
 |    *   function(next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(1); | 
 |    *       next(null, 1); | 
 |    *     }, 10); | 
 |    *   }, | 
 |    *   function(arg1, next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(2); | 
 |    *       next(null, 1, 2); | 
 |    *     }, 30); | 
 |    *   }, | 
 |    *   function(arg1, arg2, next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(3); | 
 |    *       next(null, 3); | 
 |    *     }, 20); | 
 |    *   }, | 
 |    *   function(arg1, next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(4); | 
 |    *       next(null, 1, 2, 3, 4); | 
 |    *     }, 40); | 
 |    *   } | 
 |    * ]; | 
 |    * async.waterfall(tasks, function(err, arg1, arg2, arg3, arg4) { | 
 |    *   console.log(arg1, arg2, arg3, arg4); // 1 2 3 4 | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function waterfall(tasks, callback) { | 
 |     callback = callback || noop; | 
 |     if (!checkWaterfallTasks(tasks, callback)) { | 
 |       return; | 
 |     } | 
 |     var func, args, done, sync; | 
 |     var completed = 0; | 
 |     var size = tasks.length; | 
 |     waterfallIterator(tasks[0], [], createCallback(0)); | 
 |  | 
 |     function iterate() { | 
 |       waterfallIterator(func, args, createCallback(func)); | 
 |     } | 
 |  | 
 |     function createCallback(index) { | 
 |       return function next(err, res) { | 
 |         if (index === undefined) { | 
 |           callback = noop; | 
 |           throwError(); | 
 |         } | 
 |         index = undefined; | 
 |         if (err) { | 
 |           done = callback; | 
 |           callback = throwError; | 
 |           done(err); | 
 |           return; | 
 |         } | 
 |         if (++completed === size) { | 
 |           done = callback; | 
 |           callback = throwError; | 
 |           if (arguments.length <= 2) { | 
 |             done(err, res); | 
 |           } else { | 
 |             done.apply(null, createArray(arguments)); | 
 |           } | 
 |           return; | 
 |         } | 
 |         if (sync) { | 
 |           args = arguments; | 
 |           func = tasks[completed] || throwError; | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           waterfallIterator(tasks[completed] || throwError, arguments, createCallback(completed)); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * `angelFall` is like `waterfall` and inject callback to last argument of next task. | 
 |    * | 
 |    * @memberof async | 
 |    * @namespace angelFall | 
 |    * @param {Array} tasks - functions | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var order = []; | 
 |    * var tasks = [ | 
 |    *   function(next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(1); | 
 |    *       next(null, 1); | 
 |    *     }, 10); | 
 |    *   }, | 
 |    *   function(arg1, empty, next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(2); | 
 |    *       next(null, 1, 2); | 
 |    *     }, 30); | 
 |    *   }, | 
 |    *   function(next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(3); | 
 |    *       next(null, 3); | 
 |    *     }, 20); | 
 |    *   }, | 
 |    *   function(arg1, empty1, empty2, empty3, next) { | 
 |    *     setTimeout(function() { | 
 |    *       order.push(4); | 
 |    *       next(null, 1, 2, 3, 4); | 
 |    *     }, 40); | 
 |    *   } | 
 |    * ]; | 
 |    * async.angelFall(tasks, function(err, arg1, arg2, arg3, arg4) { | 
 |    *   console.log(arg1, arg2, arg3, arg4); // 1 2 3 4 | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function angelFall(tasks, callback) { | 
 |     callback = callback || noop; | 
 |     if (!checkWaterfallTasks(tasks, callback)) { | 
 |       return; | 
 |     } | 
 |     var completed = 0; | 
 |     var sync = false; | 
 |     var size = tasks.length; | 
 |     var func = tasks[completed]; | 
 |     var args = []; | 
 |     var iterate = function() { | 
 |       switch (func.length) { | 
 |         case 0: | 
 |           try { | 
 |             next(null, func()); | 
 |           } catch (e) { | 
 |             next(e); | 
 |           } | 
 |           return; | 
 |         case 1: | 
 |           return func(next); | 
 |         case 2: | 
 |           return func(args[1], next); | 
 |         case 3: | 
 |           return func(args[1], args[2], next); | 
 |         case 4: | 
 |           return func(args[1], args[2], args[3], next); | 
 |         case 5: | 
 |           return func(args[1], args[2], args[3], args[4], next); | 
 |         default: | 
 |           args = slice(args, 1); | 
 |           args[func.length - 1] = next; | 
 |           return func.apply(null, args); | 
 |       } | 
 |     }; | 
 |     iterate(); | 
 |  | 
 |     function next(err, res) { | 
 |       if (err) { | 
 |         iterate = throwError; | 
 |         callback = onlyOnce(callback); | 
 |         callback(err); | 
 |         return; | 
 |       } | 
 |       if (++completed === size) { | 
 |         iterate = throwError; | 
 |         var done = callback; | 
 |         callback = throwError; | 
 |         if (arguments.length === 2) { | 
 |           done(err, res); | 
 |         } else { | 
 |           done.apply(null, createArray(arguments)); | 
 |         } | 
 |         return; | 
 |       } | 
 |       func = tasks[completed]; | 
 |       args = arguments; | 
 |       if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace whilst | 
 |    * @param {Function} test | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    */ | 
 |   function whilst(test, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var sync = false; | 
 |     if (test()) { | 
 |       iterate(); | 
 |     } else { | 
 |       callback(null); | 
 |     } | 
 |  | 
 |     function iterate() { | 
 |       if (sync) { | 
 |         nextTick(next); | 
 |       } else { | 
 |         sync = true; | 
 |         iterator(done); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |  | 
 |     function next() { | 
 |       iterator(done); | 
 |     } | 
 |  | 
 |     function done(err, arg) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       if (arguments.length <= 2) { | 
 |         if (test(arg)) { | 
 |           iterate(); | 
 |         } else { | 
 |           callback(null, arg); | 
 |         } | 
 |         return; | 
 |       } | 
 |       arg = slice(arguments, 1); | 
 |       if (test.apply(null, arg)) { | 
 |         iterate(); | 
 |       } else { | 
 |         callback.apply(null, [null].concat(arg)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace doWhilst | 
 |    * @param {Function} iterator | 
 |    * @param {Function} test | 
 |    * @param {Function} callback | 
 |    */ | 
 |   function doWhilst(iterator, test, callback) { | 
 |     callback = callback || noop; | 
 |     var sync = false; | 
 |     next(); | 
 |  | 
 |     function iterate() { | 
 |       if (sync) { | 
 |         nextTick(next); | 
 |       } else { | 
 |         sync = true; | 
 |         iterator(done); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |  | 
 |     function next() { | 
 |       iterator(done); | 
 |     } | 
 |  | 
 |     function done(err, arg) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       if (arguments.length <= 2) { | 
 |         if (test(arg)) { | 
 |           iterate(); | 
 |         } else { | 
 |           callback(null, arg); | 
 |         } | 
 |         return; | 
 |       } | 
 |       arg = slice(arguments, 1); | 
 |       if (test.apply(null, arg)) { | 
 |         iterate(); | 
 |       } else { | 
 |         callback.apply(null, [null].concat(arg)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace until | 
 |    * @param {Function} test | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    */ | 
 |   function until(test, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     var sync = false; | 
 |     if (!test()) { | 
 |       iterate(); | 
 |     } else { | 
 |       callback(null); | 
 |     } | 
 |  | 
 |     function iterate() { | 
 |       if (sync) { | 
 |         nextTick(next); | 
 |       } else { | 
 |         sync = true; | 
 |         iterator(done); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |  | 
 |     function next() { | 
 |       iterator(done); | 
 |     } | 
 |  | 
 |     function done(err, arg) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       if (arguments.length <= 2) { | 
 |         if (!test(arg)) { | 
 |           iterate(); | 
 |         } else { | 
 |           callback(null, arg); | 
 |         } | 
 |         return; | 
 |       } | 
 |       arg = slice(arguments, 1); | 
 |       if (!test.apply(null, arg)) { | 
 |         iterate(); | 
 |       } else { | 
 |         callback.apply(null, [null].concat(arg)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace doUntil | 
 |    * @param {Function} iterator | 
 |    * @param {Function} test | 
 |    * @param {Function} callback | 
 |    */ | 
 |   function doUntil(iterator, test, callback) { | 
 |     callback = callback || noop; | 
 |     var sync = false; | 
 |     next(); | 
 |  | 
 |     function iterate() { | 
 |       if (sync) { | 
 |         nextTick(next); | 
 |       } else { | 
 |         sync = true; | 
 |         iterator(done); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |  | 
 |     function next() { | 
 |       iterator(done); | 
 |     } | 
 |  | 
 |     function done(err, arg) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       if (arguments.length <= 2) { | 
 |         if (!test(arg)) { | 
 |           iterate(); | 
 |         } else { | 
 |           callback(null, arg); | 
 |         } | 
 |         return; | 
 |       } | 
 |       arg = slice(arguments, 1); | 
 |       if (!test.apply(null, arg)) { | 
 |         iterate(); | 
 |       } else { | 
 |         callback.apply(null, [null].concat(arg)); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace during | 
 |    * @param {Function} test | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    */ | 
 |   function during(test, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     _test(); | 
 |  | 
 |     function _test() { | 
 |       test(iterate); | 
 |     } | 
 |  | 
 |     function iterate(err, truth) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       if (truth) { | 
 |         iterator(done); | 
 |       } else { | 
 |         callback(null); | 
 |       } | 
 |     } | 
 |  | 
 |     function done(err) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       _test(); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace doDuring | 
 |    * @param {Function} test | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    */ | 
 |   function doDuring(iterator, test, callback) { | 
 |     callback = callback || noop; | 
 |     iterate(null, true); | 
 |  | 
 |     function iterate(err, truth) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       if (truth) { | 
 |         iterator(done); | 
 |       } else { | 
 |         callback(null); | 
 |       } | 
 |     } | 
 |  | 
 |     function done(err, res) { | 
 |       if (err) { | 
 |         return callback(err); | 
 |       } | 
 |       switch (arguments.length) { | 
 |         case 0: | 
 |         case 1: | 
 |           test(iterate); | 
 |           break; | 
 |         case 2: | 
 |           test(res, iterate); | 
 |           break; | 
 |         default: | 
 |           var args = slice(arguments, 1); | 
 |           args.push(iterate); | 
 |           test.apply(null, args); | 
 |           break; | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace forever | 
 |    */ | 
 |   function forever(iterator, callback) { | 
 |     var sync = false; | 
 |     iterate(); | 
 |  | 
 |     function iterate() { | 
 |       iterator(next); | 
 |     } | 
 |  | 
 |     function next(err) { | 
 |       if (err) { | 
 |         if (callback) { | 
 |           return callback(err); | 
 |         } | 
 |         throw err; | 
 |       } | 
 |       if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace compose | 
 |    */ | 
 |   function compose() { | 
 |     return seq.apply(null, reverse(arguments)); | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace seq | 
 |    */ | 
 |   function seq(/* functions... */) { | 
 |     var fns = createArray(arguments); | 
 |  | 
 |     return function() { | 
 |       var self = this; | 
 |       var args = createArray(arguments); | 
 |       var callback = args[args.length - 1]; | 
 |       if (typeof callback === func) { | 
 |         args.pop(); | 
 |       } else { | 
 |         callback = noop; | 
 |       } | 
 |       reduce(fns, args, iterator, done); | 
 |  | 
 |       function iterator(newargs, fn, callback) { | 
 |         var func = function(err) { | 
 |           var nextargs = slice(arguments, 1); | 
 |           callback(err, nextargs); | 
 |         }; | 
 |         newargs.push(func); | 
 |         fn.apply(self, newargs); | 
 |       } | 
 |  | 
 |       function done(err, res) { | 
 |         res = isArray(res) ? res : [res]; | 
 |         res.unshift(err); | 
 |         callback.apply(self, res); | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   function createApplyEach(func) { | 
 |     return function applyEach(fns /* arguments */) { | 
 |       var go = function() { | 
 |         var self = this; | 
 |         var args = createArray(arguments); | 
 |         var callback = args.pop() || noop; | 
 |         return func(fns, iterator, callback); | 
 |  | 
 |         function iterator(fn, done) { | 
 |           fn.apply(self, args.concat([done])); | 
 |         } | 
 |       }; | 
 |       if (arguments.length > 1) { | 
 |         var args = slice(arguments, 1); | 
 |         return go.apply(this, args); | 
 |       } else { | 
 |         return go; | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @see https://github.com/caolan/async/blob/master/lib/internal/DoublyLinkedList.js | 
 |    */ | 
 |   function DLL() { | 
 |     this.head = null; | 
 |     this.tail = null; | 
 |     this.length = 0; | 
 |   } | 
 |  | 
 |   DLL.prototype._removeLink = function(node) { | 
 |     var prev = node.prev; | 
 |     var next = node.next; | 
 |     if (prev) { | 
 |       prev.next = next; | 
 |     } else { | 
 |       this.head = next; | 
 |     } | 
 |     if (next) { | 
 |       next.prev = prev; | 
 |     } else { | 
 |       this.tail = prev; | 
 |     } | 
 |     node.prev = null; | 
 |     node.next = null; | 
 |     this.length--; | 
 |     return node; | 
 |   }; | 
 |  | 
 |   DLL.prototype.empty = DLL; | 
 |  | 
 |   DLL.prototype._setInitial = function(node) { | 
 |     this.length = 1; | 
 |     this.head = this.tail = node; | 
 |   }; | 
 |  | 
 |   DLL.prototype.insertBefore = function(node, newNode) { | 
 |     newNode.prev = node.prev; | 
 |     newNode.next = node; | 
 |     if (node.prev) { | 
 |       node.prev.next = newNode; | 
 |     } else { | 
 |       this.head = newNode; | 
 |     } | 
 |     node.prev = newNode; | 
 |     this.length++; | 
 |   }; | 
 |  | 
 |   DLL.prototype.unshift = function(node) { | 
 |     if (this.head) { | 
 |       this.insertBefore(this.head, node); | 
 |     } else { | 
 |       this._setInitial(node); | 
 |     } | 
 |   }; | 
 |  | 
 |   DLL.prototype.push = function(node) { | 
 |     var tail = this.tail; | 
 |     if (tail) { | 
 |       node.prev = tail; | 
 |       node.next = tail.next; | 
 |       this.tail = node; | 
 |       tail.next = node; | 
 |       this.length++; | 
 |     } else { | 
 |       this._setInitial(node); | 
 |     } | 
 |   }; | 
 |  | 
 |   DLL.prototype.shift = function() { | 
 |     return this.head && this._removeLink(this.head); | 
 |   }; | 
 |  | 
 |   DLL.prototype.splice = function(end) { | 
 |     var task; | 
 |     var tasks = []; | 
 |     while (end-- && (task = this.shift())) { | 
 |       tasks.push(task); | 
 |     } | 
 |     return tasks; | 
 |   }; | 
 |  | 
 |   DLL.prototype.remove = function(test) { | 
 |     var node = this.head; | 
 |     while (node) { | 
 |       if (test(node)) { | 
 |         this._removeLink(node); | 
 |       } | 
 |       node = node.next; | 
 |     } | 
 |     return this; | 
 |   }; | 
 |  | 
 |   /** | 
 |    * @private | 
 |    */ | 
 |   function baseQueue(isQueue, worker, concurrency, payload) { | 
 |     if (concurrency === undefined) { | 
 |       concurrency = 1; | 
 |     } else if (isNaN(concurrency) || concurrency < 1) { | 
 |       throw new Error('Concurrency must not be zero'); | 
 |     } | 
 |  | 
 |     var workers = 0; | 
 |     var workersList = []; | 
 |     var _callback, _unshift; | 
 |  | 
 |     var q = { | 
 |       _tasks: new DLL(), | 
 |       concurrency: concurrency, | 
 |       payload: payload, | 
 |       saturated: noop, | 
 |       unsaturated: noop, | 
 |       buffer: concurrency / 4, | 
 |       empty: noop, | 
 |       drain: noop, | 
 |       error: noop, | 
 |       started: false, | 
 |       paused: false, | 
 |       push: push, | 
 |       kill: kill, | 
 |       unshift: unshift, | 
 |       remove: remove, | 
 |       process: isQueue ? runQueue : runCargo, | 
 |       length: getLength, | 
 |       running: running, | 
 |       workersList: getWorkersList, | 
 |       idle: idle, | 
 |       pause: pause, | 
 |       resume: resume, | 
 |       _worker: worker | 
 |     }; | 
 |     return q; | 
 |  | 
 |     function push(tasks, callback) { | 
 |       _insert(tasks, callback); | 
 |     } | 
 |  | 
 |     function unshift(tasks, callback) { | 
 |       _insert(tasks, callback, true); | 
 |     } | 
 |  | 
 |     function _exec(task) { | 
 |       var item = { | 
 |         data: task, | 
 |         callback: _callback | 
 |       }; | 
 |       if (_unshift) { | 
 |         q._tasks.unshift(item); | 
 |       } else { | 
 |         q._tasks.push(item); | 
 |       } | 
 |       nextTick(q.process); | 
 |     } | 
 |  | 
 |     function _insert(tasks, callback, unshift) { | 
 |       if (callback == null) { | 
 |         callback = noop; | 
 |       } else if (typeof callback !== 'function') { | 
 |         throw new Error('task callback must be a function'); | 
 |       } | 
 |       q.started = true; | 
 |       var _tasks = isArray(tasks) ? tasks : [tasks]; | 
 |  | 
 |       if (tasks === undefined || !_tasks.length) { | 
 |         if (q.idle()) { | 
 |           nextTick(q.drain); | 
 |         } | 
 |         return; | 
 |       } | 
 |  | 
 |       _unshift = unshift; | 
 |       _callback = callback; | 
 |       arrayEachSync(_tasks, _exec); | 
 |     } | 
 |  | 
 |     function kill() { | 
 |       q.drain = noop; | 
 |       q._tasks.empty(); | 
 |     } | 
 |  | 
 |     function _next(q, tasks) { | 
 |       var called = false; | 
 |       return function done(err, res) { | 
 |         if (called) { | 
 |           throwError(); | 
 |         } | 
 |         called = true; | 
 |  | 
 |         workers--; | 
 |         var task; | 
 |         var index = -1; | 
 |         var size = workersList.length; | 
 |         var taskIndex = -1; | 
 |         var taskSize = tasks.length; | 
 |         var useApply = arguments.length > 2; | 
 |         var args = useApply && createArray(arguments); | 
 |         while (++taskIndex < taskSize) { | 
 |           task = tasks[taskIndex]; | 
 |           while (++index < size) { | 
 |             if (workersList[index] === task) { | 
 |               if (index === 0) { | 
 |                 workersList.shift(); | 
 |               } else { | 
 |                 workersList.splice(index, 1); | 
 |               } | 
 |               index = size; | 
 |               size--; | 
 |             } | 
 |           } | 
 |           index = -1; | 
 |           if (useApply) { | 
 |             task.callback.apply(task, args); | 
 |           } else { | 
 |             task.callback(err, res); | 
 |           } | 
 |           if (err) { | 
 |             q.error(err, task.data); | 
 |           } | 
 |         } | 
 |  | 
 |         if (workers <= q.concurrency - q.buffer) { | 
 |           q.unsaturated(); | 
 |         } | 
 |  | 
 |         if (q._tasks.length + workers === 0) { | 
 |           q.drain(); | 
 |         } | 
 |         q.process(); | 
 |       }; | 
 |     } | 
 |  | 
 |     function runQueue() { | 
 |       while (!q.paused && workers < q.concurrency && q._tasks.length) { | 
 |         var task = q._tasks.shift(); | 
 |         workers++; | 
 |         workersList.push(task); | 
 |         if (q._tasks.length === 0) { | 
 |           q.empty(); | 
 |         } | 
 |         if (workers === q.concurrency) { | 
 |           q.saturated(); | 
 |         } | 
 |         var done = _next(q, [task]); | 
 |         worker(task.data, done); | 
 |       } | 
 |     } | 
 |  | 
 |     function runCargo() { | 
 |       while (!q.paused && workers < q.concurrency && q._tasks.length) { | 
 |         var tasks = q._tasks.splice(q.payload || q._tasks.length); | 
 |         var index = -1; | 
 |         var size = tasks.length; | 
 |         var data = Array(size); | 
 |         while (++index < size) { | 
 |           data[index] = tasks[index].data; | 
 |         } | 
 |         workers++; | 
 |         nativePush.apply(workersList, tasks); | 
 |         if (q._tasks.length === 0) { | 
 |           q.empty(); | 
 |         } | 
 |         if (workers === q.concurrency) { | 
 |           q.saturated(); | 
 |         } | 
 |         var done = _next(q, tasks); | 
 |         worker(data, done); | 
 |       } | 
 |     } | 
 |  | 
 |     function getLength() { | 
 |       return q._tasks.length; | 
 |     } | 
 |  | 
 |     function running() { | 
 |       return workers; | 
 |     } | 
 |  | 
 |     function getWorkersList() { | 
 |       return workersList; | 
 |     } | 
 |  | 
 |     function idle() { | 
 |       return q.length() + workers === 0; | 
 |     } | 
 |  | 
 |     function pause() { | 
 |       q.paused = true; | 
 |     } | 
 |  | 
 |     function _resume() { | 
 |       nextTick(q.process); | 
 |     } | 
 |  | 
 |     function resume() { | 
 |       if (q.paused === false) { | 
 |         return; | 
 |       } | 
 |       q.paused = false; | 
 |       var count = q.concurrency < q._tasks.length ? q.concurrency : q._tasks.length; | 
 |       timesSync(count, _resume); | 
 |     } | 
 |  | 
 |     /** | 
 |      * @param {Function} test | 
 |      */ | 
 |     function remove(test) { | 
 |       q._tasks.remove(test); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace queue | 
 |    */ | 
 |   function queue(worker, concurrency) { | 
 |     return baseQueue(true, worker, concurrency); | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace priorityQueue | 
 |    */ | 
 |   function priorityQueue(worker, concurrency) { | 
 |     var q = baseQueue(true, worker, concurrency); | 
 |     q.push = push; | 
 |     delete q.unshift; | 
 |     return q; | 
 |  | 
 |     function push(tasks, priority, callback) { | 
 |       q.started = true; | 
 |       priority = priority || 0; | 
 |       var _tasks = isArray(tasks) ? tasks : [tasks]; | 
 |       var taskSize = _tasks.length; | 
 |  | 
 |       if (tasks === undefined || taskSize === 0) { | 
 |         if (q.idle()) { | 
 |           nextTick(q.drain); | 
 |         } | 
 |         return; | 
 |       } | 
 |  | 
 |       callback = typeof callback === func ? callback : noop; | 
 |       var nextNode = q._tasks.head; | 
 |       while (nextNode && priority >= nextNode.priority) { | 
 |         nextNode = nextNode.next; | 
 |       } | 
 |       while (taskSize--) { | 
 |         var item = { | 
 |           data: _tasks[taskSize], | 
 |           priority: priority, | 
 |           callback: callback | 
 |         }; | 
 |         if (nextNode) { | 
 |           q._tasks.insertBefore(nextNode, item); | 
 |         } else { | 
 |           q._tasks.push(item); | 
 |         } | 
 |         nextTick(q.process); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace cargo | 
 |    */ | 
 |   function cargo(worker, payload) { | 
 |     return baseQueue(false, worker, 1, payload); | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace auto | 
 |    * @param {Object} tasks | 
 |    * @param {number} [concurrency] | 
 |    * @param {Function} [callback] | 
 |    */ | 
 |   function auto(tasks, concurrency, callback) { | 
 |     if (typeof concurrency === func) { | 
 |       callback = concurrency; | 
 |       concurrency = null; | 
 |     } | 
 |     var keys = nativeKeys(tasks); | 
 |     var rest = keys.length; | 
 |     var results = {}; | 
 |     if (rest === 0) { | 
 |       return callback(null, results); | 
 |     } | 
 |     var runningTasks = 0; | 
 |     var readyTasks = []; | 
 |     var listeners = Object.create(null); | 
 |     callback = onlyOnce(callback || noop); | 
 |     concurrency = concurrency || rest; | 
 |  | 
 |     baseEachSync(tasks, iterator, keys); | 
 |     proceedQueue(); | 
 |  | 
 |     function iterator(task, key) { | 
 |       // no dependencies | 
 |       var _task, _taskSize; | 
 |       if (!isArray(task)) { | 
 |         _task = task; | 
 |         _taskSize = 0; | 
 |         readyTasks.push([_task, _taskSize, done]); | 
 |         return; | 
 |       } | 
 |       var dependencySize = task.length - 1; | 
 |       _task = task[dependencySize]; | 
 |       _taskSize = dependencySize; | 
 |       if (dependencySize === 0) { | 
 |         readyTasks.push([_task, _taskSize, done]); | 
 |         return; | 
 |       } | 
 |       // dependencies | 
 |       var index = -1; | 
 |       while (++index < dependencySize) { | 
 |         var dependencyName = task[index]; | 
 |         if (notInclude(keys, dependencyName)) { | 
 |           var msg = | 
 |             'async.auto task `' + | 
 |             key + | 
 |             '` has non-existent dependency `' + | 
 |             dependencyName + | 
 |             '` in ' + | 
 |             task.join(', '); | 
 |           throw new Error(msg); | 
 |         } | 
 |         var taskListeners = listeners[dependencyName]; | 
 |         if (!taskListeners) { | 
 |           taskListeners = listeners[dependencyName] = []; | 
 |         } | 
 |         taskListeners.push(taskListener); | 
 |       } | 
 |  | 
 |       function done(err, arg) { | 
 |         if (key === null) { | 
 |           throwError(); | 
 |         } | 
 |         arg = arguments.length <= 2 ? arg : slice(arguments, 1); | 
 |         if (err) { | 
 |           rest = 0; | 
 |           runningTasks = 0; | 
 |           readyTasks.length = 0; | 
 |           var safeResults = objectClone(results); | 
 |           safeResults[key] = arg; | 
 |           key = null; | 
 |           var _callback = callback; | 
 |           callback = noop; | 
 |           _callback(err, safeResults); | 
 |           return; | 
 |         } | 
 |         runningTasks--; | 
 |         rest--; | 
 |         results[key] = arg; | 
 |         taskComplete(key); | 
 |         key = null; | 
 |       } | 
 |  | 
 |       function taskListener() { | 
 |         if (--dependencySize === 0) { | 
 |           readyTasks.push([_task, _taskSize, done]); | 
 |         } | 
 |       } | 
 |     } | 
 |  | 
 |     function proceedQueue() { | 
 |       if (readyTasks.length === 0 && runningTasks === 0) { | 
 |         if (rest !== 0) { | 
 |           throw new Error('async.auto task has cyclic dependencies'); | 
 |         } | 
 |         return callback(null, results); | 
 |       } | 
 |       while (readyTasks.length && runningTasks < concurrency && callback !== noop) { | 
 |         runningTasks++; | 
 |         var array = readyTasks.shift(); | 
 |         if (array[1] === 0) { | 
 |           array[0](array[2]); | 
 |         } else { | 
 |           array[0](results, array[2]); | 
 |         } | 
 |       } | 
 |     } | 
 |  | 
 |     function taskComplete(key) { | 
 |       var taskListeners = listeners[key] || []; | 
 |       arrayEachSync(taskListeners, function(task) { | 
 |         task(); | 
 |       }); | 
 |       proceedQueue(); | 
 |     } | 
 |   } | 
 |  | 
 |   var FN_ARGS = /^(function)?\s*[^\(]*\(\s*([^\)]*)\)/m; | 
 |   var FN_ARG_SPLIT = /,/; | 
 |   var FN_ARG = /(=.+)?(\s*)$/; | 
 |   var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm; | 
 |  | 
 |   /** | 
 |    * parse function arguments for `autoInject` | 
 |    * | 
 |    * @private | 
 |    */ | 
 |   function parseParams(func) { | 
 |     func = func.toString().replace(STRIP_COMMENTS, ''); | 
 |     func = func.match(FN_ARGS)[2].replace(' ', ''); | 
 |     func = func ? func.split(FN_ARG_SPLIT) : []; | 
 |     func = func.map(function(arg) { | 
 |       return arg.replace(FN_ARG, '').trim(); | 
 |     }); | 
 |     return func; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace autoInject | 
 |    * @param {Object} tasks | 
 |    * @param {number} [concurrency] | 
 |    * @param {Function} [callback] | 
 |    */ | 
 |   function autoInject(tasks, concurrency, callback) { | 
 |     var newTasks = {}; | 
 |     baseEachSync(tasks, iterator, nativeKeys(tasks)); | 
 |     auto(newTasks, concurrency, callback); | 
 |  | 
 |     function iterator(task, key) { | 
 |       var params; | 
 |       var taskLength = task.length; | 
 |  | 
 |       if (isArray(task)) { | 
 |         if (taskLength === 0) { | 
 |           throw new Error('autoInject task functions require explicit parameters.'); | 
 |         } | 
 |         params = createArray(task); | 
 |         taskLength = params.length - 1; | 
 |         task = params[taskLength]; | 
 |         if (taskLength === 0) { | 
 |           newTasks[key] = task; | 
 |           return; | 
 |         } | 
 |       } else if (taskLength === 1) { | 
 |         newTasks[key] = task; | 
 |         return; | 
 |       } else { | 
 |         params = parseParams(task); | 
 |         if (taskLength === 0 && params.length === 0) { | 
 |           throw new Error('autoInject task functions require explicit parameters.'); | 
 |         } | 
 |         taskLength = params.length - 1; | 
 |       } | 
 |       params[taskLength] = newTask; | 
 |       newTasks[key] = params; | 
 |  | 
 |       function newTask(results, done) { | 
 |         switch (taskLength) { | 
 |           case 1: | 
 |             task(results[params[0]], done); | 
 |             break; | 
 |           case 2: | 
 |             task(results[params[0]], results[params[1]], done); | 
 |             break; | 
 |           case 3: | 
 |             task(results[params[0]], results[params[1]], results[params[2]], done); | 
 |             break; | 
 |           default: | 
 |             var i = -1; | 
 |             while (++i < taskLength) { | 
 |               params[i] = results[params[i]]; | 
 |             } | 
 |             params[i] = done; | 
 |             task.apply(null, params); | 
 |             break; | 
 |         } | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace retry | 
 |    * @param {integer|Object|Function} opts | 
 |    * @param {Function} [task] | 
 |    * @param {Function} [callback] | 
 |    */ | 
 |   function retry(opts, task, callback) { | 
 |     var times, intervalFunc, errorFilter; | 
 |     var count = 0; | 
 |     if (arguments.length < 3 && typeof opts === func) { | 
 |       callback = task || noop; | 
 |       task = opts; | 
 |       opts = null; | 
 |       times = DEFAULT_TIMES; | 
 |     } else { | 
 |       callback = callback || noop; | 
 |       switch (typeof opts) { | 
 |         case 'object': | 
 |           if (typeof opts.errorFilter === func) { | 
 |             errorFilter = opts.errorFilter; | 
 |           } | 
 |           var interval = opts.interval; | 
 |           switch (typeof interval) { | 
 |             case func: | 
 |               intervalFunc = interval; | 
 |               break; | 
 |             case 'string': | 
 |             case 'number': | 
 |               interval = +interval; | 
 |               intervalFunc = interval | 
 |                 ? function() { | 
 |                     return interval; | 
 |                   } | 
 |                 : function() { | 
 |                     return DEFAULT_INTERVAL; | 
 |                   }; | 
 |               break; | 
 |           } | 
 |           times = +opts.times || DEFAULT_TIMES; | 
 |           break; | 
 |         case 'number': | 
 |           times = opts || DEFAULT_TIMES; | 
 |           break; | 
 |         case 'string': | 
 |           times = +opts || DEFAULT_TIMES; | 
 |           break; | 
 |         default: | 
 |           throw new Error('Invalid arguments for async.retry'); | 
 |       } | 
 |     } | 
 |     if (typeof task !== 'function') { | 
 |       throw new Error('Invalid arguments for async.retry'); | 
 |     } | 
 |  | 
 |     if (intervalFunc) { | 
 |       task(intervalCallback); | 
 |     } else { | 
 |       task(simpleCallback); | 
 |     } | 
 |  | 
 |     function simpleIterator() { | 
 |       task(simpleCallback); | 
 |     } | 
 |  | 
 |     function simpleCallback(err, res) { | 
 |       if (++count === times || !err || (errorFilter && !errorFilter(err))) { | 
 |         if (arguments.length <= 2) { | 
 |           return callback(err, res); | 
 |         } | 
 |         var args = createArray(arguments); | 
 |         return callback.apply(null, args); | 
 |       } | 
 |       simpleIterator(); | 
 |     } | 
 |  | 
 |     function intervalIterator() { | 
 |       task(intervalCallback); | 
 |     } | 
 |  | 
 |     function intervalCallback(err, res) { | 
 |       if (++count === times || !err || (errorFilter && !errorFilter(err))) { | 
 |         if (arguments.length <= 2) { | 
 |           return callback(err, res); | 
 |         } | 
 |         var args = createArray(arguments); | 
 |         return callback.apply(null, args); | 
 |       } | 
 |       setTimeout(intervalIterator, intervalFunc(count)); | 
 |     } | 
 |   } | 
 |  | 
 |   function retryable(opts, task) { | 
 |     if (!task) { | 
 |       task = opts; | 
 |       opts = null; | 
 |     } | 
 |     return done; | 
 |  | 
 |     function done() { | 
 |       var taskFn; | 
 |       var args = createArray(arguments); | 
 |       var lastIndex = args.length - 1; | 
 |       var callback = args[lastIndex]; | 
 |       switch (task.length) { | 
 |         case 1: | 
 |           taskFn = task1; | 
 |           break; | 
 |         case 2: | 
 |           taskFn = task2; | 
 |           break; | 
 |         case 3: | 
 |           taskFn = task3; | 
 |           break; | 
 |         default: | 
 |           taskFn = task4; | 
 |       } | 
 |       if (opts) { | 
 |         retry(opts, taskFn, callback); | 
 |       } else { | 
 |         retry(taskFn, callback); | 
 |       } | 
 |  | 
 |       function task1(done) { | 
 |         task(done); | 
 |       } | 
 |  | 
 |       function task2(done) { | 
 |         task(args[0], done); | 
 |       } | 
 |  | 
 |       function task3(done) { | 
 |         task(args[0], args[1], done); | 
 |       } | 
 |  | 
 |       function task4(callback) { | 
 |         args[lastIndex] = callback; | 
 |         task.apply(null, args); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace iterator | 
 |    */ | 
 |   function iterator(tasks) { | 
 |     var size = 0; | 
 |     var keys = []; | 
 |     if (isArray(tasks)) { | 
 |       size = tasks.length; | 
 |     } else { | 
 |       keys = nativeKeys(tasks); | 
 |       size = keys.length; | 
 |     } | 
 |     return makeCallback(0); | 
 |  | 
 |     function makeCallback(index) { | 
 |       var fn = function() { | 
 |         if (size) { | 
 |           var key = keys[index] || index; | 
 |           tasks[key].apply(null, createArray(arguments)); | 
 |         } | 
 |         return fn.next(); | 
 |       }; | 
 |       fn.next = function() { | 
 |         return index < size - 1 ? makeCallback(index + 1) : null; | 
 |       }; | 
 |       return fn; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace apply | 
 |    */ | 
 |   function apply(func) { | 
 |     switch (arguments.length) { | 
 |       case 0: | 
 |       case 1: | 
 |         return func; | 
 |       case 2: | 
 |         return func.bind(null, arguments[1]); | 
 |       case 3: | 
 |         return func.bind(null, arguments[1], arguments[2]); | 
 |       case 4: | 
 |         return func.bind(null, arguments[1], arguments[2], arguments[3]); | 
 |       case 5: | 
 |         return func.bind(null, arguments[1], arguments[2], arguments[3], arguments[4]); | 
 |       default: | 
 |         var size = arguments.length; | 
 |         var index = 0; | 
 |         var args = Array(size); | 
 |         args[index] = null; | 
 |         while (++index < size) { | 
 |           args[index] = arguments[index]; | 
 |         } | 
 |         return func.bind.apply(func, args); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace timeout | 
 |    * @param {Function} func | 
 |    * @param {number} millisec | 
 |    * @param {*} info | 
 |    */ | 
 |   function timeout(func, millisec, info) { | 
 |     var callback, timer; | 
 |     return wrappedFunc; | 
 |  | 
 |     function wrappedFunc() { | 
 |       timer = setTimeout(timeoutCallback, millisec); | 
 |       var args = createArray(arguments); | 
 |       var lastIndex = args.length - 1; | 
 |       callback = args[lastIndex]; | 
 |       args[lastIndex] = injectedCallback; | 
 |       simpleApply(func, args); | 
 |     } | 
 |  | 
 |     function timeoutCallback() { | 
 |       var name = func.name || 'anonymous'; | 
 |       var err = new Error('Callback function "' + name + '" timed out.'); | 
 |       err.code = 'ETIMEDOUT'; | 
 |       if (info) { | 
 |         err.info = info; | 
 |       } | 
 |       timer = null; | 
 |       callback(err); | 
 |     } | 
 |  | 
 |     function injectedCallback() { | 
 |       if (timer !== null) { | 
 |         simpleApply(callback, createArray(arguments)); | 
 |         clearTimeout(timer); | 
 |       } | 
 |     } | 
 |  | 
 |     function simpleApply(func, args) { | 
 |       switch (args.length) { | 
 |         case 0: | 
 |           func(); | 
 |           break; | 
 |         case 1: | 
 |           func(args[0]); | 
 |           break; | 
 |         case 2: | 
 |           func(args[0], args[1]); | 
 |           break; | 
 |         default: | 
 |           func.apply(null, args); | 
 |           break; | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace times | 
 |    * @param {number} n - n >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var iterator = function(n, done) { | 
 |    *   done(null, n); | 
 |    * }; | 
 |    * async.times(4, iterator, function(err, res) { | 
 |    *   console.log(res); // [0, 1, 2, 3]; | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function times(n, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     n = +n; | 
 |     if (isNaN(n) || n < 1) { | 
 |       return callback(null, []); | 
 |     } | 
 |     var result = Array(n); | 
 |     timesSync(n, iterate); | 
 |  | 
 |     function iterate(num) { | 
 |       iterator(num, createCallback(num)); | 
 |     } | 
 |  | 
 |     function createCallback(index) { | 
 |       return function(err, res) { | 
 |         if (index === null) { | 
 |           throwError(); | 
 |         } | 
 |         result[index] = res; | 
 |         index = null; | 
 |         if (err) { | 
 |           callback(err); | 
 |           callback = noop; | 
 |         } else if (--n === 0) { | 
 |           callback(null, result); | 
 |         } | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace timesSeries | 
 |    * @param {number} n - n >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var iterator = function(n, done) { | 
 |    *   done(null, n); | 
 |    * }; | 
 |    * async.timesSeries(4, iterator, function(err, res) { | 
 |    *   console.log(res); // [0, 1, 2, 3]; | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function timesSeries(n, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     n = +n; | 
 |     if (isNaN(n) || n < 1) { | 
 |       return callback(null, []); | 
 |     } | 
 |     var result = Array(n); | 
 |     var sync = false; | 
 |     var completed = 0; | 
 |     iterate(); | 
 |  | 
 |     function iterate() { | 
 |       iterator(completed, done); | 
 |     } | 
 |  | 
 |     function done(err, res) { | 
 |       result[completed] = res; | 
 |       if (err) { | 
 |         callback(err); | 
 |         callback = throwError; | 
 |       } else if (++completed >= n) { | 
 |         callback(null, result); | 
 |         callback = throwError; | 
 |       } else if (sync) { | 
 |         nextTick(iterate); | 
 |       } else { | 
 |         sync = true; | 
 |         iterate(); | 
 |       } | 
 |       sync = false; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace timesLimit | 
 |    * @param {number} n - n >= 1 | 
 |    * @param {number} limit - n >= 1 | 
 |    * @param {Function} iterator | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * var iterator = function(n, done) { | 
 |    *   done(null, n); | 
 |    * }; | 
 |    * async.timesLimit(4, 2, iterator, function(err, res) { | 
 |    *   console.log(res); // [0, 1, 2, 3]; | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function timesLimit(n, limit, iterator, callback) { | 
 |     callback = callback || noop; | 
 |     n = +n; | 
 |     if (isNaN(n) || n < 1 || isNaN(limit) || limit < 1) { | 
 |       return callback(null, []); | 
 |     } | 
 |     var result = Array(n); | 
 |     var sync = false; | 
 |     var started = 0; | 
 |     var completed = 0; | 
 |     timesSync(limit > n ? n : limit, iterate); | 
 |  | 
 |     function iterate() { | 
 |       var index = started++; | 
 |       if (index < n) { | 
 |         iterator(index, createCallback(index)); | 
 |       } | 
 |     } | 
 |  | 
 |     function createCallback(index) { | 
 |       return function(err, res) { | 
 |         if (index === null) { | 
 |           throwError(); | 
 |         } | 
 |         result[index] = res; | 
 |         index = null; | 
 |         if (err) { | 
 |           callback(err); | 
 |           callback = noop; | 
 |         } else if (++completed >= n) { | 
 |           callback(null, result); | 
 |           callback = throwError; | 
 |         } else if (sync) { | 
 |           nextTick(iterate); | 
 |         } else { | 
 |           sync = true; | 
 |           iterate(); | 
 |         } | 
 |         sync = false; | 
 |       }; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace race | 
 |    * @param {Array|Object} tasks - functions | 
 |    * @param {Function} callback | 
 |    * @example | 
 |    * | 
 |    * // array | 
 |    * var called = 0; | 
 |    * var tasks = [ | 
 |    *   function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       called++; | 
 |    *       done(null, '1'); | 
 |    *     }, 30); | 
 |    *   }, | 
 |    *   function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       called++; | 
 |    *       done(null, '2'); | 
 |    *     }, 20); | 
 |    *   }, | 
 |    *   function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       called++; | 
 |    *       done(null, '3'); | 
 |    *     }, 10); | 
 |    *   } | 
 |    * ]; | 
 |    * async.race(tasks, function(err, res) { | 
 |    *   console.log(res); // '3' | 
 |    *   console.log(called); // 1 | 
 |    *   setTimeout(function() { | 
 |    *     console.log(called); // 3 | 
 |    *   }, 50); | 
 |    * }); | 
 |    * | 
 |    * @example | 
 |    * | 
 |    * // object | 
 |    * var called = 0; | 
 |    * var tasks = { | 
 |    *   'test1': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       called++; | 
 |    *       done(null, '1'); | 
 |    *     }, 30); | 
 |    *   }, | 
 |    *   'test2': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       called++; | 
 |    *       done(null, '2'); | 
 |    *     }, 20); | 
 |    *   }, | 
 |    *   'test3': function(done) { | 
 |    *     setTimeout(function() { | 
 |    *       called++; | 
 |    *       done(null, '3'); | 
 |    *     }, 10); | 
 |    *   } | 
 |    * }; | 
 |    * async.race(tasks, function(err, res) { | 
 |    *   console.log(res); // '3' | 
 |    *   console.log(called); // 1 | 
 |    *   setTimeout(function() { | 
 |    *     console.log(called); // 3 | 
 |    *     done(); | 
 |    *   }, 50); | 
 |    * }); | 
 |    * | 
 |    */ | 
 |   function race(tasks, callback) { | 
 |     callback = once(callback || noop); | 
 |     var size, keys; | 
 |     var index = -1; | 
 |     if (isArray(tasks)) { | 
 |       size = tasks.length; | 
 |       while (++index < size) { | 
 |         tasks[index](callback); | 
 |       } | 
 |     } else if (tasks && typeof tasks === obj) { | 
 |       keys = nativeKeys(tasks); | 
 |       size = keys.length; | 
 |       while (++index < size) { | 
 |         tasks[keys[index]](callback); | 
 |       } | 
 |     } else { | 
 |       return callback(new TypeError('First argument to race must be a collection of functions')); | 
 |     } | 
 |     if (!size) { | 
 |       callback(null); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace memoize | 
 |    */ | 
 |   function memoize(fn, hasher) { | 
 |     hasher = | 
 |       hasher || | 
 |       function(hash) { | 
 |         return hash; | 
 |       }; | 
 |  | 
 |     var memo = {}; | 
 |     var queues = {}; | 
 |     var memoized = function() { | 
 |       var args = createArray(arguments); | 
 |       var callback = args.pop(); | 
 |       var key = hasher.apply(null, args); | 
 |       if (has(memo, key)) { | 
 |         nextTick(function() { | 
 |           callback.apply(null, memo[key]); | 
 |         }); | 
 |         return; | 
 |       } | 
 |       if (has(queues, key)) { | 
 |         return queues[key].push(callback); | 
 |       } | 
 |  | 
 |       queues[key] = [callback]; | 
 |       args.push(done); | 
 |       fn.apply(null, args); | 
 |  | 
 |       function done(err) { | 
 |         var args = createArray(arguments); | 
 |         if (!err) { | 
 |           memo[key] = args; | 
 |         } | 
 |         var q = queues[key]; | 
 |         delete queues[key]; | 
 |  | 
 |         var i = -1; | 
 |         var size = q.length; | 
 |         while (++i < size) { | 
 |           q[i].apply(null, args); | 
 |         } | 
 |       } | 
 |     }; | 
 |     memoized.memo = memo; | 
 |     memoized.unmemoized = fn; | 
 |     return memoized; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace unmemoize | 
 |    */ | 
 |   function unmemoize(fn) { | 
 |     return function() { | 
 |       return (fn.unmemoized || fn).apply(null, arguments); | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace ensureAsync | 
 |    */ | 
 |   function ensureAsync(fn) { | 
 |     return function(/* ...args, callback */) { | 
 |       var args = createArray(arguments); | 
 |       var lastIndex = args.length - 1; | 
 |       var callback = args[lastIndex]; | 
 |       var sync = true; | 
 |       args[lastIndex] = done; | 
 |       fn.apply(this, args); | 
 |       sync = false; | 
 |  | 
 |       function done() { | 
 |         var innerArgs = createArray(arguments); | 
 |         if (sync) { | 
 |           nextTick(function() { | 
 |             callback.apply(null, innerArgs); | 
 |           }); | 
 |         } else { | 
 |           callback.apply(null, innerArgs); | 
 |         } | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace constant | 
 |    */ | 
 |   function constant(/* values... */) { | 
 |     var args = [null].concat(createArray(arguments)); | 
 |     return function(callback) { | 
 |       callback = arguments[arguments.length - 1]; | 
 |       callback.apply(this, args); | 
 |     }; | 
 |   } | 
 |  | 
 |   function asyncify(fn) { | 
 |     return function(/* args..., callback */) { | 
 |       var args = createArray(arguments); | 
 |       var callback = args.pop(); | 
 |       var result; | 
 |       try { | 
 |         result = fn.apply(this, args); | 
 |       } catch (e) { | 
 |         return callback(e); | 
 |       } | 
 |       if (result && typeof result.then === func) { | 
 |         result.then( | 
 |           function(value) { | 
 |             invokeCallback(callback, null, value); | 
 |           }, | 
 |           function(err) { | 
 |             invokeCallback(callback, err && err.message ? err : new Error(err)); | 
 |           } | 
 |         ); | 
 |       } else { | 
 |         callback(null, result); | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   function invokeCallback(callback, err, value) { | 
 |     try { | 
 |       callback(err, value); | 
 |     } catch (e) { | 
 |       nextTick(rethrow, e); | 
 |     } | 
 |   } | 
 |  | 
 |   function rethrow(error) { | 
 |     throw error; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace reflect | 
 |    * @param {Function} func | 
 |    * @return {Function} | 
 |    */ | 
 |   function reflect(func) { | 
 |     return function(/* args..., callback */) { | 
 |       var callback; | 
 |       switch (arguments.length) { | 
 |         case 1: | 
 |           callback = arguments[0]; | 
 |           return func(done); | 
 |         case 2: | 
 |           callback = arguments[1]; | 
 |           return func(arguments[0], done); | 
 |         default: | 
 |           var args = createArray(arguments); | 
 |           var lastIndex = args.length - 1; | 
 |           callback = args[lastIndex]; | 
 |           args[lastIndex] = done; | 
 |           func.apply(this, args); | 
 |       } | 
 |  | 
 |       function done(err, res) { | 
 |         if (err) { | 
 |           return callback(null, { | 
 |             error: err | 
 |           }); | 
 |         } | 
 |         if (arguments.length > 2) { | 
 |           res = slice(arguments, 1); | 
 |         } | 
 |         callback(null, { | 
 |           value: res | 
 |         }); | 
 |       } | 
 |     }; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace reflectAll | 
 |    * @param {Array[]|Object} tasks | 
 |    * @return {Function} | 
 |    */ | 
 |   function reflectAll(tasks) { | 
 |     var newTasks, keys; | 
 |     if (isArray(tasks)) { | 
 |       newTasks = Array(tasks.length); | 
 |       arrayEachSync(tasks, iterate); | 
 |     } else if (tasks && typeof tasks === obj) { | 
 |       keys = nativeKeys(tasks); | 
 |       newTasks = {}; | 
 |       baseEachSync(tasks, iterate, keys); | 
 |     } | 
 |     return newTasks; | 
 |  | 
 |     function iterate(func, key) { | 
 |       newTasks[key] = reflect(func); | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace createLogger | 
 |    */ | 
 |   function createLogger(name) { | 
 |     return function(fn) { | 
 |       var args = slice(arguments, 1); | 
 |       args.push(done); | 
 |       fn.apply(null, args); | 
 |     }; | 
 |  | 
 |     function done(err) { | 
 |       if (typeof console === obj) { | 
 |         if (err) { | 
 |           if (console.error) { | 
 |             console.error(err); | 
 |           } | 
 |           return; | 
 |         } | 
 |         if (console[name]) { | 
 |           var args = slice(arguments, 1); | 
 |           arrayEachSync(args, function(arg) { | 
 |             console[name](arg); | 
 |           }); | 
 |         } | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace safe | 
 |    */ | 
 |   function safe() { | 
 |     createImmediate(); | 
 |     return exports; | 
 |   } | 
 |  | 
 |   /** | 
 |    * @memberof async | 
 |    * @namespace fast | 
 |    */ | 
 |   function fast() { | 
 |     createImmediate(false); | 
 |     return exports; | 
 |   } | 
 | }); |