From fb094cd5c3203decc7c145725e29006f91e3e7f8 Mon Sep 17 00:00:00 2001 From: rizhang Date: Tue, 21 Mar 2017 13:20:06 -0700 Subject: [PATCH 01/38] Rz/ajax (#5) (#1042) update sharethrough adapter to use ajax for bid requests --- src/adapters/sharethrough.js | 38 +++++-------------------- test/spec/adapters/sharethrough_spec.js | 18 ++++++------ 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/src/adapters/sharethrough.js b/src/adapters/sharethrough.js index a9d26ecf23e..1fa799fd663 100644 --- a/src/adapters/sharethrough.js +++ b/src/adapters/sharethrough.js @@ -1,9 +1,10 @@ var utils = require('../utils.js'); var bidmanager = require('../bidmanager.js'); var bidfactory = require('../bidfactory.js'); +var ajax = require('../ajax.js').ajax; const STR_BIDDER_CODE = "sharethrough"; -const STR_VERSION = "0.1.0"; //Need to check analytics too for version +const STR_VERSION = "1.1.0"; var SharethroughAdapter = function SharethroughAdapter() { @@ -11,60 +12,35 @@ var SharethroughAdapter = function SharethroughAdapter() { str.STR_BTLR_HOST = document.location.protocol + "//btlr.sharethrough.com"; str.STR_BEACON_HOST = document.location.protocol + "//b.sharethrough.com/butler?"; str.placementCodeSet = {}; + str.ajax = ajax; function _callBids(params) { const bids = params.bids; - addEventListener("message", _receiveMessage, false); - // cycle through bids for (let i = 0; i < bids.length; i += 1) { const bidRequest = bids[i]; str.placementCodeSet[bidRequest.placementCode] = bidRequest; const scriptUrl = _buildSharethroughCall(bidRequest); - str.loadIFrame(scriptUrl); + str.ajax(scriptUrl, $$PREBID_GLOBAL$$.strcallback); } } function _buildSharethroughCall(bid) { - const testPkey = 'test'; const pkey = utils.getBidIdParameter('pkey', bid.params); let host = str.STR_BTLR_HOST; let url = host + "/header-bid/v1?"; url = utils.tryAppendQueryString(url, 'bidId', bid.bidId); - - if(pkey !== testPkey) { - url = utils.tryAppendQueryString(url, 'placement_key', pkey); - url = utils.tryAppendQueryString(url, 'ijson', '$$PREBID_GLOBAL$$.strcallback'); - url = appendEnvFields(url); - } else { - url = url.substring(0, url.length - 1); - } + url = utils.tryAppendQueryString(url, 'placement_key', pkey); + url = appendEnvFields(url); return url; } - str.loadIFrame = function(url) { - const iframe = document.createElement("iframe"); - iframe.src = url; - iframe.style.cssText = 'display:none;'; - - document.body.appendChild(iframe); - }; - - function _receiveMessage(event) { - if(event.origin === str.STR_BTLR_HOST) { - try { - $$PREBID_GLOBAL$$.strcallback(JSON.parse(event.data).response); - } catch(e) { - console.log(e); - } - } - } - $$PREBID_GLOBAL$$.strcallback = function(bidResponse) { + bidResponse = JSON.parse(bidResponse); const bidId = bidResponse.bidId; const bidObj = utils.getBidRequest(bidId); try { diff --git a/test/spec/adapters/sharethrough_spec.js b/test/spec/adapters/sharethrough_spec.js index 0678690370e..03eb7aaba49 100644 --- a/test/spec/adapters/sharethrough_spec.js +++ b/test/spec/adapters/sharethrough_spec.js @@ -51,20 +51,20 @@ describe('sharethrough adapter', () => { let secondBidUrl; beforeEach(() => { - sandbox.spy(adapter.str, 'loadIFrame'); + sandbox.spy(adapter.str, 'ajax'); }); - it('should call loadIFrame on the adloader for each bid', () => { + it('should call ajax to make a request for each bid', () => { adapter.callBids(bidderRequest); - firstBidUrl = adapter.str.loadIFrame.firstCall.args[0]; - secondBidUrl = adapter.str.loadIFrame.secondCall.args[0]; + firstBidUrl = adapter.str.ajax.firstCall.args[0]; + secondBidUrl = adapter.str.ajax.secondCall.args[0]; - sinon.assert.calledTwice(adapter.str.loadIFrame); + sinon.assert.calledTwice(adapter.str.ajax); - expect(firstBidUrl).to.contain(adapter.str.STR_BTLR_HOST + '/header-bid/v1?bidId=bidId1&placement_key=aaaa1111&ijson=pbjs.strcallback&hbVersion=%24prebid.version%24&strVersion=0.1.0&hbSource=prebid&'); - expect(secondBidUrl).to.contain(adapter.str.STR_BTLR_HOST + '/header-bid/v1?bidId=bidId2&placement_key=bbbb2222&ijson=pbjs.strcallback&hbVersion=%24prebid.version%24&strVersion=0.1.0&hbSource=prebid&'); + expect(firstBidUrl).to.contain(adapter.str.STR_BTLR_HOST + '/header-bid/v1?bidId=bidId1&placement_key=aaaa1111&hbVersion=%24prebid.version%24&strVersion=1.1.0&hbSource=prebid&'); + expect(secondBidUrl).to.contain(adapter.str.STR_BTLR_HOST + '/header-bid/v1?bidId=bidId2&placement_key=bbbb2222&hbVersion=%24prebid.version%24&strVersion=1.1.0&hbSource=prebid&'); }); }); @@ -117,8 +117,8 @@ describe('sharethrough adapter', () => { "stxUserId": "" }; - pbjs.strcallback(bidderReponse1); - pbjs.strcallback(bidderReponse2); + pbjs.strcallback(JSON.stringify(bidderReponse1)); + pbjs.strcallback(JSON.stringify(bidderReponse2)); firstBid = bidManager.addBidResponse.firstCall.args[1]; secondBid = bidManager.addBidResponse.secondCall.args[1]; From 4c9d6f619c295cd0d94366c13ea32ac31a3f4782 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 21 Mar 2017 14:30:38 -0600 Subject: [PATCH 02/38] Replace broken utils.extend functionality with Object.assign (#1055) * replace broken utils.extend functionality with object.assign * moved copy function to utils as cloneJson --- src/adapters/adkernel.js | 4 ++-- src/adapters/analytics/example2.js | 3 +-- src/adapters/analytics/roxot.js | 2 +- .../analytics/sharethrough_analytics.js | 2 +- src/adapters/appnexus.js | 2 +- src/adapters/xhb.js | 2 +- src/bidmanager.js | 2 +- src/events.js | 2 +- src/utils.js | 20 ++++--------------- test/spec/adapters/aol_spec.js | 3 +-- test/spec/adapters/lifestreet_spec.js | 4 ++-- test/spec/utils_spec.js | 6 +++--- 12 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/adapters/adkernel.js b/src/adapters/adkernel.js index 947e88e9415..99653c6b482 100644 --- a/src/adapters/adkernel.js +++ b/src/adapters/adkernel.js @@ -177,7 +177,7 @@ const AdKernelAdapter = function AdKernelAdapter() { * Create bid object for the bid manager */ function createBidObject(resp, bid, width, height) { - return utils.extend(bidfactory.createBid(1, bid), { + return Object.assign(bidfactory.createBid(1, bid), { bidderCode: bid.bidder, ad: formatAdMarkup(resp), width: width, @@ -190,7 +190,7 @@ const AdKernelAdapter = function AdKernelAdapter() { * Create empty bid object for the bid manager */ function createEmptyBidObject(bid) { - return utils.extend(bidfactory.createBid(2, bid), { + return Object.assign(bidfactory.createBid(2, bid), { bidderCode: bid.bidder }); } diff --git a/src/adapters/analytics/example2.js b/src/adapters/analytics/example2.js index 5e5c0dfc197..b9586b5c59a 100644 --- a/src/adapters/analytics/example2.js +++ b/src/adapters/analytics/example2.js @@ -5,12 +5,11 @@ import { ajax } from 'src/ajax'; */ import adapter from 'AnalyticsAdapter'; -const utils = require('../../utils'); const url = 'https://httpbin.org/post'; const analyticsType = 'endpoint'; -export default utils.extend(adapter( +export default Object.assign(adapter( { url, analyticsType diff --git a/src/adapters/analytics/roxot.js b/src/adapters/analytics/roxot.js index e00ef05c20f..2b71dda84db 100644 --- a/src/adapters/analytics/roxot.js +++ b/src/adapters/analytics/roxot.js @@ -6,7 +6,7 @@ const utils = require('../../utils'); const url = '//d.rxthdr.com/analytics'; const analyticsType = 'endpoint'; -export default utils.extend(adapter( +export default Object.assign(adapter( { url, analyticsType diff --git a/src/adapters/analytics/sharethrough_analytics.js b/src/adapters/analytics/sharethrough_analytics.js index 6b4f9297346..6eadcbcf60c 100644 --- a/src/adapters/analytics/sharethrough_analytics.js +++ b/src/adapters/analytics/sharethrough_analytics.js @@ -6,7 +6,7 @@ const analyticsType = 'endpoint'; const STR_BIDDER_CODE = "sharethrough"; const STR_VERSION = "0.1.0"; -export default utils.extend(adapter( +export default Object.assign(adapter( { emptyUrl, analyticsType diff --git a/src/adapters/appnexus.js b/src/adapters/appnexus.js index 4e60c01826a..0a3b8f7284b 100644 --- a/src/adapters/appnexus.js +++ b/src/adapters/appnexus.js @@ -98,7 +98,7 @@ AppNexusAdapter = function AppNexusAdapter() { } //append custom attributes: - var paramsCopy = utils.extend({}, bid.params); + var paramsCopy = Object.assign({}, bid.params); //delete attributes already used delete paramsCopy.placementId; diff --git a/src/adapters/xhb.js b/src/adapters/xhb.js index be51e257cfd..2b00844e2a1 100644 --- a/src/adapters/xhb.js +++ b/src/adapters/xhb.js @@ -69,7 +69,7 @@ const XhbAdapter = function XhbAdapter() { } //append custom attributes: - let paramsCopy = utils.extend({}, bid.params); + let paramsCopy = Object.assign({}, bid.params); //delete attributes already used delete paramsCopy.placementId; diff --git a/src/bidmanager.js b/src/bidmanager.js index 69eed14c7c4..fc3092d200a 100644 --- a/src/bidmanager.js +++ b/src/bidmanager.js @@ -342,7 +342,7 @@ function adjustBids(bid) { if (code && $$PREBID_GLOBAL$$.bidderSettings && $$PREBID_GLOBAL$$.bidderSettings[code]) { if (typeof $$PREBID_GLOBAL$$.bidderSettings[code].bidCpmAdjustment === objectType_function) { try { - bidPriceAdjusted = $$PREBID_GLOBAL$$.bidderSettings[code].bidCpmAdjustment.call(null, bid.cpm, utils.extend({}, bid)); + bidPriceAdjusted = $$PREBID_GLOBAL$$.bidderSettings[code].bidCpmAdjustment.call(null, bid.cpm, Object.assign({}, bid)); } catch (e) { utils.logError('Error during bid adjustment', 'bidmanager.js', e); diff --git a/src/events.js b/src/events.js index ec196b21c58..2b52de1c38f 100644 --- a/src/events.js +++ b/src/events.js @@ -142,7 +142,7 @@ module.exports = (function () { _public.getEvents = function () { var arrayCopy = []; utils._each(eventsFired, function (value) { - var newProp = utils.extend({}, value); + var newProp = Object.assign({}, value); arrayCopy.push(newProp); }); diff --git a/src/utils.js b/src/utils.js index 71ebd1cb936..d56bd05a696 100644 --- a/src/utils.js +++ b/src/utils.js @@ -109,22 +109,6 @@ exports.transformAdServerTargetingObj = function (targeting) { } }; -//Copy all of the properties in the source objects over to the target object -//return the target object. -exports.extend = function (target, source) { - target = target || {}; - - this._each(source, function (value, prop) { - if (typeof source[prop] === objectType_object) { - target[prop] = this.extend(target[prop], source[prop]); - } else { - target[prop] = source[prop]; - } - }); - - return target; -}; - /** * Parse a GPT-Style general size Array like `[[300, 250]]` or `"300x250,970x90"` into an array of sizes `["300x250"]` or '['300x250', '970x90']' * @param {array[array|number]} sizeObj Input array or double array [300,250] or [[300,250], [728,90]] @@ -601,3 +585,7 @@ export function isSrcdocSupported(doc) { //Firefox is excluded due to https://bugzilla.mozilla.org/show_bug.cgi?id=1265961 return !!doc.defaultView && 'srcdoc' in doc.defaultView.frameElement && !/firefox/i.test(navigator.userAgent); } + +export function cloneJson(obj) { + return JSON.parse(JSON.stringify(obj)); +} \ No newline at end of file diff --git a/test/spec/adapters/aol_spec.js b/test/spec/adapters/aol_spec.js index a4181e842c6..38346743d4c 100644 --- a/test/spec/adapters/aol_spec.js +++ b/test/spec/adapters/aol_spec.js @@ -1,5 +1,4 @@ import {expect} from 'chai'; -import { cloneDeep } from 'lodash'; import * as utils from 'src/utils'; import AolAdapter from 'src/adapters/aol'; import bidmanager from 'src/bidmanager'; @@ -45,7 +44,7 @@ describe('AolAdapter', () => { beforeEach(() => adapter = new AolAdapter()); function createBidderRequest({bids, params} = {}) { - var bidderRequest = cloneDeep(DEFAULT_BIDDER_REQUEST); + var bidderRequest = utils.cloneJson(DEFAULT_BIDDER_REQUEST); if (bids && Array.isArray(bids)) { bidderRequest.bids = bids; } diff --git a/test/spec/adapters/lifestreet_spec.js b/test/spec/adapters/lifestreet_spec.js index 3ae2b6add2f..848c899fcbf 100644 --- a/test/spec/adapters/lifestreet_spec.js +++ b/test/spec/adapters/lifestreet_spec.js @@ -1,7 +1,7 @@ import {expect} from 'chai'; +import {cloneJson} from 'src/utils'; import adloader from 'src/adloader'; import bidmanager from 'src/bidmanager'; -import * as utils from 'src/utils'; import LifestreetAdapter from 'src/adapters/lifestreet'; const BIDDER_REQUEST = { @@ -44,7 +44,7 @@ describe ('LifestreetAdapter', () => { beforeEach(() => { tagRequests = []; - request = utils.extend(request, BIDDER_REQUEST); + request = cloneJson(BIDDER_REQUEST); sinon.stub(adloader, 'loadScript', (url, callback) => { tagRequests.push(url); callback(); diff --git a/test/spec/utils_spec.js b/test/spec/utils_spec.js index 118109c3971..faa7aaae13a 100755 --- a/test/spec/utils_spec.js +++ b/test/spec/utils_spec.js @@ -130,7 +130,7 @@ describe('Utils', function () { c:'3' }; - var output = utils.extend(target, source); + var output = Object.assign(target, source); assert.deepEqual(output, expectedResult); }); @@ -140,7 +140,7 @@ describe('Utils', function () { c:'3' }; - var output = utils.extend(target, source); + var output = Object.assign(target, source); assert.deepEqual(output, source); }); @@ -151,7 +151,7 @@ describe('Utils', function () { }; var source = {}; - var output = utils.extend(target, source); + var output = Object.assign(target, source); assert.deepEqual(output, target); }); }); From 871d6f6aed557a42b056a1cdea4f79b0ffeaee45 Mon Sep 17 00:00:00 2001 From: Nate Cozi Date: Tue, 21 Mar 2017 14:20:23 -0700 Subject: [PATCH 03/38] remove trailing comma on expect test params (#1060) --- test/spec/adapters/bidfluence_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/spec/adapters/bidfluence_spec.js b/test/spec/adapters/bidfluence_spec.js index 75d6aa98fdf..7c414853056 100644 --- a/test/spec/adapters/bidfluence_spec.js +++ b/test/spec/adapters/bidfluence_spec.js @@ -46,7 +46,7 @@ describe('Bidfluence Adapter', () => { var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; - expect(bidPlacementCode1).to.equal("div-1",); + expect(bidPlacementCode1).to.equal("div-1"); expect(bidObject1.getStatusCode()).to.equal(1); expect(bidObject1.bidderCode).to.equal('bidfluence'); @@ -64,7 +64,7 @@ describe('Bidfluence Adapter', () => { var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; - expect(bidPlacementCode1).to.equal("div-1",); + expect(bidPlacementCode1).to.equal("div-1"); expect(bidObject1.getStatusCode()).to.equal(2); expect(bidObject1.bidderCode).to.equal('bidfluence'); From cb6cd4bf388534e57c7e377579313475d8bd6516 Mon Sep 17 00:00:00 2001 From: rizhang Date: Wed, 22 Mar 2017 17:41:27 -0700 Subject: [PATCH 04/38] Ensure cookies get sent in request headers (#1069) * Add "withCredentials" to the AJAX call to make sure cookies get sent * correctly --- src/adapters/sharethrough.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adapters/sharethrough.js b/src/adapters/sharethrough.js index 1fa799fd663..d61655ff163 100644 --- a/src/adapters/sharethrough.js +++ b/src/adapters/sharethrough.js @@ -22,7 +22,7 @@ var SharethroughAdapter = function SharethroughAdapter() { const bidRequest = bids[i]; str.placementCodeSet[bidRequest.placementCode] = bidRequest; const scriptUrl = _buildSharethroughCall(bidRequest); - str.ajax(scriptUrl, $$PREBID_GLOBAL$$.strcallback); + str.ajax(scriptUrl, $$PREBID_GLOBAL$$.strcallback, undefined, {withCredentials: true}); } } From c90c2f23699732b4c1d4c4bfc98d88c9feca2de9 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 23 Mar 2017 10:26:41 -0600 Subject: [PATCH 05/38] Fix spacing in openx adapter (#1067) --- src/adapters/openx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adapters/openx.js b/src/adapters/openx.js index 54114b7e7de..42314e7f286 100644 --- a/src/adapters/openx.js +++ b/src/adapters/openx.js @@ -197,7 +197,7 @@ const OpenxAdapter = function OpenxAdapter() { let isIfr, bids = params.bids || [], currentURL = (window.parent !== window) ? document.referrer : window.location.href; - currentURL = currentURL && encodeURIComponent(currentURL); + currentURL = currentURL && encodeURIComponent(currentURL); try { isIfr = window.self !== window.top; } From 4186cdcbfeb749a35a8e7671cf17d9fe58c5ec22 Mon Sep 17 00:00:00 2001 From: "Eric \"dantarion\" Sheppard" Date: Fri, 24 Mar 2017 14:40:58 -0700 Subject: [PATCH 06/38] Rewrite of UnderdogMedia Adapter (#1061) * Rewrite of UnderdogMedia Adapter * underdogmedia adapter: ensure compatibility with single array size param, ensure cpm is a Number --- src/adapters/underdogmedia.js | 137 +++++++++++++-------- test/spec/adapters/underdogmedia_spec.js | 146 ++++++++++------------- 2 files changed, 153 insertions(+), 130 deletions(-) diff --git a/src/adapters/underdogmedia.js b/src/adapters/underdogmedia.js index 79843eb2c37..c467c3ee420 100644 --- a/src/adapters/underdogmedia.js +++ b/src/adapters/underdogmedia.js @@ -5,71 +5,108 @@ var utils = require('../utils.js'); var UnderdogMediaAdapter = function UnderdogMediaAdapter() { - var getJsStaticUrl = window.location.protocol + '//bid.underdog.media/udm_header_lib.js'; + const UDM_ADAPTER_VERSION = '1.0.0'; + var getJsStaticUrl = window.location.protocol + '//udmserve.net/udm/img.fetch?tid=1;dt=9;callback=$$PREBID_GLOBAL$$.handleUnderdogMediaCB;'; + var bidParams = {}; function _callBids(params) { - if (typeof window.udm_header_lib === 'undefined') { - adloader.loadScript(getJsStaticUrl, function () { bid(params); }); - } else { - bid(params); - } - } + bidParams = params; + var sizes = []; + var siteId = 0; - function bid(params) { - var bids = params.bids; - var mapped_bids = []; - for (var i = 0; i < bids.length; i++) { - var bidRequest = bids[i]; - var callback = bidResponseCallback(bidRequest); - mapped_bids.push({ - sizes: bidRequest.sizes, - siteId: bidRequest.params.siteId, - bidfloor: bidRequest.params.bidfloor, - placementCode: bidRequest.placementCode, - divId: bidRequest.params.divId, - subId: bidRequest.params.subId, - callback: callback - }); + for (var bidParam of bidParams.bids) { + sizes = utils.flatten(sizes,utils.parseSizesInput(bidParam.sizes)); + siteId = bidParam.params.siteId; } - var udmBidRequest = new window.udm_header_lib.BidRequestArray(mapped_bids); - udmBidRequest.send(); + adloader.loadScript(getJsStaticUrl + "sid=" + siteId + ";sizes=" + sizes.join(","), null, false); } - function bidResponseCallback(bid) { - return function (bidResponse) { - bidResponseAvailable(bid, bidResponse); - }; - } + function _callback(response) { + + var mids = response.mids; + for (var bidParam of bidParams.bids) { + + var filled = false; + for (var mid of mids) { + + if (mid.useCount > 0) { + continue; + } + if (!mid.useCount) { + mid.useCount = 0; + } + var size_not_found = true; + for (var size of utils.parseSizesInput(bidParam.sizes)) { + if (size === mid.width + 'x' + mid.height) { + size_not_found = false; + } + } + if (size_not_found) { + continue; + } + + var bid = bidfactory.createBid(1, bidParam); + bid.bidderCode = bidParam.bidder; + bid.width = mid.width; + bid.height = mid.height; - function bidResponseAvailable(bidRequest, bidResponse) { - if(bidResponse.bids.length > 0){ - for(var i = 0; i < bidResponse.bids.length; i++){ - var udm_bid = bidResponse.bids[i]; - var bid = bidfactory.createBid(1); - bid.bidderCode = bidRequest.bidder; - bid.cpm = udm_bid.cpm; - bid.width = udm_bid.width; - bid.height = udm_bid.height; - - if(udm_bid.ad_url !== undefined){ - bid.adUrl = udm_bid.ad_url; + bid.cpm = parseFloat(mid.cpm); + if (bid.cpm <= 0) { + continue; } - else if(udm_bid.ad_html !== undefined){ - bid.ad = udm_bid.ad_html; - }else{ - utils.logMessage('Underdogmedia bid is lacking both ad_url and ad_html, skipping bid'); + mid.useCount++; + bid.ad = mid.ad_code_html; + bid.ad = _makeNotification(bid, mid, bidParam) + bid.ad; + if (!(bid.ad || bid.adUrl)) { continue; } + bidmanager.addBidResponse(bidParam.placementCode, bid); + filled = true; + break; + } + if (!filled) { + var nobid = bidfactory.createBid(2, bidParam); + nobid.bidderCode = bidParam.bidder; + bidmanager.addBidResponse(bidParam.placementCode, nobid); + } + } + } + + $$PREBID_GLOBAL$$.handleUnderdogMediaCB = _callback; + + function _makeNotification(bid, mid, bidParam) { - bidmanager.addBidResponse(bidRequest.placementCode, bid); + var url = mid.notification_url; + + url += UDM_ADAPTER_VERSION; + url += ";cb=" + Math.random(); + url += ";qqq=" + (1 / bid.cpm); + url += ";hbt=" + $$PREBID_GLOBAL$$.bidderTimeout; + url += ';style=adapter'; + url += ';vis=' + encodeURIComponent(document.visibilityState); + + url += ';traffic_info=' + encodeURIComponent(JSON.stringify(_getUrlVars())); + if (bidParam.params.subId) { + url += ';subid=' + encodeURIComponent(bidParam.params.subId); + } + return ""; + } + + function _getUrlVars() { + var vars = {}; + var hash; + var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); + for (var i = 0; i < hashes.length; i++) { + hash = hashes[i].split('='); + if (!hash[0].match(/^utm/)) { + continue; } - }else{ - var nobid = bidfactory.createBid(2); - nobid.bidderCode = bidRequest.bidder; - bidmanager.addBidResponse(bidRequest.placementCode, nobid); + vars[hash[0]] = hash[1].substr(0, 150); } + return vars; } + return { callBids: _callBids }; diff --git a/test/spec/adapters/underdogmedia_spec.js b/test/spec/adapters/underdogmedia_spec.js index a1f31740d4e..3c8639fd56a 100644 --- a/test/spec/adapters/underdogmedia_spec.js +++ b/test/spec/adapters/underdogmedia_spec.js @@ -2,96 +2,76 @@ import Adapter from '../../../src/adapters/underdogmedia'; import bidManager from '../../../src/bidmanager'; -import {expect} from 'chai'; +import adloader from '../../../src/adloader'; -describe('underdog media adapter test', () => { +import { + expect +} from 'chai'; + +describe('underdogmedia adapter test', () => { let adapter; let server; - // Minimal stub implementation of underdog media header bid API - // This will prevent the need to load underdog's static library, and to make requests to underdog's server - window.udm_header_lib = { - - BidRequest: function(options){ - return { - send: function(){ - var siteId = options.siteId; - if(siteId == 10272){ - // Only bid on this particular site id - var bids = []; - options.sizes.forEach(function(size){ - bids.push({ - cpm: 3.14, - ad_html: `Ad HTML for site ID ${siteId} size ${size[0]}x${size[1]}`, - width: size[0], - height: size[1] - }); - }); - options.callback({ - bids: bids - }); - } else { - options.callback({ - bids: [] - }); - } + // The third bid here is an invalid site id and should return a 'no-bid'. + var bidderRequest = { + bidderCode: 'underdogmedia', + bids: [{ + bidder: 'underdogmedia', + adUnitCode: 'foo', + sizes: [ + [728, 90] + ], + params: { + siteId: '10272' + } + }, + { + bidder: 'underdogmedia', + adUnitCode: 'bar', + sizes: [ + [300, 250] + ], + params: { + siteId: '10272', + subId: 'TEST_SUBID' } - }; - }, - - BidRequestArray: function(arr){ - return { - send: function(){ - arr.forEach(function(bidRequest){ - var req = new window.udm_header_lib.BidRequest(bidRequest); - req.send(); - }); + }, + { + bidder: 'underdogmedia', + adUnitCode: 'nothing', + sizes: [160, 600], + params: { + siteId: '31337' } - }; - } + } + ] + }; + var response = { + "mids": [{ + "width": 728, + "notification_url": "//udmserve.net/notification_url", + "height": 90, + "cpm": 2.5, + "ad_code_html": "Ad HTML for site ID 10272 size 728x90" + }, + { + "width": 300, + "notification_url": "//udmserve.net/notification_url", + "height": 250, + "cpm": 2.0, + "ad_code_html": "Ad HTML for site ID 10272 size 300x250" + } + ] }; - // The third bid here is an invalid site id and should return a 'no-bid'. - function request() { - adapter.callBids({ - bidderCode: 'underdogmedia', - bids: [ - { - bidder: 'underdogmedia', - adUnitCode: 'foo', - sizes: [[728, 90]], - params: { - siteId: '10272' - } - }, - { - bidder: 'underdogmedia', - adUnitCode: 'bar', - sizes: [[300, 250]], - params: { - siteId: '10272' - } - }, - { - bidder: 'underdogmedia', - adUnitCode: 'nothing', - sizes: [[160, 600]], - params: { - siteId: '31337' - } - } - ] - }); - } beforeEach(() => { adapter = new Adapter(); }); - afterEach(() => { - }); + afterEach(() => {}); describe('adding bids to the manager', () => { @@ -101,7 +81,10 @@ describe('underdog media adapter test', () => { beforeEach(() => { sinon.stub(bidManager, 'addBidResponse'); - request(); + sinon.stub(adloader, 'loadScript'); + + adapter.callBids(bidderRequest); + $$PREBID_GLOBAL$$.handleUnderdogMediaCB(JSON.parse(JSON.stringify(response))); firstBid = bidManager.addBidResponse.firstCall.args[1]; secondBid = bidManager.addBidResponse.secondCall.args[1]; thirdBid = bidManager.addBidResponse.thirdCall.args[1]; @@ -109,6 +92,7 @@ describe('underdog media adapter test', () => { afterEach(() => { bidManager.addBidResponse.restore(); + adloader.loadScript.restore(); }); it('will add a bid object for each bid', () => { @@ -116,12 +100,14 @@ describe('underdog media adapter test', () => { }); it('will add the ad html to the bid object', () => { - expect(firstBid).to.have.property('ad', 'Ad HTML for site ID 10272 size 728x90'); - expect(secondBid).to.have.property('ad', 'Ad HTML for site ID 10272 size 300x250'); + + expect(firstBid).to.have.property('ad').includes('Ad HTML for site ID 10272 size 728x90'); + expect(secondBid).to.have.property('ad').includes('Ad HTML for site ID 10272 size 300x250').and.includes('TEST_SUBID'); expect(thirdBid).to.not.have.property('ad'); }); it('will have the right size attached', () => { + expect(firstBid).to.have.property('width', 728); expect(firstBid).to.have.property('height', 90); expect(secondBid).to.have.property('width', 300); @@ -129,8 +115,8 @@ describe('underdog media adapter test', () => { }); it('will add the CPM to the bid object', () => { - expect(firstBid).to.have.property('cpm', 3.14); - expect(secondBid).to.have.property('cpm', 3.14); + expect(firstBid).to.have.property('cpm', 2.5); + expect(secondBid).to.have.property('cpm', 2.0); expect(thirdBid).to.not.have.property('cpm'); }); From fc9899bc81dd6d97677c123d64b74081e73bbed6 Mon Sep 17 00:00:00 2001 From: Niksok Date: Sat, 25 Mar 2017 01:04:55 +0300 Subject: [PATCH 07/38] Fix bug with invalid characters in JSONP callback name (#1070) * Add centro adapter and tests for it. * fix bug with different types of bid.sectionID and bid.unit from config * add query parameter adapter=prebid * update tests for centro adapter * fixed bug with call of JSONP callback with name, that contain invalid characters --- src/adapters/centro.js | 2 +- test/spec/adapters/centro_spec.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/adapters/centro.js b/src/adapters/centro.js index cad9dc7713b..85303afc823 100644 --- a/src/adapters/centro.js +++ b/src/adapters/centro.js @@ -54,7 +54,7 @@ var CentroAdapter = function CentroAdapter() { } //make handler name for JSONP request var handlerName = handlerPrefix + bid.unit + size.join('x') + encodeURIComponent(placementCode); - query.push('callback=' + handlerName); + query.push('callback=' + encodeURIComponent('window["' + handlerName + '"]')); //maybe is needed add some random parameter to disable cache //query.push('r='+Math.round(Math.random() * 1e5)); diff --git a/test/spec/adapters/centro_spec.js b/test/spec/adapters/centro_spec.js index abc83f6c603..a3f186fad65 100644 --- a/test/spec/adapters/centro_spec.js +++ b/test/spec/adapters/centro_spec.js @@ -78,7 +78,7 @@ describe('centro adapter tests', function () { var parsedBidUrl = urlParse(bidUrl1); var parsedBidUrlQueryString = querystringify.parse(parsedBidUrl.query); - var generatedCallback = 'adCentroHandler_28136300x250div-gpt-ad-12345-1'; + var generatedCallback = 'window["adCentroHandler_28136300x250div-gpt-ad-12345-1"]'; expect(parsedBidUrl.hostname).to.equal('staging.brand-server.com'); expect(parsedBidUrl.pathname).to.equal('/hb'); @@ -92,7 +92,7 @@ describe('centro adapter tests', function () { parsedBidUrl = urlParse(bidUrl2); parsedBidUrlQueryString = querystringify.parse(parsedBidUrl.query); - generatedCallback = 'adCentroHandler_28137728x90div-gpt-ad-12345-2'; + generatedCallback = 'window["adCentroHandler_28137728x90div-gpt-ad-12345-2"]'; expect(parsedBidUrl.hostname).to.equal('t.brand-server.com'); expect(parsedBidUrl.pathname).to.equal('/hb'); From f7216e131be46a691c45caac4ed8be069b61e5dc Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 24 Mar 2017 17:23:50 -0600 Subject: [PATCH 08/38] Allow error handlers in ajax requests (#1032) --- src/adapters/rubicon.js | 29 +++++++++++++++++++++++++++-- src/ajax.js | 30 ++++++++++++++++++++++++------ test/spec/adapters/rubicon_spec.js | 12 ++++++++++++ 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/adapters/rubicon.js b/src/adapters/rubicon.js index 26c540a82f9..b0ec5764e0b 100644 --- a/src/adapters/rubicon.js +++ b/src/adapters/rubicon.js @@ -62,9 +62,29 @@ function RubiconAdapter() { try { // Video endpoint only accepts POST calls if (bid.mediaType === 'video') { - ajax(VIDEO_ENDPOINT, bidCallback, buildVideoRequestPayload(bid, bidderRequest), {withCredentials: true}); + ajax( + VIDEO_ENDPOINT, + { + success: bidCallback, + error: bidError + }, + buildVideoRequestPayload(bid, bidderRequest), + { + withCredentials: true + } + ); } else { - ajax(buildOptimizedCall(bid), bidCallback, undefined, {withCredentials: true}); + ajax( + buildOptimizedCall(bid), + { + success: bidCallback, + error: bidError + }, + undefined, + { + withCredentials: true + } + ); } } catch(err) { utils.logError('Error sending rubicon request for placement code ' + bid.placementCode, null, err); @@ -85,6 +105,11 @@ function RubiconAdapter() { } } + function bidError(err, xhr) { + utils.logError('Request for rubicon responded with:', xhr.status, err); + addErrorBid(); + } + function addErrorBid() { let badBid = bidfactory.createBid(STATUS.NO_BID, bid); badBid.bidderCode = bid.bidder; diff --git a/src/ajax.js b/src/ajax.js index 864650cea58..019efd34106 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -9,7 +9,7 @@ const XHR_DONE = 4; * Note: x-domain requests in IE9 do not support the use of cookies * * @param url string url - * @param callback object callback + * @param callback {object | function} callback * @param data mixed data * @param options object */ @@ -20,6 +20,19 @@ export function ajax(url, callback, data, options = {}) { let useXDomainRequest = false; let method = options.method || (data ? 'POST' : 'GET'); + let callbacks = typeof callback === "object" ? callback : { + success: function() { + utils.logMessage('xhr success'); + }, + error: function(e) { + utils.logError('xhr error', null, e); + } + }; + + if(typeof callback === "function") { + callbacks.success = callback; + } + if (!window.XMLHttpRequest) { useXDomainRequest = true; } else{ @@ -32,23 +45,28 @@ export function ajax(url, callback, data, options = {}) { if (useXDomainRequest) { x = new window.XDomainRequest(); x.onload = function () { - callback(x.responseText, x); + callbacks.success(x.responseText, x); }; // http://stackoverflow.com/questions/15786966/xdomainrequest-aborts-post-on-ie-9 x.onerror = function () { - utils.logMessage('xhr onerror'); + callbacks.error("error", x); }; x.ontimeout = function () { - utils.logMessage('xhr timeout'); + callbacks.error("timeout", x); }; x.onprogress = function() { utils.logMessage('xhr onprogress'); }; } else { x.onreadystatechange = function () { - if (x.readyState === XHR_DONE && callback) { - callback(x.responseText, x); + if (x.readyState === XHR_DONE) { + let status = x.status; + if(status >= 200 && status < 300 || status === 304) { + callbacks.success(x.responseText, x); + } else { + callbacks.error(x.statusText, x); + } } }; } diff --git a/test/spec/adapters/rubicon_spec.js b/test/spec/adapters/rubicon_spec.js index 84503629270..a810c71367f 100644 --- a/test/spec/adapters/rubicon_spec.js +++ b/test/spec/adapters/rubicon_spec.js @@ -583,6 +583,18 @@ describe('the rubicon adapter', () => { expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); }); + it('should handle error contacting endpoint', () => { + server.respondWith([404, {}, ""]); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + }); + it('should not register an error bid when a success call to addBidResponse throws an error', () => { server.respondWith(JSON.stringify({ From 41e68915fe40f55c4d01c9a0d648f701893635ca Mon Sep 17 00:00:00 2001 From: Miller Date: Mon, 27 Mar 2017 20:14:18 +0300 Subject: [PATCH 09/38] Fix adapter getSize (#1064) * Vertamedia prebid.js adapter initial * sync * remove https * add http * remove let * fix typo * fix spaces * add descriptionUrl; remove log * fix getSize * add usege parseSizesInput --- src/adapters/vertamedia.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/adapters/vertamedia.js b/src/adapters/vertamedia.js index ea9e5402b09..13f036764d7 100644 --- a/src/adapters/vertamedia.js +++ b/src/adapters/vertamedia.js @@ -35,17 +35,36 @@ function VertamediaAdapter() { } bidRequest = bid; - bidRequest.width = parseInt(bid.sizes[0], 10) || undefined; - bidRequest.height = parseInt(bid.sizes[1], 10) || undefined; + + let size = getSize(bid.sizes); + + bidRequest.width = size.width; + bidRequest.height = size.height; return { aid: bid.params.aid, - w: parseInt(bid.sizes[0], 10) || undefined, - h: parseInt(bid.sizes[1], 10) || undefined, + w: size.width, + h: size.height, domain: document.location.hostname }; } + function getSize(requestSizes) { + var parsed = {}, + size = utils.parseSizesInput(requestSizes)[0]; + + if (typeof size !== 'string') { + return parsed; + } + + let parsedSize = size.toUpperCase().split('X'); + + return { + width: parseInt(parsedSize[0], 10) || undefined, + height: parseInt(parsedSize[1], 10) || undefined + }; + } + /* Notify Prebid of bid responses so bids can get in the auction */ function handleResponse(response) { var parsed; From 7361e64c97252ef1a41180cdae43e53124d16eda Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 27 Mar 2017 19:28:50 -0400 Subject: [PATCH 10/38] Add rubicon targeting to rubicon bid responses for bidderSettings use (#1045) --- src/adapters/rubicon.js | 6 ++++++ test/spec/adapters/rubicon_spec.js | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/adapters/rubicon.js b/src/adapters/rubicon.js index b0ec5764e0b..222cd246e3a 100644 --- a/src/adapters/rubicon.js +++ b/src/adapters/rubicon.js @@ -319,6 +319,12 @@ function RubiconAdapter() { [bid.width, bid.height] = sizeMap[ad.size_id].split('x').map(num => Number(num)); } + // add server-side targeting + bid.rubiconTargeting = (Array.isArray(ad.targeting) ? ad.targeting : []) + .reduce((memo, item) => { + memo[item.key] = item.values[0]; + return memo; + }, {'rpfl_elemid': bidRequest.placementCode}); try { bidmanager.addBidResponse(bidRequest.placementCode, bid); diff --git a/test/spec/adapters/rubicon_spec.js b/test/spec/adapters/rubicon_spec.js index a810c71367f..9dd7dfa80e7 100644 --- a/test/spec/adapters/rubicon_spec.js +++ b/test/spec/adapters/rubicon_spec.js @@ -291,7 +291,7 @@ describe('the rubicon adapter', () => { expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); }); - + it('should allow a floor override', () => { var floorBidderRequest = clone(bidderRequest); @@ -458,7 +458,7 @@ describe('the rubicon adapter', () => { { 'key': 'rpfl_14062', 'values': [ - '15_tier_all_test' + '43_tier_all_test' ] } ] @@ -482,6 +482,8 @@ describe('the rubicon adapter', () => { expect(bids[0].ad).to.contain(`alert('foo')`) .and.to.contain(``) .and.to.contain(`
`); + expect(bids[0].rubiconTargeting.rpfl_elemid).to.equal('/19968336/header-bid-tag-0'); + expect(bids[0].rubiconTargeting.rpfl_14062).to.equal('43_tier_all_test'); expect(bids[1].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); expect(bids[1].bidderCode).to.equal('rubicon'); @@ -491,6 +493,8 @@ describe('the rubicon adapter', () => { expect(bids[1].ad).to.contain(`alert('foo')`) .and.to.contain(``) .and.to.contain(`
`); + expect(bids[1].rubiconTargeting.rpfl_elemid).to.equal('/19968336/header-bid-tag-0'); + expect(bids[1].rubiconTargeting.rpfl_14062).to.equal('15_tier_all_test'); }); it('should be fine with a CPM of 0', () => { From 2e6d865d8a97429e33ffb6650dbe3ba8094bc6a7 Mon Sep 17 00:00:00 2001 From: jstocker76 Date: Mon, 27 Mar 2017 17:12:05 -0700 Subject: [PATCH 11/38] Video header bidding support to RhythmOne bidder adapter (#1052) * adding video header bidding support to rhythmone adapter * improving code coverage of unit tests * fixing unit tests --- adapters.json | 6 +- src/adapters/rhythmone.js | 252 ++++++++++++--------------- test/spec/adapters/rhythmone_spec.js | 12 +- 3 files changed, 127 insertions(+), 143 deletions(-) diff --git a/adapters.json b/adapters.json index 610bba7012c..fceef8688d7 100644 --- a/adapters.json +++ b/adapters.json @@ -116,6 +116,10 @@ "getintent": { "supportedMediaTypes" : ["video"] } + }, + { + "rhythmone": { + "supportedMediaTypes": ["video"] + } } - ] diff --git a/src/adapters/rhythmone.js b/src/adapters/rhythmone.js index 77ab3e4cd13..57b6e29a217 100644 --- a/src/adapters/rhythmone.js +++ b/src/adapters/rhythmone.js @@ -1,13 +1,12 @@ var bidmanager = require('../bidmanager.js'), bidfactory = require('../bidfactory.js'), - utils = require('../utils.js'), CONSTANTS = require('../constants.json'); import {ajax as ajax} from '../ajax'; -function track(debug, p1, p2, p3) { +function track(debug) { if(debug === true){ - console.log('GA: %s %s %s', p1, p2, p3 || ''); + //console.log('GA: %s %s %s', p1, p2, p3 || ''); } } @@ -19,8 +18,6 @@ module.exports = function(bidManager, global, loader){ var version = "0.9.0.0", defaultZone = "1r", defaultPath = "mvo", - bidfloor = 0, - currency = "USD", debug = false, auctionEnded = false, requestCompleted = false, @@ -43,33 +40,45 @@ module.exports = function(bidManager, global, loader){ }); } - function load(bidParams, url, postData, callback){ - if(bidParams.method === "get"){ - loader(url, function(responseText, response){ - if(response.status === 200) - callback(200, "success", response.responseText); - else - callback(-1, "http error "+response.status, response.responseText); - }, false, {method:"GET", withCredentials: true}); - } - else{ - loader(url, function(responseText, response){ - if(response.status === 200) - callback(200, "success", response.responseText); - else - callback(-1, "http error "+response.status, response.responseText); - }, postData, {method:"POST", contentType: "application/json", withCredentials: true}); - } + function load(bidParams, url, callback){ + loader(url, function(responseText, response){ + if(response.status === 200) + callback(200, "success", response.responseText); + else + callback(-1, "http error "+response.status, response.responseText); + }, false, {method:"GET", withCredentials: true}); } + function flashInstalled(){ + var n = global.navigator, + p = n.plugins, + m = n.mimeTypes, + t = "application/x-shockwave-flash", + x = global.ActiveXObject; + + if(p && + p["Shockwave Flash"] && + m && + m[t] && + m[t].enabledPlugin) + return true; + + if(x){ + try{if((new global.ActiveXObject("ShockwaveFlash.ShockwaveFlash"))) return true;} + catch(e){} + } + + return false; + } + var bidderCode = "rhythmone", bidLostTimeout = null; - function setIfPresent(o, key, value){ + function attempt(valueFunction, defaultValue){ try{ - if(typeof value === "function") - o[key] = value(); + return valueFunction(); }catch(ex){} + return defaultValue; } function logToConsole(txt){ @@ -124,7 +133,7 @@ module.exports = function(bidManager, global, loader){ } } - function getRMPURL(bidParams, ortbJSON, bids){ + function getRMPURL(bidParams, bids){ var endpoint = "//tag.1rx.io/rmp/{placementId}/0/{path}?z={zone}", query = []; @@ -150,120 +159,77 @@ module.exports = function(bidManager, global, loader){ }); function p(k,v){ + if(v instanceof Array) + v = v.join(","); if(typeof v !== "undefined") query.push(encodeURIComponent(k)+"="+encodeURIComponent(v)); } + + p("domain", attempt(function(){ + var d = global.document.location.ancestorOrigins; + if(d && d.length > 0) + return d[d.length-1]; + return global.top.document.location.hostname; + },"")); + p("title", attempt(function(){return global.top.document.title;},"")); + p("url", attempt(function(){ + var l; + try{l = global.top.document.location.href.toString();} + catch(ex){l = global.document.location.href.toString();} + return l; + },"")); + p("dsh", (global.screen ? global.screen.height : "")); + p("dsw", (global.screen ? global.screen.width : "")); + p("tz", (new Date()).getTimezoneOffset()); + p("dtype", ((/(ios|ipod|ipad|iphone|android)/i).test(global.navigator.userAgent) ? 1 : ((/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(global.navigator.userAgent) ? 3 : 2))); + p("flash", (flashInstalled() ? 1 : 0)); - if(bidParams.method === "get"){ - - p("domain", ortbJSON.site.domain); - p("title", ortbJSON.site.name); - p("url", ortbJSON.site.page); - p("dsh", ortbJSON.device.h); - p("dsw", ortbJSON.device.w); - p("tz", (new Date()).getTimezoneOffset()); - p("dtype", ortbJSON.device.devicetype); + var placementCodes = [], + heights = [], + widths = [], + floors = [], + mediaTypes = [], + fat = /(^v|(\.0)+$)/gi, + i=0; + + p("hbv", global.$$PREBID_GLOBAL$$.version.replace(fat,"")+","+version.replace(fat,"")); + + for(; i 0 && typeof bids[i].sizes[0] === "number") + bids[i].sizes = [bids[i].sizes]; - for(var i = 0; i 0) - return d[d.length-1]; - return global.top.document.location.hostname; - }); - setIfPresent(o.site, "name", function(){return global.top.document.title;}); - - o.device.devicetype = ((/(ios|ipod|ipad|iphone|android)/i).test(global.navigator.userAgent) ? 1 : ((/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(global.navigator.userAgent) ? 3 : 2)); - - setIfPresent(o.device, "h", function(){return global.screen.height;}); - setIfPresent(o.device, "w", function(){return global.screen.width;}); - - for(var i = 0; i 0), true); + assert.equal((adResponse.ad === undefined || adResponse.ad.length > 0), true); assert.equal(adResponse.width, 300); assert.equal(adResponse.height, 250); assert.equal(adResponse.cpm, 1); @@ -54,7 +54,8 @@ describe('rhythmone adapter tests', function () { if(e.toLowerCase() === "auctionend") endEvent = f; if(e.toLowerCase() === "bidwon") wonEvent = f; }, - "getBidResponses":function(){return {"div-gpt-ad-1438287399331-0":{"bids":[{cpm:1,bidderCode:"rhythmone"},{cpm:2,bidderCode:"rhythmone"}]}};} + "getBidResponses":function(){return {"div-gpt-ad-1438287399331-0":{"bids":[{cpm:1,bidderCode:"rhythmone"},{cpm:2,bidderCode:"rhythmone"}]}};}, + "version": "v0.20.0-pre" } }, function(url, callback){ @@ -70,10 +71,11 @@ describe('rhythmone adapter tests', function () { "placementId":"xyz", "keywords":"", "categories":[], - "trace":true, - "method":"get", - "endpoint":"http://fakedomain.com" + "trace":true, + "method":"get", + "endpoint":"http://fakedomain.com" }, + "mediaType": "video", "placementCode":"div-gpt-ad-1438287399331-0", "sizes":[[300,250]] } From 0288b7687b4f2468468bde4d2a3135658b576b78 Mon Sep 17 00:00:00 2001 From: LifeStreet Date: Tue, 28 Mar 2017 02:15:19 +0200 Subject: [PATCH 12/38] Lifestreet adapter: ignore unnecessary events from creative. (#1054) * Ignore unnecessary events. * Fixed warning. --- src/adapters/lifestreet.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/adapters/lifestreet.js b/src/adapters/lifestreet.js index eceecb54608..a28b2da7e0c 100644 --- a/src/adapters/lifestreet.js +++ b/src/adapters/lifestreet.js @@ -92,12 +92,14 @@ const LifestreetAdapter = function LifestreetAdapter() { } catch (e) { return; } - if (object.message && object.message === PREBID_REQUEST_MESSAGE && object.slotName) { + if (object.message && object.message === PREBID_REQUEST_MESSAGE && object.slotName && + window.$$PREBID_GLOBAL$$[object.slotName]) { ev.source.postMessage(JSON.stringify({ message: PREBID_RESPONSE_MESSAGE, slotObject: window.$$PREBID_GLOBAL$$[object.slotName] }), '*'); window.$$PREBID_GLOBAL$$[object.slotName].destroy(); + window.$$PREBID_GLOBAL$$[object.slotName] = null; } }, false); } else { From 44bbdf9911675dd0e18be1a7d1c5edc4b02c7f4c Mon Sep 17 00:00:00 2001 From: protonate Date: Mon, 27 Mar 2017 20:44:03 -0700 Subject: [PATCH 13/38] Prebid 0.21.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 721061ba1e0..3ccd746942f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prebid.js", - "version": "0.21.0-pre", + "version": "0.21.0", "description": "Header Bidding Management Library", "main": "src/prebid.js", "scripts": { From 2262123d5912f152d35acc7264a4b626a724d3f0 Mon Sep 17 00:00:00 2001 From: Matt Kendall Date: Wed, 29 Mar 2017 07:38:32 -0400 Subject: [PATCH 14/38] update PR template to include link to dev docs page (#1075) --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fd757dce1f5..1dc04a9c2b7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,7 +6,7 @@ Thank you for your pull request. Please make sure this PR is scoped to one chang - [ ] Bugfix - [ ] Feature -- [ ] New bidder adapter +- [ ] New bidder adapter - [ ] Code style update (formatting, local variables) - [ ] Refactoring (no functional changes, no api changes) - [ ] Build related changes From 4b880ec487e63510f8439f0e3328c3faf9e3a8e6 Mon Sep 17 00:00:00 2001 From: Anand Venkatraman Date: Thu, 30 Mar 2017 16:39:49 -0400 Subject: [PATCH 15/38] Support for downloading Analytics Adapters via http://prebid.org/download.html (#1021) * ET-1691: Pulsepoint Analytics adapter for Prebid. (#1) * ET-1691: Adding pulsepoint analytics and tests for pulsepoint adapter * ET-1691: Adding pulsepoint analytics and tests for pulsepoint adapter * ET-1691: cleanup * ET-1691: minor * ET-1691: revert package.json change * Adding bidRequest to bidFactory.createBid method as per https://github.com/prebid/Prebid.js/issues/509 * ET-1765: Adding support for additional params in PulsePoint adapter (#2) * ET-1850: Fixing https://github.com/prebid/Prebid.js/issues/866 * Minor fix * Ability to specify Analytics adapters for build * minor * fixing broken tests * Removing all analytics adapters in the default file --- analytics.json | 1 + loaders/adapterLoader.js | 2 +- loaders/analyticsLoader.js | 3 ++- loaders/getAdapters.js | 8 +++----- package.json | 1 - test/spec/loaders/getAdapters_spec.js | 10 ++++++---- 6 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 analytics.json diff --git a/analytics.json b/analytics.json new file mode 100644 index 00000000000..0637a088a01 --- /dev/null +++ b/analytics.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/loaders/adapterLoader.js b/loaders/adapterLoader.js index c8750a61ff4..65c189584c2 100644 --- a/loaders/adapterLoader.js +++ b/loaders/adapterLoader.js @@ -8,7 +8,7 @@ const fs = require('fs'); const blockLoader = require('block-loader'); const getAdapters = require('./getAdapters'); -const adapters = getAdapters(); +const adapters = getAdapters('adapters.json', 'adapters'); const files = fs.readdirSync('src/adapters').map((file) => file.replace(/\.[^/.]+$/, '')); const adapterNames = adapters.filter(getStandardAdapters).filter(getUniques); //adapters loaded from `srcPath` diff --git a/loaders/analyticsLoader.js b/loaders/analyticsLoader.js index 38c7f2f6b86..7e76a2819d6 100644 --- a/loaders/analyticsLoader.js +++ b/loaders/analyticsLoader.js @@ -2,7 +2,8 @@ const fs = require('fs'); const blockLoader = require('block-loader'); -let analyticsAdapters = require('../package.json').analytics; +const getAdapters = require('./getAdapters'); +let analyticsAdapters = getAdapters('analytics.json', 'analyticsAdapters'); var options = { start: '/** INSERT ANALYTICS - DO NOT EDIT OR REMOVE */', diff --git a/loaders/getAdapters.js b/loaders/getAdapters.js index 1aeef7dde2e..b69a534fc7f 100644 --- a/loaders/getAdapters.js +++ b/loaders/getAdapters.js @@ -4,8 +4,6 @@ const fs = require('fs'); const path = require('path'); const argv = require('yargs').argv; -const defaultAdapters = 'adapters.json'; - function load(file) { try { const buffer = fs.readFileSync(file); @@ -15,8 +13,8 @@ function load(file) { } } -module.exports = function getAdapters() { - let customAdapters = argv.adapters; +module.exports = function getAdapters(defaultAdapters, argName) { + let customAdapters = argv[argName]; if (!customAdapters) { return load(defaultAdapters); @@ -29,7 +27,7 @@ module.exports = function getAdapters() { return load(customAdapters); } catch (e) { console.log(`Prebid Warning: custom adapters config cannot be loaded from ${customAdapters}, ` + - 'using default adapters.json'); + `using default ${defaultAdapters}`); return load(defaultAdapters); } }; diff --git a/package.json b/package.json index 3ccd746942f..926d3270068 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "prebid" ], "globalVarName": "pbjs", - "analytics": [], "author": "the prebid.js contributors", "license": "Apache-2.0", "devDependencies": { diff --git a/test/spec/loaders/getAdapters_spec.js b/test/spec/loaders/getAdapters_spec.js index 93d8e4ad69a..3cb6a4db74a 100644 --- a/test/spec/loaders/getAdapters_spec.js +++ b/test/spec/loaders/getAdapters_spec.js @@ -10,6 +10,8 @@ describe('loaders/getAdapters', () => { let defaultAdapters; let customAdapters; + const defaultAdaptersFile = 'adapters.json'; + const adaptersArg = 'adapters'; beforeEach(() => { defaultAdapters = [ 'adapter 1', 'adapter 2', 'adapter 3' ]; @@ -32,7 +34,7 @@ describe('loaders/getAdapters', () => { const getAdapters = proxyquire('../../../loaders/getAdapters', { yargs: { argv: { adapters: 'custom-adapters.json' } } }); - expect(getAdapters()).to.deep.equal(customAdapters); + expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal(customAdapters); }); }); @@ -51,7 +53,7 @@ describe('loaders/getAdapters', () => { const getAdapters = proxyquire('../../../loaders/getAdapters', { yargs: { argv: { adapters: 'non-existent-adapters.json' } } }); - expect(getAdapters()).to.deep.equal(defaultAdapters); + expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal(defaultAdapters); expect(log).to.match(/non-existent-adapters.json/); console.log = consoleLog; }); @@ -69,7 +71,7 @@ describe('loaders/getAdapters', () => { const getAdapters = proxyquire('../../../loaders/getAdapters', { yargs: { argv: {} } }); - expect(getAdapters()).to.deep.equal(defaultAdapters); + expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal(defaultAdapters); }); }); @@ -83,7 +85,7 @@ describe('loaders/getAdapters', () => { const getAdapters = proxyquire('../../../loaders/getAdapters', { yargs: { argv: {} } }); - expect(getAdapters()).to.deep.equal([]); + expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal([]); }); }); From 5c2de1e1c07954b1c9d9fd150ccbb5d96ceca99c Mon Sep 17 00:00:00 2001 From: mctaggaj Date: Thu, 30 Mar 2017 17:04:26 -0400 Subject: [PATCH 16/38] Reset the list of slots to be requested between each action for pubmatic (#1079) --- src/adapters/pubmatic.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/adapters/pubmatic.js b/src/adapters/pubmatic.js index c039c4eac7a..3f0a54be2cb 100644 --- a/src/adapters/pubmatic.js +++ b/src/adapters/pubmatic.js @@ -17,6 +17,7 @@ var PubmaticAdapter = function PubmaticAdapter() { function _callBids(params) { bids = params.bids; + _pm_optimize_adslots = []; for (var i = 0; i < bids.length; i++) { var bid = bids[i]; //bidmanager.pbCallbackMap['' + bid.params.adSlot] = bid; From f8ee3b209a7ec927492f1c3069553d645a1fbca0 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Thu, 30 Mar 2017 17:32:59 -0400 Subject: [PATCH 17/38] Pass through params to server (#1084) --- src/adapters/mantis.js | 1 + test/spec/adapters/mantis_spec.js | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/adapters/mantis.js b/src/adapters/mantis.js index 5b4b17f1638..6ca3faa0bca 100644 --- a/src/adapters/mantis.js +++ b/src/adapters/mantis.js @@ -206,6 +206,7 @@ module.exports = function () { bids: params.bids.map(function (bid) { return { bidId: bid.bidId, + config: bid.params, sizes: bid.sizes.map(function (size) { return {width: size[0], height: size[1]}; }) diff --git a/test/spec/adapters/mantis_spec.js b/test/spec/adapters/mantis_spec.js index 616dbcdc0d4..1ed6ea089e8 100644 --- a/test/spec/adapters/mantis_spec.js +++ b/test/spec/adapters/mantis_spec.js @@ -33,7 +33,8 @@ describe('mantis adapter tests', function () { placementCode: 'foo', sizes: [[728, 90]], params: { - property: '1234' + property: '1234', + zoneId: 'zone1' } }, { @@ -42,7 +43,8 @@ describe('mantis adapter tests', function () { placementCode: 'bar', sizes: [[300, 600], [300, 250]], params: { - property: '1234' + property: '1234', + zoneId: 'zone2' } } ] @@ -103,11 +105,13 @@ describe('mantis adapter tests', function () { expect(serverCall).to.string('bids[0][bidId]=bidId1&'); expect(serverCall).to.string('bids[0][sizes][0][width]=728&'); expect(serverCall).to.string('bids[0][sizes][0][height]=90&'); + expect(serverCall).to.string('bids[0][config][zoneId]=zone1&'); expect(serverCall).to.string('bids[1][bidId]=bidId2&'); expect(serverCall).to.string('bids[1][sizes][0][width]=300&'); expect(serverCall).to.string('bids[1][sizes][0][height]=600&'); expect(serverCall).to.string('bids[1][sizes][1][width]=300&'); expect(serverCall).to.string('bids[1][sizes][1][height]=250&'); + expect(serverCall).to.string('bids[1][config][zoneId]=zone2&'); expect(serverCall).to.string('version=1'); }); From 51311fd34e3b8682d56a299cc21767912044a39a Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 30 Mar 2017 15:42:22 -0600 Subject: [PATCH 18/38] Updated rubicon video bid endpoint in source and test files (#1097) --- src/adapters/rubicon.js | 2 +- test/spec/adapters/rubicon_spec.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/adapters/rubicon.js b/src/adapters/rubicon.js index 222cd246e3a..1a39fc17086 100644 --- a/src/adapters/rubicon.js +++ b/src/adapters/rubicon.js @@ -14,7 +14,7 @@ function getIntegration() { // use protocol relative urls for http or https const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.json'; -const VIDEO_ENDPOINT = '//optimized-by-adv.rubiconproject.com/v1/auction/video'; +const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; const TIMEOUT_BUFFER = 500; diff --git a/test/spec/adapters/rubicon_spec.js b/test/spec/adapters/rubicon_spec.js index 9dd7dfa80e7..1a51f5217f6 100644 --- a/test/spec/adapters/rubicon_spec.js +++ b/test/spec/adapters/rubicon_spec.js @@ -326,7 +326,7 @@ describe('the rubicon adapter', () => { let url = request.url; let post = JSON.parse(request.requestBody); - expect(url).to.equal('//optimized-by-adv.rubiconproject.com/v1/auction/video'); + expect(url).to.equal('//fastlane-adv.rubiconproject.com/v1/auction/video'); expect(post).to.have.property('page_url').that.is.a('string'); expect(post.resolution).to.match(/\d+x\d+/); @@ -659,7 +659,7 @@ describe('the rubicon adapter', () => { 'site_id': 88888, 'zone_id': 54321, 'creative_type': 'video', - 'creative_depot_url': 'https://optimized-by-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml', + 'creative_depot_url': 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml', 'ad_id': 999999, 'size_id': 201, 'advertiser': 12345 @@ -684,7 +684,7 @@ describe('the rubicon adapter', () => { expect(bids[0].cpm).to.equal(1); expect(bids[0].descriptionUrl).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); expect(bids[0].vastUrl).to.equal( - 'https://optimized-by-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml' + 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml' ); expect(bids[0].impression_id).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); From 938d00dbc4f3423b5b0688a9ef119442b76b8a6a Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Fri, 31 Mar 2017 06:05:35 +0800 Subject: [PATCH 19/38] Add Atomx support (#1056) --- adapters.json | 1 + integrationExamples/gpt/pbjs_example_gpt.html | 6 + src/adapters/atomx.js | 75 +++++++++ test/spec/adapters/atomx_spec.js | 151 ++++++++++++++++++ 4 files changed, 233 insertions(+) create mode 100644 src/adapters/atomx.js create mode 100644 test/spec/adapters/atomx_spec.js diff --git a/adapters.json b/adapters.json index fceef8688d7..eaf03c0119e 100644 --- a/adapters.json +++ b/adapters.json @@ -56,6 +56,7 @@ "vertoz", "widespace", "admixer", + "atomx", "tapsense", { "appnexus": { diff --git a/integrationExamples/gpt/pbjs_example_gpt.html b/integrationExamples/gpt/pbjs_example_gpt.html index 19f4e6cc8a0..5f3b25e1303 100644 --- a/integrationExamples/gpt/pbjs_example_gpt.html +++ b/integrationExamples/gpt/pbjs_example_gpt.html @@ -249,6 +249,12 @@ params: { zone: '2eb6bd58-865c-47ce-af7f-a918108c3fd2' // REQUIRED zone oid } + }, + { + bidder: 'atomx', + params: { + id: 7395 + } } ] }, { diff --git a/src/adapters/atomx.js b/src/adapters/atomx.js new file mode 100644 index 00000000000..4935382123a --- /dev/null +++ b/src/adapters/atomx.js @@ -0,0 +1,75 @@ +var CONSTANTS = require('../constants.json'); +var bidfactory = require('../bidfactory.js'); +var bidmanager = require('../bidmanager.js'); +var adloader = require('src/adloader.js'); +var Ajax = require('../ajax'); +var utils = require('../utils.js'); + +/** + * Adapter for requesting bids from Atomx. + * + * @returns {{callBids: _callBids, responseCallback: _responseCallback}} + */ +var AtomxAdapter = function AtomxAdapter() { + function _callBids(data) { + if (!window.atomx_prebid) { + adloader.loadScript(window.location.protocol + '//s.ato.mx/b.js', function() { _bid(data); }, true); + } else { + _bid(data); + } + } + + function _bid(data) { + var url = window.atomx_prebid(); + var bids = data.bids || []; + for (var i = 0, ln = bids.length; i < ln; i++) { + var bid = bids[i]; + if (bid.params && bid.params.id) { + Ajax.ajax(url, _responseCallback.bind(this, bid), { + id: bid.params.id, + size: utils.parseSizesInput(bid.sizes)[0], + prebid: bid.placementCode + }, {method: 'GET'}); + } else { + var bidObject = bidfactory.createBid(CONSTANTS.STATUS.NO_BID, bid); + bidObject.bidderCode = 'atomx'; + bidmanager.addBidResponse(bid.placementCode, bidObject); + } + } + } + + function _responseCallback(bid, data) { + var bidObject; + try { + data = JSON.parse(data); + + if (data.cpm && data.cpm > 0) { + bidObject = bidfactory.createBid(CONSTANTS.STATUS.GOOD, bid); + bidObject.bidderCode = 'atomx'; + bidObject.cpm = data.cpm * 1000; + if (data.adm) { + bidObject.ad = data.adm; + } else { + bidObject.adUrl = data.url; + } + bidObject.width = data.width; + bidObject.height = data.height; + bidmanager.addBidResponse(bid.placementCode, bidObject); + return; + } + } catch (_error) { + utils.logError(_error); + } + + bidObject = bidfactory.createBid(CONSTANTS.STATUS.NO_BID, bid); + bidObject.bidderCode = 'atomx'; + bidmanager.addBidResponse(bid.placementCode, bidObject); + } + + return { + callBids: _callBids, + responseCallback: _responseCallback + }; +}; + +module.exports = AtomxAdapter; diff --git a/test/spec/adapters/atomx_spec.js b/test/spec/adapters/atomx_spec.js new file mode 100644 index 00000000000..fb4bdc83f1b --- /dev/null +++ b/test/spec/adapters/atomx_spec.js @@ -0,0 +1,151 @@ +window.pbjs = window.pbjs || {}; +var chai = require('chai'); +var Adapter = require('src/adapters/atomx')(); +var Ajax = require('src/ajax'); +var adLoader = require('src/adloader'); +var bidmanager = require('src/bidmanager.js'); +var CONSTANTS = require('src/constants.json'); + +describe('Atomx adapter', function () { + var validData_1 = { + bids: [ + { + bidder: 'atomx', + bidId: 'bid_id', + params: {id: 1234}, + placementCode: 'ad-unit-1', + sizes: [[300, 250],[800, 600]] + } + ] + }; + var validData_2 = { + bids: [ + { + bidder: 'adtomx', + bidId: 'bid_id', + params: {id: 5678}, + placementCode: 'ad-unit-1', + sizes: [300, 250] + } + ] + }; + + var invalidData = { + bids: [ + { + bidder: 'atomx', + bidId: 'bid_id', + params: {}, + placementCode: 'ad-unit-1', + sizes: [[300, 250]] + } + ] + }; + + var responseWithAd = JSON.stringify({ + 'cpm': 2.2, + 'url': 'http://p.ato.mx/placement?id=1234', + 'width': 300, + 'height': 250, + 'code': 'ad-unit-1' + }); + var responseWithoutAd = JSON.stringify({ + 'cpm': 0, + 'url': 'http://p.ato.mx/placement?id=1234', + 'width': 300, + 'height': 250, + 'code': 'ad-unit-1' + }); + + var responseEmpty = ''; + var validJsonParams = { + id: '1234', + prebid: 'ad-unit-1', + size: '300x250' + }; + + describe('loads the tag code', function() { + var stubLoadScript = sinon.stub(adLoader, "loadScript"); + Adapter.callBids(validData_1); + sinon.assert.calledOnce(stubLoadScript); + let url = stubLoadScript.firstCall.args[0]; + let callback = stubLoadScript.firstCall.args[1]; + expect(url).to.equal('http://s.ato.mx/b.js'); + expect(callback).to.be.a('function'); + }); + describe('bid request with valid data', function () { + var stubAjax; + beforeEach(function () { + window.atomx_prebid = function() { + return '/placement'; + }; + stubAjax = sinon.stub(Ajax, 'ajax'); + }); + afterEach(function () { + stubAjax.restore(); + }); + it('bid request should be called. sizes style -> [[],[]]', function () { + Adapter.callBids(validData_1); + sinon.assert.calledOnce(stubAjax); + }); + it('bid request should be called. sizes style -> []', function () { + Adapter.callBids(validData_2); + sinon.assert.calledOnce(stubAjax); + }); + it('ajax params should be matched', function () { + Adapter.callBids(validData_1); + sinon.assert.calledWith(stubAjax, sinon.match('/placement', function () { + }, validJsonParams, {method: "GET"})); + }); + }); + describe('bid request with invalid data', function () { + var addBidResponse, stubAjax; + beforeEach(function () { + window.atomx_prebid = function() { + return '/placement'; + }; + addBidResponse = sinon.stub(bidmanager, 'addBidResponse'); + stubAjax = sinon.stub(Ajax, 'ajax'); + }); + afterEach(function () { + addBidResponse.restore(); + stubAjax.restore(); + }); + it('ajax shouldn\'t be called', function () { + Adapter.callBids(invalidData); + sinon.assert.notCalled(stubAjax); + }); + it('bidmanager.addBidResponse status code must to be equal "' + CONSTANTS.STATUS.NO_BID + '"', function () { + Adapter.callBids(invalidData); + expect(addBidResponse.firstCall.args[1].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + expect(addBidResponse.firstCall.args[1].bidderCode).to.equal('atomx'); + }); + }); + describe('bid response', function () { + var addBidResponse; + beforeEach(function () { + addBidResponse = sinon.stub(bidmanager, 'addBidResponse'); + }); + afterEach(function () { + addBidResponse.restore(); + }); + it('with ad. bidmanager.addBidResponse status code must to be equal "' + CONSTANTS.STATUS.GOOD + '"', function () { + Adapter.responseCallback(validData_1.bids[0], responseWithAd); + var arg = addBidResponse.firstCall.args[1]; + expect(arg.getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); + expect(arg.bidderCode).to.equal('atomx'); + }); + it('without ad. bidmanager.addBidResponse status code must to be equal "' + CONSTANTS.STATUS.NO_BID, function () { + Adapter.responseCallback(validData_1.bids[0], responseWithoutAd); + var arg = addBidResponse.firstCall.args[1]; + expect(arg.getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + expect(arg.bidderCode).to.equal('atomx'); + }); + it('empty. bidmanager.addBidResponse status code must to be equal "' + CONSTANTS.STATUS.NO_BID, function () { + Adapter.responseCallback(validData_1.bids[0], responseEmpty); + var arg = addBidResponse.firstCall.args[1]; + expect(arg.getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + expect(arg.bidderCode).to.equal('atomx'); + }) + }); +}); From 203fcb33965065dc53f8b7e8d2993bb0230a530c Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Mon, 3 Apr 2017 15:50:17 +0100 Subject: [PATCH 20/38] Add Facebook Audience Network adapter (#1068) --- adapters.json | 1 + .../gpt/audienceNetwork_dfp.html | 83 +++++ src/adapters/audienceNetwork.js | 208 +++++++++++ test/spec/adapters/audienceNetwork_spec.js | 333 ++++++++++++++++++ 4 files changed, 625 insertions(+) create mode 100644 integrationExamples/gpt/audienceNetwork_dfp.html create mode 100644 src/adapters/audienceNetwork.js create mode 100644 test/spec/adapters/audienceNetwork_spec.js diff --git a/adapters.json b/adapters.json index eaf03c0119e..a704b734768 100644 --- a/adapters.json +++ b/adapters.json @@ -12,6 +12,7 @@ "aol", "appnexus", "appnexusAst", + "audienceNetwork", "conversant", "districtmDMX", "fidelity", diff --git a/integrationExamples/gpt/audienceNetwork_dfp.html b/integrationExamples/gpt/audienceNetwork_dfp.html new file mode 100644 index 00000000000..b30df31b276 --- /dev/null +++ b/integrationExamples/gpt/audienceNetwork_dfp.html @@ -0,0 +1,83 @@ + + + + + + +

Prebid.js Test

+
+ +
+
+

Audience Network quick start

+
    +
  1. Create a new App at https://developers.facebook.com/apps
  2. +
  3. Add the Audience Network product to it
  4. +
  5. Create a new Placement to generate your placementId
  6. +
  7. To test, ensure the User-Agent request header represents a mobile device
  8. +
+
+ + diff --git a/src/adapters/audienceNetwork.js b/src/adapters/audienceNetwork.js new file mode 100644 index 00000000000..8ab96430491 --- /dev/null +++ b/src/adapters/audienceNetwork.js @@ -0,0 +1,208 @@ +/** + * @file AudienceNetwork adapter. + */ +import { ajax } from '../ajax'; +import { createBid } from '../bidfactory'; +import { addBidResponse } from '../bidmanager'; +import { STATUS } from '../constants.json'; +import { format } from '../url'; +import { logError } from '../utils'; +import { createNew } from './adapter'; + +const baseAdapter = createNew('audienceNetwork'); +const setBidderCode = baseAdapter.setBidderCode; +const getBidderCode = baseAdapter.getBidderCode; + +/** + * Does this bid request contain valid parameters? + * @param {Object} bid + * @returns {Boolean} + */ +const validateBidRequest = bid => + typeof bid.params === 'object' && + typeof bid.params.placementId === 'string' && + bid.params.placementId.length > 0 && + Array.isArray(bid.sizes) && bid.sizes.length > 0; + +/** + * Does this bid request contain valid sizes? + * @param {Object} bid + * @returns {Boolean} + */ +const validateBidRequestSizes = bid => { + bid.sizes = bid.sizes.map(flattenSize); + return bid.sizes.every( size => + ['native', 'fullwidth', '300x250', '320x50'].includes(size) ); +}; + +/** + * Flattens a 2-element [W, H] array as a 'WxH' string, + * otherwise passes value through. + * @params {Array|String} size + * @returns {String} + */ +const flattenSize = size => + (Array.isArray(size) && size.length === 2) ? `${size[0]}x${size[1]}` : size; + +/** + * Does the search part of the URL contain "anhb_testmode" + * and therefore indicate testmode should be used? + * @returns {String} "true" or "false" + */ +const isTestmode = () => Boolean( + window && window.location && + typeof window.location.search === 'string' && + window.location.search.indexOf('anhb_testmode') !== -1 +).toString(); + +/** + * Parse JSON-as-string into an Object, default to empty. + * @param {String} JSON-as-string + * @returns {Object} + */ +const parseJson = jsonAsString => { + let data = {}; + try { + data = JSON.parse(jsonAsString); + } catch (err) {} + return data; +}; + +/** + * Is this a native advert size? + * @param {String} size + * @returns {Boolean} + */ +const isNative = (size) => ['native', 'fullwidth'].includes(size); + +/** + * Generate ad HTML for injection into an iframe + * @param {String} placementId + * @param {String} size + * @param {String} bidId + * @returns {String} HTML + */ +const createAdHtml = (placementId, size, bidId) => { + const nativeStyle = isNative(size) ? '' : ''; + const nativeContainer = isNative(size) ? '
' : ''; + return `${nativeStyle}
+ +${nativeContainer}
`; +}; + +/** + * Creates a "good" Bid object with the given bid ID and CPM. + * @param {String} placementId + * @param {String} bidId + * @param {String} size + * @param {Number} cpmCents + * @returns {Object} Bid + */ +const createSuccessBidResponse = (placementId, size, bidId, cpmCents) => { + const bid = createBid(STATUS.GOOD, { bidId }); + // Prebid attributes + bid.bidderCode = getBidderCode(); + bid.cpm = cpmCents / 100; + bid.ad = createAdHtml(placementId, size, bidId); + if (!isNative(size)) { + [bid.width, bid.height] = size.split('x').map(Number); + } + // Audience Network attributes + bid.hb_bidder = 'fan'; + bid.fb_bidid = bidId; + bid.fb_format = size; + bid.fb_placementid = placementId; + return bid; +}; + +/** + * Creates a "no bid" Bid object. + * @returns {Object} Bid + */ +const createFailureBidResponse = () => { + const bid = createBid(STATUS.NO_BID); + bid.bidderCode = getBidderCode(); + return bid; +}; + +/** + * Fetch bids for given parameters. + * @param {Object} bidRequest + * @param {Array} params.bids - list of bids + * @param {String} params.bids[].placementCode - Prebid placement identifier + * @param {Object} params.bids[].params + * @param {String} params.bids[].params.placementId - Audience Network placement identifier + * @param {Array} params.bids[].sizes - list of accepted advert sizes + * @param {Array|String} params.bids[].sizes[] - one of 'native', '300x250', '300x50', [300, 250], [300, 50] + * @returns {void} + */ +const callBids = bidRequest => { + // Build lists of adUnitCodes, placementids and adformats + const adUnitCodes = []; + const placementids = []; + const adformats = []; + bidRequest.bids + .filter(validateBidRequest) + .filter(validateBidRequestSizes) + .forEach( bid => bid.sizes.forEach( size => { + adUnitCodes.push(bid.placementCode); + placementids.push(bid.params.placementId); + adformats.push(size); + })); + + if (placementids.length) { + // Build URL + const testmode = isTestmode(); + const url = format({ + protocol: 'https', + host: 'an.facebook.com', + pathname: '/v2/placementbid.json', + search: { + sdk: '5.5.web', + testmode, + placementids, + adformats + } + }); + // Request + ajax(url, res => { + // Handle response + const data = parseJson(res); + if (data.errors && data.errors.length) { + const noBid = createFailureBidResponse(); + adUnitCodes.forEach( adUnitCode => addBidResponse(adUnitCode, noBid) ); + data.errors.forEach(logError); + } else { + // For each placementId in bids Object + Object.keys(data.bids) + // extract Array of bid responses + .map( placementId => data.bids[placementId] ) + // flatten + .reduce( (a, b) => a.concat(b), [] ) + // call addBidResponse + .forEach( (bid, i) => + addBidResponse(adUnitCodes[i], createSuccessBidResponse( + bid.placement_id, adformats[i], bid.bid_id, bid.bid_price_cents + )) + ); + } + }, null, { withCredentials: true }); + } else { + // No valid bids + logError('No valid bids requested'); + } +}; + +/** + * @class AudienceNetwork + * @type {Object} + * @property {Function} callBids - fetch bids for given parameters + * @property {Function} setBidderCode - used for bidder aliasing + * @property {Function} getBidderCode - unique 'audienceNetwork' identifier + */ +const AudienceNetwork = () => { + return { callBids, setBidderCode, getBidderCode }; +}; +module.exports = AudienceNetwork; diff --git a/test/spec/adapters/audienceNetwork_spec.js b/test/spec/adapters/audienceNetwork_spec.js new file mode 100644 index 00000000000..09553b80305 --- /dev/null +++ b/test/spec/adapters/audienceNetwork_spec.js @@ -0,0 +1,333 @@ +/** + * @file Tests for AudienceNetwork adapter. + */ +import { expect } from 'chai'; + +import bidmanager from 'src/bidmanager'; +import { STATUS } from 'src/constants.json'; +import * as utils from 'src/utils'; + +import AudienceNetwork from 'src/adapters/audienceNetwork'; + +const bidderCode = 'audienceNetwork'; +const placementId = 'test-placement-id'; +const placementCode = '/test/placement/code'; + +/** + * Expect haystack string to contain needle n times. + * @param {String} haystack + * @param {String} needle + * @param {String} [n=1] + * @throws {Error} + */ +const expectToContain = (haystack, needle, n = 1) => + expect(haystack.split(needle)).to.have.lengthOf(n + 1, + `expected ${n} occurrence(s) of '${needle}' in '${haystack}'`); + + +describe('AudienceNetwork adapter', () => { + + describe('Public API', () => { + const adapter = AudienceNetwork(); + it('getBidderCode', () => { + expect(adapter.getBidderCode).to.be.a('function'); + expect(adapter.getBidderCode()).to.equal(bidderCode); + }); + it('setBidderCode', () => { + expect(adapter.setBidderCode).to.be.a('function'); + }); + it('callBids', () => { + expect(adapter.setBidderCode).to.be.a('function'); + }); + }); + + describe('callBids parameter parsing', () => { + + let xhr; + let requests; + let addBidResponse; + let logError; + + beforeEach(() => { + xhr = sinon.useFakeXMLHttpRequest(); + xhr.onCreate = request => requests.push(request); + requests = []; + addBidResponse = sinon.stub(bidmanager, 'addBidResponse'); + logError = sinon.stub(utils, 'logError'); + }); + + afterEach(() => { + xhr.restore(); + bidmanager.addBidResponse.restore(); + utils.logError.restore(); + }); + + it('missing placementId parameter', () => { + // Invalid parameters + const params = { + bidderCode, + bids: [{ + bidder: bidderCode, + sizes: ['native'] + }] + }; + // Request bids + AudienceNetwork().callBids(params); + // Verify no attempt to fetch response + expect(requests).to.have.lengthOf(0); + // Verify no attempt to add a response as no placement was provided + expect(addBidResponse.calledOnce).to.equal(false); + // Verify attempt to log error + expect(logError.calledOnce).to.equal(true); + }); + + it('invalid sizes parameter', () => { + // Invalid parameters + const params = { + bidderCode, + bids: [{ + bidder: bidderCode, + params: { placementId }, + sizes: ['', undefined, null, '300x100', [300, 100], [300], {}] + }] + }; + // Request bids + AudienceNetwork().callBids(params); + // Verify no attempt to fetch response + expect(requests).to.have.lengthOf(0); + // Verify attempt to log error + expect(logError.calledOnce).to.equal(true); + }); + + it('valid parameters', () => { + // Valid parameters + const params = { + bidderCode, + bids: [{ + bidder: bidderCode, + params: { placementId }, + sizes: [[320, 50], [300, 250], '300x250', 'fullwidth', '320x50', 'native'] + }] + }; + // Request bids + AudienceNetwork().callBids(params); + // Verify attempt to fetch response + expect(requests).to.have.lengthOf(1); + expect(requests[0].method).to.equal('GET'); + expectToContain(requests[0].url, 'https://an.facebook.com/v2/placementbid.json?'); + expectToContain(requests[0].url, 'placementids[]=test-placement-id', 6); + expectToContain(requests[0].url, 'adformats[]=320x50', 2); + expectToContain(requests[0].url, 'adformats[]=300x250', 2); + expectToContain(requests[0].url, 'adformats[]=fullwidth'); + expectToContain(requests[0].url, 'adformats[]=native'); + // Verify no attempt to log error + expect(logError.called).to.equal(false); + }); + + }); + + describe('callBids response handling', () => { + + let server; + let addBidResponse; + let logError; + + beforeEach( () => { + server = sinon.fakeServer.create(); + addBidResponse = sinon.stub(bidmanager, 'addBidResponse'); + logError = sinon.stub(utils, 'logError'); + }); + + afterEach( () => { + server.restore(); + bidmanager.addBidResponse.restore(); + utils.logError.restore(); + }); + + it('error in response', () => { + // Error response + const error = 'test-error-message'; + server.respondWith(JSON.stringify({ + errors: [error] + })); + // Request bids + AudienceNetwork().callBids({ + bidderCode, + bids: [{ + bidder: bidderCode, + params: { placementId }, + sizes: ['native'] + }] + }); + server.respond(); + // Verify attempt to call addBidResponse + expect(addBidResponse.calledOnce).to.equal(true); + expect(addBidResponse.args[0]).to.have.lengthOf(2); + expect(addBidResponse.args[0][1].getStatusCode()).to.equal(STATUS.NO_BID); + expect(addBidResponse.args[0][1].bidderCode).to.equal(bidderCode); + // Verify attempt to log error + expect(logError.calledOnce).to.equal(true); + expect(logError.calledWith(error)).to.equal(true); + }); + + it('valid native bid in response', () => { + // Valid response + server.respondWith(JSON.stringify({ + errors: [], + bids: { + [placementId]: [{ + placement_id: placementId, + bid_id: 'test-bid-id', + bid_price_cents: 123, + bid_price_currency: 'usd', + bid_price_model: 'cpm' + }] + } + })); + // Request bids + AudienceNetwork().callBids({ + bidderCode, + bids: [{ + bidder: bidderCode, + placementCode, + params: { placementId }, + sizes: ['native'] + }] + }); + server.respond(); + // Verify attempt to call addBidResponse + expect(addBidResponse.calledOnce).to.equal(true); + expect(addBidResponse.args[0]).to.have.lengthOf(2); + expect(addBidResponse.args[0][0]).to.equal(placementCode); + // Verify Prebid attributes in bid response + const bidResponse = addBidResponse.args[0][1]; + expect(bidResponse.getStatusCode()).to.equal(STATUS.GOOD); + expect(bidResponse.cpm).to.equal(1.23); + expect(bidResponse.bidderCode).to.equal(bidderCode); + expect(bidResponse.width).to.equal(0); + expect(bidResponse.height).to.equal(0); + expect(bidResponse.ad).to.contain(`placementid:'${placementId}',format:'native',bidid:'test-bid-id'`, 'ad missing parameters'); + expect(bidResponse.ad).to.contain('getElementsByTagName("style")', 'ad missing native styles'); + expect(bidResponse.ad).to.contain('
', 'ad missing native container'); + // Verify Audience Network attributes in bid response + expect(bidResponse.hb_bidder).to.equal('fan'); + expect(bidResponse.fb_bidid).to.equal('test-bid-id'); + expect(bidResponse.fb_format).to.equal('native'); + expect(bidResponse.fb_placementid).to.equal(placementId); + // Verify no attempt to log error + expect(logError.called).to.equal(false, 'logError called'); + }); + + it('valid IAB bid in response', () => { + // Valid response + server.respondWith(JSON.stringify({ + errors: [], + bids: { + [placementId]: [{ + placement_id: placementId, + bid_id: 'test-bid-id', + bid_price_cents: 123, + bid_price_currency: 'usd', + bid_price_model: 'cpm' + }] + } + })); + // Request bids + AudienceNetwork().callBids({ + bidderCode, + bids: [{ + bidder: bidderCode, + placementCode, + params: { placementId }, + sizes: ['300x250'] + }] + }); + server.respond(); + // Verify attempt to call addBidResponse + expect(addBidResponse.calledOnce).to.equal(true); + expect(addBidResponse.args[0]).to.have.lengthOf(2); + expect(addBidResponse.args[0][0]).to.equal(placementCode); + // Verify bidResponse Object + const bidResponse = addBidResponse.args[0][1]; + expect(bidResponse.getStatusCode()).to.equal(STATUS.GOOD); + expect(bidResponse.cpm).to.equal(1.23); + expect(bidResponse.bidderCode).to.equal(bidderCode); + expect(bidResponse.width).to.equal(300); + expect(bidResponse.height).to.equal(250); + expect(bidResponse.ad).to.contain(`placementid:'${placementId}',format:'300x250',bidid:'test-bid-id'`, 'ad missing parameters'); + expect(bidResponse.ad).not.to.contain('getElementsByTagName("style")', 'ad should not contain native styles'); + expect(bidResponse.ad).not.to.contain('
', 'ad should not contain native container'); + // Verify no attempt to log error + expect(logError.called).to.equal(false, 'logError called'); + }); + + it('valid multiple bids in response', () => { + const placementIdNative = 'test-placement-id-native'; + const placementIdIab = 'test-placement-id-iab'; + const placementCodeNative = 'test-placement-code-native'; + const placementCodeIab = 'test-placement-code-iab'; + // Valid response + server.respondWith(JSON.stringify({ + errors: [], + bids: { + [placementIdNative]: [{ + placement_id: placementIdNative, + bid_id: 'test-bid-id-native', + bid_price_cents: 123, + bid_price_currency: 'usd', + bid_price_model: 'cpm' + }], + [placementIdIab]: [{ + placement_id: placementIdIab, + bid_id: 'test-bid-id-iab', + bid_price_cents: 456, + bid_price_currency: 'usd', + bid_price_model: 'cpm' + }] + } + })); + // Request bids + AudienceNetwork().callBids({ + bidderCode, + bids: [{ + bidder: bidderCode, + placementCode: placementCodeNative, + params: { placementId: placementIdNative }, + sizes: ['native'] + }, { + bidder: bidderCode, + placementCode: placementCodeIab, + params: { placementId: placementIdIab }, + sizes: ['300x250'] + }] + }); + server.respond(); + // Verify multiple attempts to call addBidResponse + expect(addBidResponse.calledTwice).to.equal(true); + // Verify native + const addBidResponseNativeCall = addBidResponse.args[0]; + expect(addBidResponseNativeCall).to.have.lengthOf(2); + expect(addBidResponseNativeCall[0]).to.equal(placementCodeNative); + expect(addBidResponseNativeCall[1].getStatusCode()).to.equal(STATUS.GOOD); + expect(addBidResponseNativeCall[1].cpm).to.equal(1.23); + expect(addBidResponseNativeCall[1].bidderCode).to.equal(bidderCode); + expect(addBidResponseNativeCall[1].width).to.equal(0); + expect(addBidResponseNativeCall[1].height).to.equal(0); + expect(addBidResponseNativeCall[1].ad).to.contain(`placementid:'${placementIdNative}',format:'native',bidid:'test-bid-id-native'`, 'ad missing parameters'); + // Verify IAB + const addBidResponseIabCall = addBidResponse.args[1]; + expect(addBidResponseIabCall).to.have.lengthOf(2); + expect(addBidResponseIabCall[0]).to.equal(placementCodeIab); + expect(addBidResponseIabCall[1].getStatusCode()).to.equal(STATUS.GOOD); + expect(addBidResponseIabCall[1].cpm).to.equal(4.56); + expect(addBidResponseIabCall[1].bidderCode).to.equal(bidderCode); + expect(addBidResponseIabCall[1].width).to.equal(300); + expect(addBidResponseIabCall[1].height).to.equal(250); + expect(addBidResponseIabCall[1].ad).to.contain(`placementid:'${placementIdIab}',format:'300x250',bidid:'test-bid-id-iab'`, 'ad missing parameters'); + // Verify no attempt to log error + expect(logError.called).to.equal(false, 'logError called'); + }); + + }); + +}); From b61e01a8ae90fa13d66d06a6d437a9651ddc1603 Mon Sep 17 00:00:00 2001 From: guillaume-sticky Date: Mon, 3 Apr 2017 21:28:43 +0200 Subject: [PATCH 21/38] Add alias freewheel-ssp to stickyadstv bidder adapter (#1043) * add stickyadsTV bidder adapter * init unit test file * ad some unit tests * fix unit test on ad format with parameters * add some unit tests * add unit tests on getBid method * add some test cases in unit tests * minor fix on component id tag. * remove adapters-sticky.json test file * use top most accessible window instead of window.top * Pass in the bid request in the createBid call. * use top most accessible window instead of window.top * add unit tests * update unit tests * fix unit test. * fix CI build * add alias freewheel-ssp * update unit tests on bidderCode value --- adapters.json | 5 +++++ src/adapters/stickyadstv.js | 19 ++++++++++++------- test/spec/adapters/stickyadstv_spec.js | 3 --- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/adapters.json b/adapters.json index a704b734768..64eacabae29 100644 --- a/adapters.json +++ b/adapters.json @@ -119,6 +119,11 @@ "supportedMediaTypes" : ["video"] } }, + { + "stickyadstv": { + "alias": "freewheel-ssp" + } + }, { "rhythmone": { "supportedMediaTypes": ["video"] diff --git a/src/adapters/stickyadstv.js b/src/adapters/stickyadstv.js index 803cd626d56..221898df1f0 100644 --- a/src/adapters/stickyadstv.js +++ b/src/adapters/stickyadstv.js @@ -1,9 +1,11 @@ +var Adapter = require('./adapter.js'); var bidfactory = require('../bidfactory.js'); var bidmanager = require('../bidmanager.js'); var adloader = require('../adloader.js'); var StickyAdsTVAdapter = function StickyAdsTVAdapter() { + var STICKYADS_BIDDERCODE = 'stickyadstv'; var MUSTANG_URL = "//cdn.stickyadstv.com/mustang/mustang.min.js"; var INTEXTROLL_URL = "//cdn.stickyadstv.com/prime-time/intext-roll.min.js"; var SCREENROLL_URL = "//cdn.stickyadstv.com/prime-time/screen-roll.min.js"; @@ -225,7 +227,7 @@ var StickyAdsTVAdapter = function StickyAdsTVAdapter() { if(valid && priceData) { // valid bid response bidObject = bidfactory.createBid(1, bidRequest); - bidObject.bidderCode = 'stickyadstv'; + bidObject.bidderCode = bidRequest.bidder; bidObject.cpm = priceData.price; bidObject.currencyCode = priceData.currency; bidObject.ad = html; @@ -236,7 +238,7 @@ var StickyAdsTVAdapter = function StickyAdsTVAdapter() { else { // invalid bid response bidObject = bidfactory.createBid(2, bidRequest); - bidObject.bidderCode = 'stickyadstv'; + bidObject.bidderCode = bidRequest.bidder; } return bidObject; } @@ -277,16 +279,19 @@ var StickyAdsTVAdapter = function StickyAdsTVAdapter() { }; - // Export the callBids function, so that prebid.js can execute - // this function when the page asks to send out bid requests. - return { + return Object.assign(Adapter.createNew(STICKYADS_BIDDERCODE), { callBids: _callBids, formatBidObject: formatBidObject, formatAdHTML: formatAdHTML, getBiggerSize:getBiggerSize, getBid:getBid, - getTopMostWindow:getTopMostWindow - }; + getTopMostWindow:getTopMostWindow, + createNew: StickyAdsTVAdapter.createNew //enable alias feature (to be used for freewheel-ssp alias) + }); +}; + +StickyAdsTVAdapter.createNew = function() { + return new StickyAdsTVAdapter(); }; module.exports = StickyAdsTVAdapter; \ No newline at end of file diff --git a/test/spec/adapters/stickyadstv_spec.js b/test/spec/adapters/stickyadstv_spec.js index eb665ec658c..b485416f614 100644 --- a/test/spec/adapters/stickyadstv_spec.js +++ b/test/spec/adapters/stickyadstv_spec.js @@ -157,7 +157,6 @@ describe('StickyAdsTV Adapter', function () { expect(result).to.have.property('cpm', '1.2345'); expect(result).to.have.property('ad', "
sample
"); - expect(result).to.have.property('bidderCode', "stickyadstv"); expect(result).to.have.property('currencyCode', "EUR"); expect(result).to.have.property('width', 200); expect(result).to.have.property('height', 300); @@ -167,14 +166,12 @@ describe('StickyAdsTV Adapter', function () { it('should create a invalid bid object because price is not defined', function () { let result = adapter.formatBidObject("", true, null, "
sample
", 200, 300); - expect(result).to.have.property('bidderCode', "stickyadstv"); expect(result.getStatusCode()).to.equal(2); }); it('should create a invalid bid object', function () { let result = adapter.formatBidObject("", false, {currency:"EUR",price:"1.2345"}, "
sample
", 200, 300); - expect(result).to.have.property('bidderCode', "stickyadstv"); expect(result.getStatusCode()).to.equal(2); }); }); From c9b2bf47f8185ffd6875c02c1499d43382325043 Mon Sep 17 00:00:00 2001 From: uriw-ia Date: Tue, 4 Apr 2017 00:00:27 +0300 Subject: [PATCH 22/38] Add Inneractive adapter (#1048) * - New Adaptor - Inneractive * refactor: removed checkIfBidWon call and method * refactor: also removing EVENTS reference from src/constants * Changed referrer to match access recommendations --- adapters.json | 1 + src/adapters/inneractive.js | 462 +++++++++++++++++++++++++ test/spec/adapters/inneractive_spec.js | 295 ++++++++++++++++ 3 files changed, 758 insertions(+) create mode 100644 src/adapters/inneractive.js create mode 100644 test/spec/adapters/inneractive_spec.js diff --git a/adapters.json b/adapters.json index 64eacabae29..bf65a6d033d 100644 --- a/adapters.json +++ b/adapters.json @@ -21,6 +21,7 @@ "indexExchange", "kruxlink", "getintent", + "inneractive", "komoona", "lifestreet", "mantis", diff --git a/src/adapters/inneractive.js b/src/adapters/inneractive.js new file mode 100644 index 00000000000..a4b24eeceec --- /dev/null +++ b/src/adapters/inneractive.js @@ -0,0 +1,462 @@ +import * as utils from '../utils'; +import Adapter from './adapter'; +import {ajax} from '../ajax'; +import bidManager from 'src/bidmanager'; +import bidFactory from 'src/bidfactory'; +import {STATUS} from 'src/constants'; +import {formatQS} from '../url'; + +/** + * @type {{IA_JS: string, ADAPTER_NAME: string, V: string, RECTANGLE_SIZE: {W: number, H: number}, SPOT_TYPES: {INTERSTITIAL: string, RECTANGLE: string, FLOATING: string, BANNER: string}, DISPLAY_AD: number, ENDPOINT_URL: string, EVENTS_ENDPOINT_URL: string, RESPONSE_HEADERS_NAME: {PRICING_VALUE: string, AD_H: string, AD_W: string}}} + */ +const CONSTANTS = { + ADAPTER_NAME: 'inneractive', + V: 'IA-JS-HB-PBJS-1.0', + RECTANGLE_SIZE:{W: 300, H: 250}, + + SPOT_TYPES: { + INTERSTITIAL: 'interstitial', + RECTANGLE: 'rectangle', + FLOATING: 'floating', + BANNER: 'banner' + }, + + DISPLAY_AD: 20, + ENDPOINT_URL: '//ad-tag.inner-active.mobi/simpleM2M/requestJsonAd', + EVENTS_ENDPOINT_URL: '//vast-events.inner-active.mobi/Event', + RESPONSE_HEADERS_NAME: { + PRICING_VALUE: 'X-IA-Pricing-Value', + AD_H: 'X-IA-Ad-Height', + AD_W: 'X-IA-Ad-Width' + } +}; + +let iaRef; +try{ + iaRef = window.top.document.referrer; +}catch(e){ + iaRef = window.document.referrer; +} + +/** + * gloable util functions + * @type {{defaultsQsParams: {v: (string|string), page: string, mw: boolean, hb: string}, stringToCamel: (function(*)), objectToCamel: (function(*=))}} + */ +const Helpers = { + defaultsQsParams: {v: CONSTANTS.V,page: encodeURIComponent(utils.getTopWindowUrl()),mw: true, hb: 'prebidjs'}, + /** + * Change string format from underscore to camelcase (e.g., APP_ID to appId) + * @param str: string + * @returns string + */ + stringToCamel(str){ + if(str.indexOf('_') === -1){ + const first = str.charAt(0); + if(first !== first.toLowerCase()){ + str = str.toLowerCase(); + } + return str; + } + + str = str.toLowerCase(); + return str.replace(/(\_[a-z])/g, $1 => $1.toUpperCase().replace('_','')); + }, + + /** + * Change all object keys string format from underscore to camelcase (e.g., {'APP_ID' : ...} to {'appId' : ...}) + * @param params: object + * @returns object + */ + objectToCamel(params){ + Object.keys(params).forEach(key => { + const keyCamelCase = this.stringToCamel(key); + if(keyCamelCase !== key){ + params[keyCamelCase] = params[key]; + delete params[key]; + } + }); + return params; + } +}; + +/** + * Tracking pixels for events + * @type {{fire: (function(*=))}} + */ +const Tracker = { + /** + * Creates a tracking pixel + * @param urls: Array + */ + fire(urls){ + urls.forEach(url => url && ((new Image(1,1)).src = encodeURI(url))); + } +}; + +/** + * Analytics + * @type {{errorEventName: string, pageProtocol: string, getPageProtocol: (function(): string), getEventUrl: (function(*, *=)), reportEvent: (function(string, Object)), defaults: {v: (string|string), page: string, mw: boolean, hb: string}, eventQueryStringParams: (function(Object): string), createTrackingPixel: (function(string))}} + */ +const Reporter = { + /** + * @private + */ + errorEventName: 'HBPreBidError', + pageProtocol: '', + + /** + * Gets the page protocol based on the document.location.protocol + * The returned string is either http:// or https:// + * @returns {string} + */ + getPageProtocol(){ + if(!this.pageProtocol){ + this.pageProtocol = ('http:' === utils.getTopWindowLocation().protocol ? 'http:' : 'https:'); + } + return this.pageProtocol; + }, + + getEventUrl(evtName, extraDetails){ + let eventsEndpoint = CONSTANTS.EVENTS_ENDPOINT_URL + '?table=' + ((evtName === this.errorEventName) ? 'mbwError' : 'mbwEvent'); + let queryStringParams = this.eventQueryStringParams(extraDetails); + const appId = extraDetails && extraDetails.appId; + let queryStringParamsWithAID = `${queryStringParams}&aid=${appId}_${evtName}_other&evtName=${evtName}`; + return eventsEndpoint + '&' + queryStringParamsWithAID; + }, + + /** + * Reports an event to IA's servers. + * @param {string} evtName - event name as string. + * @param {object} extraDetails - e.g., a JS exception JSON object. + * @param shouldSendOnlyToNewEndpoint + */ + reportEvent(evtName, extraDetails) { + const url = this.getEventUrl(evtName, extraDetails); + this.createTrackingPixel(url); + }, + defaults: Helpers.defaultsQsParams, + + /** + * Ia Event Reporting Query String Parameters, not including App Id. + * @param {object} extraDetails - e.g., a JS exception JSON object. + * @return {string} IA event contcatenated queryString parameters. + */ + eventQueryStringParams(extraDetails) { + const toQS = Object.assign({}, this.defaults, {realAppId: extraDetails && extraDetails.appId, timestamp: Date.now()}); + return formatQS(toQS); + }, + + /** + * Creates a tracking pixel by prepending the page's protocol to the URL sent as the param. + * @param {string} urlWithoutProtocol - the URL to send the tracking pixel to, without the protocol as a prefix. + */ + createTrackingPixel(urlWithoutProtocol) { + Tracker.fire([this.getPageProtocol() + urlWithoutProtocol]); + } +}; + +/** + * Url generator - generates a request URL + * @type {{defaultsParams: *, serverParamNameBySettingParamName: {referrer: string, keywords: string, appId: string, portal: string, age: string, gender: string, isSecured: (boolean|null)}, toServerParams: (function(*)), unwantedValues: *[], getUrlParams: (function(*=))}} + */ +const Url = { + defaultsParams: Object.assign({}, Helpers.defaultsQsParams, {f: CONSTANTS.DISPLAY_AD,fs: false,ref: iaRef}), + serverParamNameBySettingParamName: { + referrer: 'ref', + keywords: 'k', + appId: 'aid', + portal: 'po', + age: 'a', + gender: 'g', + }, + unwantedValues: ['', null, undefined], + + /** + * Maps publisher params to server params + * @param params: object {k:v} + * @returns object {k:v} + */ + toServerParams(params){ + const serverParams = {}; + for(const paramName in params){ + if(params.hasOwnProperty(paramName) && this.serverParamNameBySettingParamName.hasOwnProperty(paramName)){ + serverParams[this.serverParamNameBySettingParamName[paramName]] = params[paramName]; + }else{ + serverParams[paramName] = params[paramName]; + } + } + + serverParams.isSecured = Reporter.getPageProtocol() === 'https:' || null; + return serverParams; + }, + + /** + * Prepare querty string to ad server + * @param params: object {k:v} + * @returns : object {k:v} + */ + getUrlParams(params){ + const serverParams = this.toServerParams(params); + const toQueryString = Object.assign({}, this.defaultsParams, serverParams); + for(const paramName in toQueryString){ + if(toQueryString.hasOwnProperty(paramName) && this.unwantedValues.indexOf(toQueryString[paramName]) !== -1){ + delete toQueryString[paramName]; + } + } + toQueryString.fs = params.spotType === CONSTANTS.SPOT_TYPES.INTERSTITIAL; + + if(params.spotType === CONSTANTS.SPOT_TYPES.RECTANGLE){ + toQueryString.rw = CONSTANTS.RECTANGLE_SIZE.W; + toQueryString.rh = CONSTANTS.RECTANGLE_SIZE.H; + } + + if (typeof $$PREBID_GLOBAL$$ !== 'undefined') { + toQueryString.bco = $$PREBID_GLOBAL$$.cbTimeout || $$PREBID_GLOBAL$$.bidderTimeout; + } + + toQueryString.timestamp = Date.now(); + delete toQueryString.qa; + return toQueryString; + } +}; + +/** + * Http helper to extract metadata + * @type {{headers: *[], getBidHeaders: (function(*))}} + */ +const Http = { + headers: [ + CONSTANTS.RESPONSE_HEADERS_NAME.PRICING_VALUE, + CONSTANTS.RESPONSE_HEADERS_NAME.AD_H, + CONSTANTS.RESPONSE_HEADERS_NAME.AD_W + ], + + /** + * Extract headers data + * @param xhr: XMLHttpRequest + * @returns {} + */ + getBidHeaders(xhr){ + const headersData = {}; + this.headers.forEach(headerName => headersData[headerName] = xhr.getResponseHeader(headerName)); + return headersData; + } +}; + + +/** + * InnerActiveAdapter for requesting bids + * @class + */ +class InnerActiveAdapter{ + constructor(){ + this.iaAdapter = Adapter.createNew(CONSTANTS.ADAPTER_NAME); + this.bidByBidId = {}; + } + + /** + * validate if bid request is valid + * @param adSettings: object + * @returns {boolean} + * @private + */ + _isValidRequest(adSettings){ + if(adSettings && adSettings.appId && adSettings.spotType){ + return true; + } + utils.logError('bid requires appId'); + return false; + } + + /** + * Store the bids in a Map object (k: bidId, v: bid)to check later if won + * @param bid + * @returns bid object + * @private + */ + _storeBidRequestDetails(bid){ + this.bidByBidId[bid.bidId] = bid; + return bid; + } + + /** + * @param bidStatus: int ("STATUS": {"GOOD": 1,"NO_BID": 2}) + * @param bidResponse: object + * @returns {type[]} + * @private + */ + _getBidDetails(bidStatus, bidResponse, bidId){ + let bid = bidFactory.createBid(bidStatus, bidResponse); + bid.code = CONSTANTS.ADAPTER_NAME; + bid.bidderCode = bid.code; + if (bidStatus === STATUS.GOOD) { + bid = Object.assign(bid, bidResponse); + this._setBidCpm(bid, bidId); + } + return bid; + } + + _setBidCpm(bid, bidId){ + const storedBid = this.bidByBidId[bidId]; + if(storedBid){ + bid.cpm = storedBid.params && storedBid.params.qa && storedBid.params.qa.cpm || bid.cpm; + bid.cpm = (bid.cpm !== null && !isNaN(bid.cpm)) ? parseFloat(bid.cpm) : 0.0; + } + } + + /** + * Validate if response is valid + * @param responseAsJson : object + * @param headersData: {} + * @returns {boolean} + * @private + */ + _isValidBidResponse(responseAsJson, headersData){ + return (responseAsJson && responseAsJson.ad && responseAsJson.ad.html && headersData && headersData[CONSTANTS.RESPONSE_HEADERS_NAME.PRICING_VALUE] > 0); + } + + /** + * When response is received + * @param response: string(json format) + * @param xhr: XMLHttpRequest + * @param bidId: string + * @private + */ + _onResponse(response, xhr, bidId){ + const bid = this.bidByBidId[bidId]; + const [w, h] = bid.sizes[0]; + const size = {w, h}; + let responseAsJson; + const headersData = Http.getBidHeaders(xhr); + try { + responseAsJson = JSON.parse(response); + } catch (error) { + utils.logError(error); + } + + if (!this._isValidBidResponse(responseAsJson, headersData)) { + let errorMessage = `response failed for ${CONSTANTS.ADAPTER_NAME} adapter`; + utils.logError(errorMessage); + const passback = responseAsJson && responseAsJson.config && responseAsJson.config.passback; + if(passback) { + Tracker.fire([passback]); + } + Reporter.reportEvent('HBPreBidNoAd', bid.params); + return bidManager.addBidResponse(bid.placementCode, this._getBidDetails(STATUS.NO_BID)); + } + const bidResponse = { + cpm: headersData[CONSTANTS.RESPONSE_HEADERS_NAME.PRICING_VALUE]*1000, + width: parseFloat(headersData[CONSTANTS.RESPONSE_HEADERS_NAME.AD_W]) || size.w, + ad: this._getAd(responseAsJson.ad.html, responseAsJson.config.tracking, bid.params), + height: parseFloat(headersData[CONSTANTS.RESPONSE_HEADERS_NAME.AD_H]) || size.h + }; + const auctionBid = this._getBidDetails(STATUS.GOOD, bidResponse, bidId); + bid.adId = auctionBid.adId; + this.bidByBidId[bidId] = bid; + bidManager.addBidResponse(bid.placementCode, auctionBid); + } + + /** + * Returns the ad HTML template + * @param adHtml: string {ad server creative} + * @param tracking: object {impressions, clicks} + * @param bidParams: object + * @returns {string}: create template + * @private + */ + _getAd(adHtml, tracking, bidParams){ + + let impressionsHtml = ''; + if(tracking && Array.isArray(tracking.impressions)){ + let impressions = tracking.impressions; + impressions.push(Reporter.getEventUrl('HBPreBidImpression', bidParams, false)); + impressions.forEach(impression => impression && (impressionsHtml += utils.createTrackPixelHtml(impression))); + } + adHtml = impressionsHtml + adHtml.replace(/
+ + + + +
${adHtml}
+ + + `; + return adTemplate; + } + /** + * Adjust bid params to ia-ad-server params + * @param bid: object + * @private + */ + _toIaBidParams(bid){ + const bidParamsWithCustomParams = Object.assign({}, bid.params, bid.params.customParams); + delete bidParamsWithCustomParams.customParams; + bid.params = Helpers.objectToCamel(bidParamsWithCustomParams); + } + + /** + * Prebid executes for stating an auction + * @param bidRequest: object + */ + callBids(bidRequest){ + const bids = bidRequest.bids || []; + bids.forEach(bid => this._toIaBidParams(bid)); + bids + .filter(bid => this._isValidRequest(bid.params)) + .map(bid => this._storeBidRequestDetails(bid)) + .forEach(bid => ajax(this._getEndpointUrl(bid.params), (response, xhr) => this._onResponse(response, xhr, bid.bidId), Url.getUrlParams(bid.params), {method: 'GET'})); + } + + _getEndpointUrl(params){ + return params && params.qa && params.qa.url || Reporter.getPageProtocol() + CONSTANTS.ENDPOINT_URL; + } + + _getStoredBids(){ + const storedBids = []; + for(const bidId in this.bidByBidId){ + if(this.bidByBidId.hasOwnProperty(bidId)) { + storedBids.push(this.bidByBidId[bidId]); + } + } + return storedBids; + } + + /** + * Return internal object - testing + * @returns {{Reporter: {errorEventName: string, pageProtocol: string, getPageProtocol: (function(): string), getEventUrl: (function(*, *=)), reportEvent: (function(string, Object)), defaults: {v: (string|string), page: string, mw: boolean, hb: string}, eventQueryStringParams: (function(Object): string), createTrackingPixel: (function(string))}}} + * @private + */ + static _getUtils(){ + return {Reporter}; + } + + /** + * Creates new instance of InnerActiveAdapter for prebid auction + * @returns {InnerActiveAdapter} + */ + static createNew(){ + return new InnerActiveAdapter(); + } +} +module.exports = InnerActiveAdapter; diff --git a/test/spec/adapters/inneractive_spec.js b/test/spec/adapters/inneractive_spec.js new file mode 100644 index 00000000000..819e01b0139 --- /dev/null +++ b/test/spec/adapters/inneractive_spec.js @@ -0,0 +1,295 @@ +/* globals context */ + +import {expect} from 'chai'; +import {default as InneractiveAdapter} from 'src/adapters/inneractive'; +import bidmanager from 'src/bidmanager'; + + +// Using plain-old-style functions, why? see: http://mochajs.org/#arrow-functions +describe('InneractiveAdapter', function () { + let adapter, + bidRequest; + + beforeEach(function () { + adapter = InneractiveAdapter.createNew(); + bidRequest = { + bidderCode: "inneractive", + bids: [ + { + bidder: "inneractive", + params: { + appId: "", + }, + placementCode: "div-gpt-ad-1460505748561-0", + sizes: [[300, 250], [300, 600]], + bidId: "507e8db167d219", + bidderRequestId: "49acc957f92917", + requestId: "51381cd0-c29c-405b-9145-20f60abb1e76" + }, + { + bidder: "inneractive", + params: { + noappId: "...", + }, + placementCode: "div-gpt-ad-1460505661639-0", + sizes: [[728, 90], [970, 90]], + bidId: "507e8db167d220", + bidderRequestId: "49acc957f92917", + requestId: "51381cd0-c29c-405b-9145-20f60abb1e76" + }, + { + bidder: "inneractive", + params: { + APP_ID: "Inneractive_AndroidHelloWorld_Android", + spotType: "rectangle", + customParams: { + Portal: 7002, + } + }, + placementCode: "div-gpt-ad-1460505748561-0", + sizes: [[320, 50], [300, 600]], + bidId: "507e8db167d221", + bidderRequestId: "49acc957f92917", + requestId: "51381cd0-c29c-405b-9145-20f60abb1e76" + }, + { + bidder: "inneractive", + params: { + appId: "Inneractive_IosHelloWorld_iPhone", + spotType: "banner", // Just for coverage considerations, no real impact in production + customParams: { + portal: 7001, + gender: '' + } + }, + placementCode: "div-gpt-ad-1460505661639-0", + sizes: [[728, 90], [970, 90]], + bidId: "507e8db167d222", + bidderRequestId: "49acc957f92917", + requestId: "51381cd0-c29c-405b-9145-20f60abb1e76" + }] + }; + }); + + describe('Reporter', function () { + context('on HBPreBidError event', function () { + it('should contain "mbwError" the inside event report url', function () { + const Reporter = InneractiveAdapter._getUtils().Reporter; + const extraDetailsParam = { + "appId": "CrunchMind_DailyDisclosure_other", + "spotType": "rectangle", + "portal": 7002 + }; + let eventReportUrl = Reporter.getEventUrl('HBPreBidError', extraDetailsParam); + expect(eventReportUrl).to.include('mbwError'); + }); + }); + }); + + describe('.createNew()', function () { + it('should return an instance of this adapter having a "callBids" method', function () { + expect(adapter) + .to.be.instanceOf(InneractiveAdapter).and + .to.have.property('callBids').and + .to.be.a('function'); + }); + }); + + describe('when sending out bid requests to the ad server', function () { + let bidRequests, + xhr; + + beforeEach(function () { + bidRequests = []; + xhr = sinon.useFakeXMLHttpRequest(); + xhr.onCreate = (request) => { + bidRequests.push(request); + }; + }); + + afterEach(function () { + xhr.restore(); + }); + + context('when there are no bid requests', function () { + it('should not issue a request', function () { + const Reporter = InneractiveAdapter._getUtils().Reporter; + Reporter.getEventUrl('HBPreBidError', { + "appId": "CrunchMind_DailyDisclosure_other", + "spotType": "rectangle", + "portal": 7002 + }); + + delete bidRequest.bids; + adapter.callBids(bidRequest); + + expect(bidRequests).to.be.empty; // jshint ignore:line + }); + }); + + context('when there is at least one bid request', function () { + it('should filter out invalid bids', function () { + const INVALID_BIDS_COUNT = 2; + sinon.spy(adapter, '_isValidRequest'); + adapter.callBids(bidRequest); + + + for (let id = 0; id < INVALID_BIDS_COUNT; id++) { + expect(adapter._isValidRequest.getCall(id).returned(false)).to.be.true; // jshint ignore:line + } + + adapter._isValidRequest.restore(); + }); + + it('should store all valid bids internally', function () { + adapter.callBids(bidRequest); + expect(Object.keys(adapter.bidByBidId).length).to.equal(2); + }); + + it('should issue ad requests to the ad server for every valid bid', function () { + adapter.callBids(bidRequest); + expect(bidRequests).to.have.lengthOf(2); + }); + }); + }); + + describe('when registering the bids that are returned with Prebid.js', function () { + const BID_DETAILS_ARG_INDEX = 1; + let server; + + beforeEach(function () { + sinon.stub(bidmanager, 'addBidResponse'); + server = sinon.fakeServer.create(); + }); + + afterEach(function () { + server.restore(); + bidmanager.addBidResponse.restore(); + }); + + context('when the bid is valid', function () { + let adServerResponse, + headers, + body; + + beforeEach(function () { + adServerResponse = { + headers: { + "X-IA-Ad-Height": 250, + "X-IA-Ad-Width": 300, + "X-IA-Error": "OK", + "X-IA-Pricing": "CPM", + "X-IA-Pricing-Currency": "USD", + "X-IA-Pricing-Value": 0.0005 + }, + body: { + ad: { + html: "
" + }, + config: { + tracking: { + impressions: [ + "http://event.inner-active.mobi/simpleM2M/reportEvent?eventArchetype=impress…pe=3&network=Inneractive_CS&acp=&pcp=&secure=false&rtb=false&houseAd=false" + ], + clicks: [ + "http://event.inner-active.mobi/simpleM2M/reportEvent?eventArchetype=richMed…pe=3&network=Inneractive_CS&acp=&pcp=&secure=false&rtb=false&houseAd=false", + "" + ], + passback: "http://event.inner-active.mobi/simpleM2M/reportEvent?eventArchetype=passbac…pe=3&network=Inneractive_CS&acp=&pcp=&secure=false&rtb=false&houseAd=false" + }, + moat: { + countryCode: "IL" + } + } + } + }; + headers = adServerResponse.headers; + body = JSON.stringify(adServerResponse.body); + }); + + it('should register bid responses with a status code of 1', function () { + server.respondWith([200, headers, body]); + adapter.callBids(bidRequest); + server.respond(); + + let firstRegisteredBidResponse = bidmanager.addBidResponse.firstCall.args[BID_DETAILS_ARG_INDEX]; + expect(firstRegisteredBidResponse) + .to.have.property('statusMessage', 'Bid available'); + }); + + it('should use the first element inside the bid request size array when no (width,height) is returned within the headers', function () { + delete headers['X-IA-Ad-Height']; + delete headers['X-IA-Ad-Width']; + server.respondWith([200, headers, body]); + adapter.callBids(bidRequest); + server.respond(); + + let firstRegisteredBidResponse = bidmanager.addBidResponse.firstCall.args[BID_DETAILS_ARG_INDEX]; + expect(firstRegisteredBidResponse).to.have.property('width', 320); + expect(firstRegisteredBidResponse).to.have.property('height', 50); + }); + }); + + context('when the bid is invalid', function () { + let passbackAdServerResponse, + headers, + body; + + beforeEach(function () { + passbackAdServerResponse = { + headers: { + "X-IA-Error": "House Ad", + "X-IA-Content": 600145, + "X-IA-Cid": 99999, + "X-IA-Publisher": 206536, + "Content-Type": "application/json; charset=UTF-8", + "X-IA-Session": 6512147119979250840, + "X-IA-AdNetwork": "inneractive360" + }, + body: { + "ad": { + "html": "" + }, + "config": { + "passback": "http://event.inner-active.mobi/simpleM2M/reportEvent?eventArchetype=passbac…pe=3&network=Inneractive_CS&acp=&pcp=&secure=false&rtb=false&houseAd=false" + } + } + }; + headers = passbackAdServerResponse.headers; + body = JSON.stringify(passbackAdServerResponse.body); + }); + + it('should register bid responses with a status code of 2', function () { + server.respondWith([200, headers, body]); + adapter.callBids(bidRequest); + server.respond(); + + let firstRegisteredBidResponse = bidmanager.addBidResponse.firstCall.args[BID_DETAILS_ARG_INDEX]; + expect(firstRegisteredBidResponse) + .to.have.property('statusMessage', 'Bid returned empty or error response'); + }); + + it('should handle responses from our server in case we had no ad to offer', function () { + const n = bidRequest.bids.length; + bidRequest.bids[n - 1].params.appId = "Komoona_InquisitrRectangle2_other"; + server.respondWith([200, headers, body]); + adapter.callBids(bidRequest); + server.respond(); + + let secondRegisteredBidResponse = bidmanager.addBidResponse.secondCall.args[BID_DETAILS_ARG_INDEX]; + expect(secondRegisteredBidResponse) + .to.have.property('statusMessage', 'Bid returned empty or error response'); + }); + + it('should handle JSON.parse errors', function () { + server.respondWith(''); + adapter.callBids(bidRequest); + server.respond(); + + const firstRegisteredBidResponse = bidmanager.addBidResponse.firstCall.args[BID_DETAILS_ARG_INDEX]; + expect(firstRegisteredBidResponse) + .to.have.property('statusMessage', 'Bid returned empty or error response'); + }); + }); + }); +}); From 2ace03f02dc787119759397d1faf62edc3504363 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 7 Apr 2017 15:39:05 -0600 Subject: [PATCH 23/38] added support for sampling in ga and base adapter, fixed up some tests (#1011) * added support for sampling in ga and base adapter, fixed some tests * added ability to pipe analytics events to customize values before logging * don't mutate original args in analytics adapter pipe function * remove pipe functionality in favor of custom adapter implementation * fixed bug in GA adapter looking for property on potential non-object --- src/adapters/analytics/AnalyticsAdapter.js | 74 +++++--- src/adapters/analytics/ga.js | 87 +++++----- .../analytics/AnalyticsAdapter_spec.js | 162 +++++++++++------- 3 files changed, 194 insertions(+), 129 deletions(-) diff --git a/src/adapters/analytics/AnalyticsAdapter.js b/src/adapters/analytics/AnalyticsAdapter.js index 62f7143b947..1cb007371e5 100644 --- a/src/adapters/analytics/AnalyticsAdapter.js +++ b/src/adapters/analytics/AnalyticsAdapter.js @@ -17,11 +17,13 @@ const ENDPOINT = 'endpoint'; const BUNDLE = 'bundle'; var _timedOutBidders = []; +var _sampled = true; export default function AnalyticsAdapter({ url, analyticsType, global, handler }) { var _queue = []; var _eventCount = 0; var _enableCheck = true; + var _handlers; if (analyticsType === LIBRARY) { loadScript(url, _emptyQueue); @@ -35,6 +37,7 @@ export default function AnalyticsAdapter({ url, analyticsType, global, handler } track: _track, enqueue: _enqueue, enableAnalytics: _enable, + disableAnalytics: _disable, getAdapterType: () => analyticsType, getGlobal: () => global, getHandler: () => handler, @@ -71,33 +74,50 @@ export default function AnalyticsAdapter({ url, analyticsType, global, handler } function _enable(config) { var _this = this; - //first send all events fired before enableAnalytics called - events.getEvents().forEach(event => { - if (!event) { - return; - } + if (typeof config === 'object' && typeof config.options === 'object') { + _sampled = typeof config.options.sampling === 'undefined' || Math.random() < parseFloat(config.options.sampling); + } else { + _sampled = true; + } - const { eventType, args } = event; - if (eventType === BID_TIMEOUT) { - _timedOutBidders = args.bidderCode; - } else { - _enqueue.call(_this, { eventType, args }); - } - }); + if (_sampled) { + //first send all events fired before enableAnalytics called + events.getEvents().forEach(event => { + if (!event) { + return; + } + + const { eventType, args } = event; + + if (eventType === BID_TIMEOUT) { + _timedOutBidders = args.bidderCode; + } else { + _enqueue.call(_this, { eventType, args }); + } + }); + + //Next register event listeners to send data immediately + + _handlers = { + [BID_REQUESTED]: args => this.enqueue({ eventType: BID_REQUESTED, args }), + [BID_RESPONSE]: args => this.enqueue({ eventType: BID_RESPONSE, args }), + [BID_TIMEOUT]: args => this.enqueue({ eventType: BID_TIMEOUT, args }), + [BID_WON]: args => this.enqueue({ eventType: BID_WON, args }), + [BID_ADJUSTMENT]: args => this.enqueue({ eventType: BID_ADJUSTMENT, args }), + [AUCTION_INIT]: args => { + args.config = config.options; // enableAnaltyics configuration object + this.enqueue({ eventType: AUCTION_INIT, args }); + } + }; + + utils._each(_handlers, (handler, event) => { + events.on(event, handler); + }); + } else { + utils.logMessage(`Analytics adapter for "${global}" disabled by sampling`); + } - //Next register event listeners to send data immediately - - //bidRequests - events.on(BID_REQUESTED, args => this.enqueue({ eventType: BID_REQUESTED, args })); - events.on(BID_RESPONSE, args => this.enqueue({ eventType: BID_RESPONSE, args })); - events.on(BID_TIMEOUT, args => this.enqueue({ eventType: BID_TIMEOUT, args })); - events.on(BID_WON, args => this.enqueue({ eventType: BID_WON, args })); - events.on(BID_ADJUSTMENT, args => this.enqueue({ eventType: BID_ADJUSTMENT, args })); - events.on(AUCTION_INIT, args => { - args.config = config.options; // enableAnaltyics configuration object - this.enqueue({ eventType: AUCTION_INIT, args }); - }); // finally set this function to return log message, prevents multiple adapter listeners this.enableAnalytics = function _enable() { @@ -105,6 +125,12 @@ export default function AnalyticsAdapter({ url, analyticsType, global, handler } }; } + function _disable() { + utils._each(_handlers, (handler, event) => { + events.off(event, handler); + }); + } + function _emptyQueue() { if (_enableCheck) { for (var i = 0; i < _queue.length; i++) { diff --git a/src/adapters/analytics/ga.js b/src/adapters/analytics/ga.js index fa85839a426..e17a4832c07 100644 --- a/src/adapters/analytics/ga.js +++ b/src/adapters/analytics/ga.js @@ -19,6 +19,7 @@ var _category = 'Prebid.js Bids'; var _eventCount = 0; var _enableDistribution = false; var _trackerSend = null; +var _sampled = true; /** * This will enable sending data to google analytics. Only call once, or duplicate data will be sent! @@ -30,6 +31,8 @@ exports.enableAnalytics = function ({ provider, options }) { _gaGlobal = provider || 'ga'; _trackerSend = options && options.trackerName ? options.trackerName + '.send' : 'send'; + _sampled = typeof options === "undefined" || typeof options.sampling === "undefined" || + Math.random() < parseFloat(options.sampling); if (options && typeof options.global !== 'undefined') { _gaGlobal = options.global; @@ -40,53 +43,59 @@ exports.enableAnalytics = function ({ provider, options }) { var bid = null; - //first send all events fired before enableAnalytics called + if(_sampled) { + //first send all events fired before enableAnalytics called - var existingEvents = events.getEvents(); - utils._each(existingEvents, function (eventObj) { - var args = eventObj.args; - if (!eventObj) { - return; - } + var existingEvents = events.getEvents(); - if (eventObj.eventType === BID_REQUESTED) { - bid = args; - sendBidRequestToGa(bid); - } else if (eventObj.eventType === BID_RESPONSE) { - //bid is 2nd args - bid = args; - sendBidResponseToGa(bid); + utils._each(existingEvents, function (eventObj) { + if (typeof eventObj !== "object") { + return; + } + var args = eventObj.args; + + if (eventObj.eventType === BID_REQUESTED) { + bid = args; + sendBidRequestToGa(bid); + } else if (eventObj.eventType === BID_RESPONSE) { + //bid is 2nd args + bid = args; + sendBidResponseToGa(bid); + + } else if (eventObj.eventType === BID_TIMEOUT) { + const bidderArray = args; + sendBidTimeouts(bidderArray); + } else if (eventObj.eventType === BID_WON) { + bid = args; + sendBidWonToGa(bid); + } + }); - } else if (eventObj.eventType === BID_TIMEOUT) { - const bidderArray = args; - sendBidTimeouts(bidderArray); - } else if (eventObj.eventType === BID_WON) { - bid = args; - sendBidWonToGa(bid); - } - }); + //Next register event listeners to send data immediately - //Next register event listeners to send data immediately + //bidRequests + events.on(BID_REQUESTED, function (bidRequestObj) { + sendBidRequestToGa(bidRequestObj); + }); - //bidRequests - events.on(BID_REQUESTED, function (bidRequestObj) { - sendBidRequestToGa(bidRequestObj); - }); + //bidResponses + events.on(BID_RESPONSE, function (bid) { + sendBidResponseToGa(bid); + }); - //bidResponses - events.on(BID_RESPONSE, function (bid) { - sendBidResponseToGa(bid); - }); + //bidTimeouts + events.on(BID_TIMEOUT, function (bidderArray) { + sendBidTimeouts(bidderArray); + }); - //bidTimeouts - events.on(BID_TIMEOUT, function (bidderArray) { - sendBidTimeouts(bidderArray); - }); + //wins + events.on(BID_WON, function (bid) { + sendBidWonToGa(bid); + }); - //wins - events.on(BID_WON, function (bid) { - sendBidWonToGa(bid); - }); + } else { + utils.logMessage("Prebid.js google analytics disabled by sampling"); + } // finally set this function to return log message, prevents multiple adapter listeners this.enableAnalytics = function _enable() { diff --git a/test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js b/test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js index f3f6f867071..4e6b862742b 100644 --- a/test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js +++ b/test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js @@ -29,7 +29,6 @@ FEATURE: Analytics Adapters API const adapter = new AnalyticsAdapter(config); var spyTestGlobal = sinon.spy(window, config.global); - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); adapter.track({ eventType, args }); it(`THEN should call \`window.${config.global}\` function\n`, () => { @@ -45,7 +44,6 @@ FEATURE: Analytics Adapters API const adapter = new AnalyticsAdapter(config); window[config.global] = null; - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); events.emit(BID_RESPONSE, args); describe(`AND the adapter is then enabled\n`, () => { @@ -59,92 +57,124 @@ FEATURE: Analytics Adapters API assert.ok(spyTestGlobal.args[0][1] === eventType, `with expected event type\n`); assert.deepEqual(spyTestGlobal.args[0][2], args, `with expected event data\n`); }); + + adapter.disableAnalytics(); window[config.global].restore(); }); }); - describe(`WHEN an event occurs after enable analytics\n`, () => { - const eventType = BID_WON; - const args = { more: 'info' }; - const adapter = new AnalyticsAdapter(config); - var spyTestGlobal = sinon.spy(window, config.global); + describe(`WHEN an event occurs after enable analytics\n`, () => { - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); - adapter.enableAnalytics(); - events.emit(eventType, args); + var spyTestGlobal, + adapter; - it(`THEN should call \`window.${config.global}\` function\n`, () => { - assert.ok(spyTestGlobal.args[2][1] === eventType, `with expected event type\n`); - assert.deepEqual(spyTestGlobal.args[2][2], args, `with expected event data\n`); + beforeEach(() => { + adapter = new AnalyticsAdapter(config); + spyTestGlobal = sinon.spy(window, config.global); + + sinon.stub(events, "getEvents", () => []); // these tests shouldn't be affected by previous tests }); - window[config.global].restore(); - }); - describe(`WHEN a bidRequest event occurs\n`, () => { - const eventType = BID_REQUESTED; - const args = { call: 'request' }; - const adapter = new AnalyticsAdapter(config); - var spyTestGlobal = sinon.spy(window, config.global); + afterEach(() => { + adapter.disableAnalytics(); + window[config.global].restore(); - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); - adapter.enableAnalytics(); - events.emit(eventType, args); + events.getEvents.restore(); + }); - it(`THEN should call \`window.${config.global}\` function\n`, () => { - assert.ok(spyTestGlobal.args[3][1] === eventType, `with expected event type\n`); - assert.deepEqual(spyTestGlobal.args[3][2], args, `with expected event data\n`); + it('SHOULD call global when a bidWon event occurs', () => { + const eventType = BID_WON; + const args = { more: 'info' }; + + adapter.enableAnalytics(); + events.emit(eventType, args); + + assert.ok(spyTestGlobal.args[0][1] === eventType, `with expected event type\n`); + assert.deepEqual(spyTestGlobal.args[0][2], args, `with expected event data\n`); }); - window[config.global].restore(); - }); - describe(`WHEN a bidResponse event occurs\n`, () => { - const eventType = BID_RESPONSE; - const args = { call: 'response' }; - const adapter = new AnalyticsAdapter(config); - var spyTestGlobal = sinon.spy(window, config.global); + it('SHOULD call global when a bidRequest event occurs', () => { + const eventType = BID_REQUESTED; + const args = { call: 'request' }; - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); - adapter.enableAnalytics(); - events.emit(eventType, args); + adapter.enableAnalytics(); + events.emit(eventType, args); - it(`THEN should call \`window.${config.global}\` function\n`, () => { - assert.ok(spyTestGlobal.args[4][1] === eventType, `with expected event type\n`); - assert.deepEqual(spyTestGlobal.args[4][2], args, `with expected event data\n`); + assert.ok(spyTestGlobal.args[0][1] === eventType, `with expected event type\n`); + assert.deepEqual(spyTestGlobal.args[0][2], args, `with expected event data\n`); }); - window[config.global].restore(); - }); - describe(`WHEN a bidTimeout event occurs\n`, () => { - const eventType = BID_TIMEOUT; - const args = { call: 'timeout' }; - const adapter = new AnalyticsAdapter(config); - var spyTestGlobal = sinon.spy(window, config.global); + it('SHOULD call global when a bidResponse event occurs', () => { + const eventType = BID_RESPONSE; + const args = { call: 'response' }; - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); - adapter.enableAnalytics(); - events.emit(eventType, args); + adapter.enableAnalytics(); + events.emit(eventType, args); - it(`THEN should call \`window.${config.global}\` function\n`, () => { - assert.ok(spyTestGlobal.args[5][1] === eventType, `with expected event type\n`); - assert.deepEqual(spyTestGlobal.args[5][2], args, `with expected event data\n`); + assert.ok(spyTestGlobal.args[0][1] === eventType, `with expected event type\n`); + assert.deepEqual(spyTestGlobal.args[0][2], args, `with expected event data\n`); }); - window[config.global].restore(); - }); - describe(`WHEN adapter.enableAnalytics is called twice\n`, () => { - const eventType = BID_TIMEOUT; - const args = { call: 'timeout' }; - const adapter = new AnalyticsAdapter(config); - var spyTestGlobal = sinon.spy(window, config.global); + it('SHOULD call global when a bidTimeout event occurs', () => { + const eventType = BID_TIMEOUT; + const args = { call: 'timeout' }; - adaptermanager.registerAnalyticsAdapter(adapter, 'adapter'); - adapter.enableAnalytics(); - events.emit(eventType, args); + adapter.enableAnalytics(); + events.emit(eventType, args); - it(`THEN should call \`window.${config.global}\` function\n`, () => { - assert.ok(spyTestGlobal.args[5][1] === eventType, `with expected event type\n`); - assert.deepEqual(spyTestGlobal.args[5][2], args, `with expected event data\n`); + assert.ok(spyTestGlobal.args[0][1] === eventType, `with expected event type\n`); + assert.deepEqual(spyTestGlobal.args[0][2], args, `with expected event data\n`); }); - window[config.global].restore(); + + it('SHOULD NOT call global again when adapter.enableAnalytics is called with previous timeout', () => { + const eventType = BID_TIMEOUT; + const args = { call: 'timeout' }; + + events.emit(eventType, args); + adapter.enableAnalytics(); + events.emit(eventType, args); + + assert(spyTestGlobal.calledOnce === true); + }); + + describe(`AND sampling is enabled\n`, () => { + const eventType = BID_WON; + const args = { more: 'info' }; + + beforeEach(() => { + sinon.stub(Math, "random", () => .5); + }); + + afterEach(() => { + Math.random.restore(); + }); + + it(`THEN should enable analytics when random number is in sample range`, () => { + adapter.enableAnalytics({ + options: { + sampling: .75 + } + }); + events.emit(eventType, args); + + assert(spyTestGlobal.called === true); + }); + + it(`THEN should disable analytics when random number is outside sample range`, () => { + adapter.enableAnalytics({ + options: { + sampling: .25 + } + }); + events.emit(eventType, args); + + assert(spyTestGlobal.called === false); + }); + + }); + + }); + + }); From a9ebedf40685ae0b9692d39e0ded4c631f23a83a Mon Sep 17 00:00:00 2001 From: Matt Kendall Date: Mon, 10 Apr 2017 11:09:57 -0400 Subject: [PATCH 24/38] added pr review process and governance model (#1103) * added pr review process and governance model * fixed typo --- README.md | 15 ++++++++++----- governance.md | 22 ++++++++++++++++++++++ pr_review.md | 23 +++++++++++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 governance.md create mode 100644 pr_review.md diff --git a/README.md b/README.md index ce496a7f5e8..c849606920c 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ This runs code quality checks, generates all the necessary files and starts a we To run the example file, go to: -+ `http://localhost:9999/integrationExamples/gpt/pbjs_example_gpt.html` ++ `http://localhost:9999/integrationExamples/gpt/pbjs_example_gpt.html` To view a test coverage report, go to: @@ -143,13 +143,15 @@ A watch is also in place that will run continuous tests in the terminal as you e ## Contribute -Many SSPs, bidders, and publishers have contributed to this project. [20+ Bidders](https://github.com/prebid/Prebid.js/tree/master/src/adapters) are supported by Prebid.js. +Many SSPs, bidders, and publishers have contributed to this project. [60+ Bidders](https://github.com/prebid/Prebid.js/tree/master/src/adapters) are supported by Prebid.js. + +Our PR review process can be found [here](https://github.com/prebid/Prebid.js/tree/master/pr_review.md). ### Add a Bidder Adapter To add a bidder adapter, see the instructions in [How to add a bidder adaptor](http://prebid.org/dev-docs/bidder-adaptor.html). -Please **do NOT load Prebid.js inside your adapter**. If you do this, we will reject or remove your adapter as appropriate. +Please **do NOT load Prebid.js inside your adapter**. If you do this, we will reject or remove your adapter as appropriate. ### Code Quality @@ -167,13 +169,13 @@ This will run tests and keep the Karma test browser open. If your `prebid.js` fi + For test results, see the console -+ To set breakpoints in source code, see the developer tools ++ To set breakpoints in source code, see the developer tools Detailed code coverage reporting can be generated explicitly with $ gulp test --coverage -The results will be in +The results will be in ./build/coverage @@ -184,3 +186,6 @@ For instructions on writing tests for Prebid.js, see [Testing Prebid.js](http:// ### Supported Browsers Prebid.js is supported on IE9+ and modern browsers. + +### Governance +Review our governance model [here Bidders](https://github.com/prebid/Prebid.js/tree/master/governance.md). diff --git a/governance.md b/governance.md new file mode 100644 index 00000000000..faaece83079 --- /dev/null +++ b/governance.md @@ -0,0 +1,22 @@ +### Overview: + +This document describes the governance model for the Prebid project. The Prebid project’s stated mission is to facilitate fair, transparent, and effective header bidding across the industry, and is responsible for creating and maintaining such projects as [Prebid.js](https://github.com/prebid/Prebid.js). + +1. A single Tech Lead oversees the technical direction of the project and appoints Core Team members +2. The Core Team members maintain the project on an ongoing basis with direction from the Tech Lead. +3. In the event of any disagreements, the Tech Lead will make a final decision. +4. If there is no Tech Lead available to perform his/her duties, AppNexus Inc. will appoint one. + +### Roles and Responsibilities: +- **User:** Any individual who consumes / uses the Prebid.js library. +- **Contributor:** Any individual who contributes code that is subsequently merged to the project. Contributed code is governed by the Prebid.js [license](https://github.com/prebid/Prebid.js/blob/master/LICENSE). Contributors are required to sign a CLA before any code can be committed (CLA pending). +- **Core Team Member:** An individual contributor who has been appointed by the Tech Lead on the project to maintain it and further it’s stated goals. +- **Tech Lead:** The Tech Lead is responsible for overall technical direction of the project. The Tech Lead will work closely with Core Team members to facilitate development and further the project goals. + +### Current Prebid.js Core Team +- @mkendall07 (Tech Lead) +- @protonate +- @matthewlane +- @jaiminpanchal27 +- @snapwich +- @harpere diff --git a/pr_review.md b/pr_review.md new file mode 100644 index 00000000000..56613916cb5 --- /dev/null +++ b/pr_review.md @@ -0,0 +1,23 @@ +## Summary +We take PR review seriously. Please read https://medium.com/@mrjoelkemp/giving-better-code-reviews-16109e0fdd36#.xa8lc4i23 to understand how a PR review should be conducted. Be rational and strict in your review, make sure you understand exactly what the submitter's intent is. Overall 1 person should take ownership of a particular PR. When they are satisfied it's in good condition to merge, they should request 1 additional team member to review as a sanity check. Only when the PR has 2 `LGTM` from the core team should it be merged. + +### General PR review Process +- Checkout the branch (these instructions are available on the github PR page as well). +- Verify PR is a single change type. Example, refactor OR bugfix. If more than 1 type, ask submitter to break out requests. +- Verify code under review has at least 80% unit test coverage. If legacy code has no unit test coverage, ask for unit tests to be included in the PR. +- Verify tests are green in Travis-ci + local build by running `gulp serve` | `gulp test` +- Verify no code quality violations are present from jscs (should be reported in terminal) +- Review for obvious errors or bad coding practice / use best judgement here. +- If the change is a new feature / change to core prebid.js - review the change with a Tech Lead on the project and make sure they agree with the nature of change. +- If all above is good, add a `LGTM` comment and request 1 additional core member to review. +- Once there is 2 `LGTM` on the PR, merge to master +- Ask the submitter to add a PR for documentation if applicable. +- Add a line into the `draft release` notes for this submission. If no draft release is available, create one using this template https://gist.github.com/mkendall07/c3af6f4691bed8a46738b3675cb5a479 + +### New Adapter or updates to adapter process +- Follow steps above for general review process. In addition, please verify the following: +- Verify that bidder has submitted valid bid params and that bids are being received. +- Verify that bidder is not manipulating the prebid.js auction in any way or doing things that go against the principles of the project. If unsure check with the Tech Lead. +- Verify that the bidder is being as efficient as possible, ideally not loading an external library, however if they do load a library it should be cached. +- Verify that code re-use is being done properly and that changes introduced by a bidder don't impact other bidders. +- If the adapter being submitted is an alias type, check with the bidder contact that is being aliased to make sure it's allowed. From 15a8f9ae75d923c5faaa55090e7408b0e65264f5 Mon Sep 17 00:00:00 2001 From: Matt Kendall Date: Mon, 10 Apr 2017 11:11:18 -0400 Subject: [PATCH 25/38] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c849606920c..03a2d1e31b4 100644 --- a/README.md +++ b/README.md @@ -188,4 +188,4 @@ For instructions on writing tests for Prebid.js, see [Testing Prebid.js](http:// Prebid.js is supported on IE9+ and modern browsers. ### Governance -Review our governance model [here Bidders](https://github.com/prebid/Prebid.js/tree/master/governance.md). +Review our governance model [here](https://github.com/prebid/Prebid.js/tree/master/governance.md). From 478b38485c57200ba3f25d6ff33c3817b66195b9 Mon Sep 17 00:00:00 2001 From: bjorn-wo Date: Tue, 11 Apr 2017 19:44:00 +0200 Subject: [PATCH 26/38] Adapter bug fix (#1096) * Added WideOrbit adapter * Fix User Matching code * Renamed adapter + some minor JS issues * Added flag for notifying front action is header bidding. Use returned bid. * Duplicated properties fixed. * Correcting adaptermanager after wrong merge. Now all tests passes correctly. * Seting fl and jscb directly in the pageImpression-part of the url, since they are hardcoded. * Fixed above the fold parameter * No need to modify original value. * Normalizing file regarding single or double quotes. Also, properly indenting. * Removed uneeded properties: referrer (twice) and tagId. * Slightly better readiblity for variable declarations (and definition in some cases). * Refactoring regarding function naming and the way we set rank parameter. Also making sure we encode/decode site and page parameters. * Ignoring TypeScript's typing definitions. * Added initial WideOrbit Adapter tests covering url-creation part. * Completed wide orbit adapter tests with the one regarding callback response. * Slightly better test names. * Fix support for already prepared tracking pixels * Modified indenting according to coding standard * Code review fixes * Marked required parameters * Remove unused library from package.json Fix unit tests after refactoring * Added support for referrer * Added support for referrer * Updated line endings to UNIX style * Fixed formatting issue * Fix user matching identification for JavaScript type * Duplicated WideOrbit spec after merge * Made adapter more robust for server misconfiguration --- src/adapters/wideorbit.js | 7 +++++-- test/spec/adapters/wideorbit_spec.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/adapters/wideorbit.js b/src/adapters/wideorbit.js index 42356991577..b9e00ba7a82 100644 --- a/src/adapters/wideorbit.js +++ b/src/adapters/wideorbit.js @@ -133,6 +133,7 @@ var WideOrbitAdapter = function WideOrbitAdapter() { createdElem; utils._each(userMatchings, function (userMatching) { + createdElem = undefined; switch (userMatching.Type) { case 'redirect': createdElem = document.createElement('img'); @@ -146,8 +147,10 @@ var WideOrbitAdapter = function WideOrbitAdapter() { createdElem.async = true; break; } - createdElem.src = decodeURIComponent(userMatching.Url); - headElem.insertBefore(createdElem, headElem.firstChild); + if (createdElem) { + createdElem.src = decodeURIComponent(userMatching.Url); + headElem.insertBefore(createdElem, headElem.firstChild); + } }); } diff --git a/test/spec/adapters/wideorbit_spec.js b/test/spec/adapters/wideorbit_spec.js index 6f02ccbe316..2daeed974e6 100644 --- a/test/spec/adapters/wideorbit_spec.js +++ b/test/spec/adapters/wideorbit_spec.js @@ -489,6 +489,25 @@ describe('wideorbit adapter tests', function () { stubAddBidResponse.restore(); }); + it('should do nothing when type is set to unrecognized type', function () { + + var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse'); + + var response = { + UserMatchings: [ + { + Type: 'unrecognized', + Url: 'http%3A%2F%2Fwww.admeta.com%2F1.js' + } + ], + Placements: placements + }; + + $$PREBID_GLOBAL$$.handleWideOrbitCallback(response); + + stubAddBidResponse.restore(); + }); + }); }); From bb2a96f2d1c60fae201da91f2403544d73c62a1b Mon Sep 17 00:00:00 2001 From: Suren Silva Date: Wed, 12 Apr 2017 18:21:31 +0100 Subject: [PATCH 27/38] allow writing into current document if prebid is loaded inside an iframe (#1066) * allow writing into current document if prebid is loaded inside an iframe * updated tests to use utils.isiFrame instead of doc === window.document * only check doc === document in renderAd if not in iFrame * check for frameElement to prevent error in cross-origin iFrame case --- src/prebid.js | 2 +- src/utils.js | 11 ++++++++++- test/spec/unit/pbjs_api_spec.js | 8 +++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/prebid.js b/src/prebid.js index 6ccb5e6e58d..3e4def215ca 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -301,7 +301,7 @@ $$PREBID_GLOBAL$$.renderAd = function (doc, id) { var url = adObject.adUrl; var ad = adObject.ad; - if (doc === document || adObject.mediaType === 'video') { + if ((doc === document && !utils.inIframe()) || adObject.mediaType === 'video') { utils.logError(`Error trying to write ad. Ad render call ad id ${id} was prevented from writing to the main document.`); } else if (ad) { if (isSrcdocSupported(doc)) { diff --git a/src/utils.js b/src/utils.js index d56bd05a696..a4a31c874b2 100644 --- a/src/utils.js +++ b/src/utils.js @@ -583,9 +583,18 @@ export function adUnitsFilter(filter, bid) { */ export function isSrcdocSupported(doc) { //Firefox is excluded due to https://bugzilla.mozilla.org/show_bug.cgi?id=1265961 - return !!doc.defaultView && 'srcdoc' in doc.defaultView.frameElement && !/firefox/i.test(navigator.userAgent); + return doc.defaultView && doc.defaultView.frameElement && + 'srcdoc' in doc.defaultView.frameElement && !/firefox/i.test(navigator.userAgent); } export function cloneJson(obj) { return JSON.parse(JSON.stringify(obj)); +} + +export function inIframe() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } } \ No newline at end of file diff --git a/test/spec/unit/pbjs_api_spec.js b/test/spec/unit/pbjs_api_spec.js index 8452841362d..c1d093cfe00 100644 --- a/test/spec/unit/pbjs_api_spec.js +++ b/test/spec/unit/pbjs_api_spec.js @@ -513,6 +513,7 @@ describe('Unit: Prebid Module', function () { var adResponse = {}; var spyLogError = null; var spyLogMessage = null; + var inIframe = true; beforeEach(function () { doc = { @@ -535,6 +536,9 @@ describe('Unit: Prebid Module', function () { spyLogError = sinon.spy(utils, 'logError'); spyLogMessage = sinon.spy(utils, 'logMessage'); + + inIframe = true; + sinon.stub(utils, "inIframe", () => inIframe); }); afterEach(function () { @@ -542,6 +546,7 @@ describe('Unit: Prebid Module', function () { $$PREBID_GLOBAL$$._winningBids = []; utils.logError.restore(); utils.logMessage.restore(); + utils.inIframe.restore(); }); it('should require doc and id params', function () { @@ -576,7 +581,8 @@ describe('Unit: Prebid Module', function () { assert.ok(spyLogError.calledWith(error), 'expected error was logged'); }); - it('should log an error when doc is document', () => { + it('should log an error when not in an iFrame', () => { + inIframe = false; $$PREBID_GLOBAL$$.renderAd(document, bidId); const error = 'Error trying to write ad. Ad render call ad id ' + bidId + ' was prevented from writing to the main document.'; assert.ok(spyLogError.calledWith(error), 'expected error was logged'); From b913f9657636bc66089a78d78a4a57544d2a9db0 Mon Sep 17 00:00:00 2001 From: Nate Cozi Date: Thu, 13 Apr 2017 14:28:56 -0700 Subject: [PATCH 28/38] Yarn Package Manager (#1109) * add yarn.lock file * use yarn registry proxy * update README * link to yarn docs * link to yarn docs again closes RAD-1469 --- README.md | 17 +- yarn.lock | 7835 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 7845 insertions(+), 7 deletions(-) create mode 100644 yarn.lock diff --git a/README.md b/README.md index 03a2d1e31b4..e9e95f68161 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,11 @@ This README is for developers who want to contribute to Prebid.js. For user-fac $ git clone https://github.com/prebid/Prebid.js.git $ cd Prebid.js - $ npm install + $ yarn install -If you experience errors after a version update, try a fresh install: +Prebid now supports the `yarn` npm client. This is an alternative to using `npm` for package management, though `npm` will continue to work as before. - $ rm -rf ./node_modules && npm cache clean && npm install +For more info about yarn see https://yarnpkg.com @@ -64,19 +64,22 @@ For example, in `path/to/your/list-of-adapters.json`, write: Building with just these adapters will result in a smaller bundle which should allow your pages to load faster. **Build standalone prebid.js** +Prebid now supports the `yarn` npm client. This is an alternative to using `npm` for package management, though `npm` will continue to work as before. -- Clone the repo, run `npm install` +For more info about yarn see https://yarnpkg.com + +- Clone the repo, run `yarn install` - Duplicate `adapters.json` to e.g. `list-of-adapters.json` - Remove the unnecessary adapters from `list-of-adapters.json` - Then run the build: $ gulp build --adapters path/to/your/list-of-adapters.json -**Build prebid.js using NPM for bundling** +**Build prebid.js using Yarn for bundling** -In case you'd like to explicitly show that your project uses `prebid.js` and want a reproducible build, consider adding it as an `npm` dependency. +In case you'd like to explicitly show that your project uses `prebid.js` and want a reproducible build, consider adding it as an `yarn` dependency. -- Install `prebid.js` as an `npm` dependency of your project +- Add `prebid.js` as a `yarn` dependency of your project: `yarn add prebid.js` - Duplicate `node_modules/prebid.js/adapters.json` to under your project path, e.g. `path/to/your/list-of-adapters.json` - Remove the unnecessary adapters - Run the `prebid.js` build under the `node_modules/prebid.js/` folder diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..c35f7abae81 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7835 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"JSV@>= 4.0.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + +abbrev@1, abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@1.3.3, accepts@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +accepts@~1.2.12, accepts@~1.2.13: + version "1.2.13" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" + dependencies: + mime-types "~2.1.6" + negotiator "0.5.3" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.0, acorn@^3.0.4, acorn@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.3: + version "4.0.11" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + +adm-zip@~0.4.3: + version "0.4.7" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + +agent-base@2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" + dependencies: + extend "~3.0.0" + semver "~5.0.1" + +ajv@^4.9.1: + version "4.11.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alter@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" + dependencies: + stable "~0.1.3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escape-sequences@^2.2.1, ansi-escape-sequences@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-2.2.2.tgz#174c78d6f8b7de75f8957ae81c7f72210c701635" + dependencies: + array-back "^1.0.2" + collect-all "~0.2.1" + +ansi-escape-sequences@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz#1c18394b6af9b76ff9a63509fa497669fd2ce53e" + dependencies: + array-back "^1.0.3" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^1.0.0, ansi-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +app-usage-stats@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/app-usage-stats/-/app-usage-stats-0.4.1.tgz#97eb9b89b5678fa2ddc9793b1298628cc218429f" + dependencies: + array-back "^1.0.4" + core-js "^2.4.1" + feature-detect-es6 "^1.3.1" + home-path "^1.0.3" + test-value "^2.1.0" + usage-stats "^0.8.2" + +aproba@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + +archiver@~0.14.0, archiver@~0.14.3: + version "0.14.4" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.14.4.tgz#5b9ddb9f5ee1ceef21cb8f3b020e6240ecb4315c" + dependencies: + async "~0.9.0" + buffer-crc32 "~0.2.1" + glob "~4.3.0" + lazystream "~0.1.0" + lodash "~3.2.0" + readable-stream "~1.0.26" + tar-stream "~1.1.0" + zip-stream "~0.5.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.2, argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-back@^1.0.2, array-back@^1.0.3, array-back@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" + dependencies: + typical "^2.6.0" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-includes@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.2.tgz#7c867b4d1235c2b5687c874f3344bff4e002beba" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-tools@^1.0.6, array-tools@^1.1.0, array-tools@^1.1.4, array-tools@^1.8.4: + version "1.8.6" + resolved "https://registry.yarnpkg.com/array-tools/-/array-tools-1.8.6.tgz#145771f7f9c94e98cc5ea4196a99b8323aee18ae" + dependencies: + object-tools "^1.6.1" + typical "^2.1" + +array-tools@^2: + version "2.0.9" + resolved "https://registry.yarnpkg.com/array-tools/-/array-tools-2.0.9.tgz#5a511de7a41be0eec9ffdcd4912d0af9f0caca35" + dependencies: + ansi-escape-sequences "^2.2.2" + array-back "^1.0.2" + collect-json "^1.0.7" + filter-where "^1.0.1" + object-get "^2.0.0" + reduce-extract "^1.0.0" + reduce-flatten "^1.0.0" + reduce-unique "^1.0.0" + reduce-without "^1.0.0" + sort-array "^1.0.0" + test-value "^1.0.1" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array.from@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/array.from/-/array.from-0.2.0.tgz#2c627b1b76dff2def2365fa052b65c3d585e5f6b" + +array.prototype.find@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +asn1@0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assertion-error@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b" + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +ast-traverse@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" + +ast-types@0.8.12: + version "0.8.12" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" + +ast-types@0.9.6, ast-types@0.x.x: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@0.2.x, async@~0.2.10, async@~0.2.6, async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" + +async@1.x, async@^1.3.0, async@^1.4.0, async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^0.9.0, async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9" + dependencies: + lodash "^4.14.0" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" + +aws-sign2@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.0.2, babel-core@^6.24.1, babel-core@^6.5.2: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-core@~5.8.3: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" + dependencies: + babel-plugin-constant-folding "^1.0.1" + babel-plugin-dead-code-elimination "^1.0.2" + babel-plugin-eval "^1.0.1" + babel-plugin-inline-environment-variables "^1.0.1" + babel-plugin-jscript "^1.0.4" + babel-plugin-member-expression-literals "^1.0.1" + babel-plugin-property-literals "^1.0.1" + babel-plugin-proto-to-assign "^1.0.3" + babel-plugin-react-constant-elements "^1.0.3" + babel-plugin-react-display-name "^1.0.3" + babel-plugin-remove-console "^1.0.1" + babel-plugin-remove-debugger "^1.0.1" + babel-plugin-runtime "^1.0.7" + babel-plugin-undeclared-variables-check "^1.0.2" + babel-plugin-undefined-to-void "^1.1.6" + babylon "^5.8.38" + bluebird "^2.9.33" + chalk "^1.0.0" + convert-source-map "^1.1.0" + core-js "^1.0.0" + debug "^2.1.1" + detect-indent "^3.0.0" + esutils "^2.0.0" + fs-readdir-recursive "^0.1.0" + globals "^6.4.0" + home-or-tmp "^1.0.0" + is-integer "^1.0.4" + js-tokens "1.0.1" + json5 "^0.4.0" + lodash "^3.10.0" + minimatch "^2.0.3" + output-file-sync "^1.1.0" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + private "^0.1.6" + regenerator "0.8.40" + regexpu "^1.3.0" + repeating "^1.1.2" + resolve "^1.1.6" + shebang-regex "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + source-map-support "^0.2.10" + to-fast-properties "^1.0.0" + trim-right "^1.0.0" + try-resolve "^1.0.0" + +babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jscs@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/babel-jscs/-/babel-jscs-2.0.5.tgz#0a347046b48145acbca56e8c8ed5f736bc54f9d0" + dependencies: + babel-core "~5.8.3" + lodash.assign "^3.2.0" + +babel-loader@^6.2.3: + version "6.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.16" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-constant-folding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" + +babel-plugin-dead-code-elimination@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" + +babel-plugin-eval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" + +babel-plugin-inline-environment-variables@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" + +babel-plugin-jscript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" + +babel-plugin-member-expression-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" + +babel-plugin-property-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" + +babel-plugin-proto-to-assign@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" + dependencies: + lodash "^3.9.3" + +babel-plugin-react-constant-elements@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" + +babel-plugin-react-display-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" + +babel-plugin-remove-console@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" + +babel-plugin-remove-debugger@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" + +babel-plugin-runtime@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-es3-member-expression-literals@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz#733d3444f3ecc41bef8ed1a6a4e09657b8969ebb" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es3-property-literals@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz#b2078d5842e22abf40f73e8cde9cd3711abd5758" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-object-assign@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-undeclared-variables-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" + dependencies: + leven "^1.0.2" + +babel-plugin-undefined-to-void@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" + +babel-polyfill@^6.13.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-es2015@^6.5.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^5.8.38: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" + +babylon@^6.11.0, babylon@^6.15.0: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64-js@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +base64-url@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.1.tgz#199fd661702a0e7b7dcae6e0698bb089c52f6d78" + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +basic-auth-connect@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" + +basic-auth@~1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" + +batch@0.5.3, batch@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0, beeper@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +"binary@>= 0.3.0 < 1": + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +binaryextensions@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" + +bl@^0.9.0, bl@~0.9.0: + version "0.9.5" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" + dependencies: + readable-stream "~1.0.26" + +bl@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" + dependencies: + readable-stream "~2.0.5" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-loader@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/block-loader/-/block-loader-2.1.0.tgz#bbb398ad5a843c6c71f79a296f4b6df4b0257312" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^2.9.27, bluebird@^2.9.30, bluebird@^2.9.33: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + +bluebird@~3.4.6: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + +body-parser@^1.12.4: + version "1.17.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.1" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.14" + +body-parser@~1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.13.3.tgz#c08cf330c3358e151016a05746f13f029c97fa97" + dependencies: + bytes "2.1.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.0.1" + http-errors "~1.3.1" + iconv-lite "0.4.11" + on-finished "~2.3.0" + qs "4.0.0" + raw-body "~2.1.2" + type-is "~1.6.6" + +body-parser@~1.14.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" + dependencies: + bytes "2.2.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.3.1" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "5.2.0" + raw-body "~2.1.5" + type-is "~1.6.10" + +boom@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" + dependencies: + hoek "0.9.x" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +breakable@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +browserify-aes@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" + dependencies: + inherits "^2.0.1" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +browserstack@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.0.tgz#b565425ad62ed72c1082a1eb979d5313c7d4754f" + dependencies: + https-proxy-agent "1.0.0" + +browserstacktunnel-wrapper@~1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.4.2.tgz#6598fb7d784b6ff348e3df7c104b0d9c27ea5275" + dependencies: + unzip "~0.1.9" + +buffer-crc32@~0.2.1, buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer@^4.9.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4" + +bytes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +cache-point@~0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/cache-point/-/cache-point-0.3.4.tgz#152db502c6bb23b5aa3f663e230d5de8ec4e4f3f" + dependencies: + array-back "^1.0.3" + core-js "^2.4.1" + feature-detect-es6 "^1.3.1" + fs-then-native "^1.0.2" + mkdirp "~0.5.1" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2, camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +caseless@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.8.0.tgz#5bca2881d41437f54b2407ebe34888c7b9ad4f7d" + +caseless@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.9.0.tgz#b7b65ce6bf1413886539cfd533f0b30effa9cf88" + +catharsis@~0.8.8: + version "0.8.8" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.8.tgz#693479f43aac549d806bd73e924cd0d944951a06" + dependencies: + underscore-contrib "~0.3.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai-nightwatch@~0.1.x: + version "0.1.1" + resolved "https://registry.yarnpkg.com/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz#1ca56de768d3c0868fe7fc2f4d32c2fe894e6be9" + dependencies: + assertion-error "1.0.0" + deep-eql "0.1.3" + +chai@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +chokidar@^1.0.0, chokidar@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cli-commands@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cli-commands/-/cli-commands-0.1.0.tgz#c57cacc406bbcf9ee21646607161ed432ef5a05a" + dependencies: + ansi-escape-sequences "^3.0.0" + command-line-args "^3.0.1" + command-line-commands "^1.0.4" + command-line-usage "^3.0.5" + +cli-table@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-width@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d" + +cli@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + dependencies: + exit "0.1.2" + glob "^7.1.1" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.0.3, cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +cloneable-readable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + dependencies: + inherits "^2.0.1" + process-nextick-args "^1.0.6" + through2 "^2.0.1" + +co@^4.5.4, co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +co@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/co/-/co-3.0.6.tgz#1445f226c5eb956138e68c9ac30167ea7d2e6bda" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +coffee-script@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.8.0.tgz#9c9f1d2b4a52a000ded15b659791703648263c1d" + dependencies: + mkdirp "~0.3.5" + +collect-all@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-all/-/collect-all-1.0.2.tgz#39450f1e7aa6086570a006bce93ccf1218a77ea1" + dependencies: + stream-connect "^1.0.2" + stream-via "^1.0.3" + +collect-all@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/collect-all/-/collect-all-0.2.1.tgz#7225fb4585c22d4ffac886f0abaf5abc563a1a6a" + dependencies: + stream-connect "^1.0.1" + stream-via "~0.1.0" + typical "^2.3.0" + +collect-json@^1.0.1, collect-json@^1.0.7, collect-json@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/collect-json/-/collect-json-1.0.8.tgz#aa2fa52b4d1d9444ce690f07a1e3617ab74bb827" + dependencies: + collect-all "^1.0.2" + stream-connect "^1.0.2" + stream-via "^1.0.3" + +colors@0.6.x: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +column-layout@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/column-layout/-/column-layout-2.1.4.tgz#ed2857092ccf8338026fe538379d9672d70b3641" + dependencies: + ansi-escape-sequences "^2.2.2" + array-back "^1.0.3" + collect-json "^1.0.8" + command-line-args "^2.1.6" + core-js "^2.4.0" + deep-extend "~0.4.1" + feature-detect-es6 "^1.2.0" + object-tools "^2.0.6" + typical "^2.4.2" + wordwrapjs "^1.2.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +combined-stream@~0.0.4, combined-stream@~0.0.5: + version "0.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" + dependencies: + delayed-stream "0.0.5" + +command-line-args@^2.1.4, command-line-args@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-2.1.6.tgz#f197d6eaff34c9085577484b2864375b294f5697" + dependencies: + array-back "^1.0.2" + command-line-usage "^2" + core-js "^2.0.1" + feature-detect-es6 "^1.2.0" + find-replace "^1" + typical "^2.3.0" + +command-line-args@^3.0.0, command-line-args@^3.0.1: + version "3.0.5" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-3.0.5.tgz#5bd4ad45e7983e5c1344918e40280ee2693c5ac0" + dependencies: + array-back "^1.0.4" + feature-detect-es6 "^1.3.1" + find-replace "^1.0.2" + typical "^2.6.0" + +command-line-commands@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/command-line-commands/-/command-line-commands-1.0.4.tgz#034f9b167b5188afbdcf6b2efbb150fc8442c32b" + dependencies: + array-back "^1.0.3" + feature-detect-es6 "^1.3.1" + +command-line-tool@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/command-line-tool/-/command-line-tool-0.1.0.tgz#91a11ba48ac63a4a687554367980f7c6423c149d" + dependencies: + ansi-escape-sequences "^2.2.1" + array-back "^1.0.2" + +command-line-tool@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/command-line-tool/-/command-line-tool-0.5.2.tgz#f87d6977f56bbdd2d5dfcf946345dd2cd9c6a53a" + dependencies: + ansi-escape-sequences "^2.2.2" + array-back "^1.0.3" + command-line-args "^3.0.0" + command-line-usage "^3.0.3" + feature-detect-es6 "^1.3.0" + typical "^2.4.2" + +command-line-usage@^2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-2.0.5.tgz#f80c35ca5e8624841923ea3be3b9bfbf4f7be27b" + dependencies: + ansi-escape-sequences "^2.2.2" + array-back "^1.0.3" + column-layout "^2.1.1" + feature-detect-es6 "^1.2.0" + typical "^2.4.2" + wordwrapjs "^1.2.0" + +command-line-usage@^3.0.3, command-line-usage@^3.0.5: + version "3.0.8" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-3.0.8.tgz#b6a20978c1b383477f5c11a529428b880bfe0f4d" + dependencies: + ansi-escape-sequences "^3.0.0" + array-back "^1.0.3" + feature-detect-es6 "^1.3.1" + table-layout "^0.3.0" + typical "^2.6.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +commander@2.9.0, commander@^2.5.0, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +comment-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.3.1.tgz#fd657aac8c1492d308c9a6100fc9b49d2435aba1" + dependencies: + readable-stream "^2.0.4" + +common-sequence@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/common-sequence/-/common-sequence-1.0.2.tgz#30e07f3f8f6f7f9b3dee854f20b2d39eee086de8" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +commoner@~0.10.3: + version "0.10.8" + resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" + dependencies: + commander "^2.5.0" + detective "^4.3.1" + glob "^5.0.15" + graceful-fs "^4.1.2" + iconv-lite "^0.4.5" + mkdirp "^0.5.0" + private "^0.1.6" + q "^1.1.2" + recast "^0.11.17" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +compress-commons@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.2.9.tgz#422d927430c01abd06cd455b6dfc04cb4cf8003c" + dependencies: + buffer-crc32 "~0.2.1" + crc32-stream "~0.3.1" + node-int64 "~0.3.0" + readable-stream "~1.0.26" + +compressible@~2.0.5: + version "2.0.10" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" + dependencies: + mime-db ">= 1.27.0 < 2" + +compression@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395" + dependencies: + accepts "~1.2.12" + bytes "2.1.0" + compressible "~2.0.5" + debug "~2.2.0" + on-headers "~1.0.0" + vary "~1.0.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +concat-stream@^1.4.7, concat-stream@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" + dependencies: + source-map "^0.5.1" + +config-master@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/config-master/-/config-master-2.0.4.tgz#e749505c5d3f946f2fad3c76dfe71fca689751dc" + dependencies: + babel-polyfill "^6.13.0" + feature-detect-es6 "^1.3.1" + walk-back "^2.0.1" + +connect-livereload@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.5.4.tgz#80157d1371c9f37cc14039ab1895970d119dc3bc" + +connect-timeout@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e" + dependencies: + debug "~2.2.0" + http-errors "~1.3.1" + ms "0.7.1" + on-headers "~1.0.0" + +connect@^2.30.0: + version "2.30.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-2.30.2.tgz#8da9bcbe8a054d3d318d74dfec903b5c39a1b609" + dependencies: + basic-auth-connect "1.0.0" + body-parser "~1.13.3" + bytes "2.1.0" + compression "~1.5.2" + connect-timeout "~1.6.2" + content-type "~1.0.1" + cookie "0.1.3" + cookie-parser "~1.3.5" + cookie-signature "1.0.6" + csurf "~1.8.3" + debug "~2.2.0" + depd "~1.0.1" + errorhandler "~1.4.2" + express-session "~1.11.3" + finalhandler "0.4.0" + fresh "0.3.0" + http-errors "~1.3.1" + method-override "~2.3.5" + morgan "~1.6.1" + multiparty "3.3.2" + on-headers "~1.0.0" + parseurl "~1.3.0" + pause "0.1.0" + qs "4.0.0" + response-time "~2.3.1" + serve-favicon "~2.3.0" + serve-index "~1.7.2" + serve-static "~1.10.0" + type-is "~1.6.6" + utils-merge "1.0.0" + vhost "~3.0.1" + +connect@^3.3.5: + version "3.6.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.0.tgz#f09a4f7dcd17324b663b725c815bdb1c4158a46e" + dependencies: + debug "2.6.1" + finalhandler "1.0.0" + parseurl "~1.3.1" + utils-merge "1.0.0" + +console-browserify@1.1.x, console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-type@~1.0.1, content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-parser@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.0.1, core-js@^2.1.0, core-js@^2.4.0, core-js@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +coveralls@^2.11.11: + version "2.13.0" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.0.tgz#df933876e8c6f478efb04f4d3ab70dc96b7e5a8e" + dependencies: + js-yaml "3.6.1" + lcov-parse "0.0.10" + log-driver "1.2.5" + minimist "1.2.0" + request "2.79.0" + +crc32-stream@~0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552" + dependencies: + buffer-crc32 "~0.2.1" + readable-stream "~1.0.24" + +crc@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba" + +cryptiles@0.2.x: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" + dependencies: + boom "0.4.x" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" + dependencies: + browserify-aes "0.4.0" + pbkdf2-compat "2.0.1" + ripemd160 "0.2.0" + sha.js "2.2.6" + +csrf@~3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.6.tgz#b61120ddceeafc91e76ed5313bb5c0b2667b710a" + dependencies: + rndm "1.2.0" + tsscmp "1.0.5" + uid-safe "2.1.4" + +css-loader@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.9.1.tgz#2e1aa00ce7e30ef2c6a7a4b300a080a7c979e0dc" + dependencies: + csso "1.3.x" + loader-utils "~0.2.2" + source-map "~0.1.38" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + dependencies: + css "^2.0.0" + +css-value@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" + +css@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.3.0" + urix "^0.1.0" + +csso@1.3.x: + version "1.3.12" + resolved "https://registry.yarnpkg.com/csso/-/csso-1.3.12.tgz#fc628694a2d38938aaac4996753218fd311cdb9e" + +csurf@~1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/csurf/-/csurf-1.8.3.tgz#23f2a13bf1d8fce1d0c996588394442cba86a56a" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + csrf "~3.0.0" + http-errors "~1.3.1" + +ctype@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +"dargs@github:christian-bromann/dargs": + version "4.0.1" + resolved "https://codeload.github.com/christian-bromann/dargs/tar.gz/7d6d4164a7c4106dbd14ef39ed8d95b7b5e9b770" + dependencies: + number-is-nan "^1.0.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data-uri-to-buffer@0: + version "0.0.4" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz#46e13ab9da8e309745c8d01ce547213ebdb2fe3f" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^1.0.7-1.2.3, dateformat@~1.0.6: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +ddata@~0.1.25: + version "0.1.28" + resolved "https://registry.yarnpkg.com/ddata/-/ddata-0.1.28.tgz#53138fafa3f01749ea2451d12b6b6dd9df1d5b1f" + dependencies: + array-back "^1.0.3" + core-js "^2.4.1" + handlebars "^3.0.3" + marked "~0.3.6" + object-get "^2.1.0" + reduce-flatten "^1.0.1" + string-tools "^1.0.0" + test-value "^2.0.0" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2, debug@2.6.3, debug@^2.1.1, debug@^2.2.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" + dependencies: + ms "0.7.2" + +debug@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.0.0.tgz#89bd9df6732b51256bc6705342bba02ed12131ef" + dependencies: + ms "0.6.2" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" + dependencies: + ms "0.7.2" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-eql@0.1.3, deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +deep-equal@*: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@~0.4.0, deep-extend@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +"deepmerge@>=0.2.7 <0.3.0-0", deepmerge@^0.2.7, deepmerge@~0.2.7: + version "0.2.10" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-0.2.10.tgz#8906bf9e525a4fbf1b203b2afcb4640249821219" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +defer-promise@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defer-promise/-/defer-promise-1.0.1.tgz#1ca6ffeddbcef1715dd7aae25c7616f9ae22932f" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +defs@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" + dependencies: + alter "~0.2.0" + ast-traverse "~0.1.1" + breakable "~1.0.0" + esprima-fb "~15001.1001.0-dev-harmony-fb" + simple-fmt "~0.1.0" + simple-is "~0.2.0" + stringmap "~0.2.2" + stringset "~0.2.1" + tryor "~0.1.2" + yargs "~3.27.0" + +degenerator@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" + dependencies: + ast-types "0.x.x" + escodegen "1.x.x" + esprima "3.x.x" + +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.0, depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +depd@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-indent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detective@^4.3.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1" + dependencies: + acorn "^4.0.3" + defined "^1.0.0" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + +diff@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.0.8.tgz#343276308ec991b7bc82267ed55bc1411f971666" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +dmd@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/dmd/-/dmd-1.4.2.tgz#b1304b98a5700a6bfe5dcf91be657c981700a4bc" + dependencies: + array-back "^1.0.3" + command-line-tool "~0.5.0" + common-sequence "^1.0.2" + ddata "~0.1.25" + file-set "^1.0.0" + handlebars-array "^0.2.0" + handlebars-comparison "^2.0.0" + handlebars-json "^1.0.0" + handlebars-regexp "^1.0.0" + handlebars-string "^2.0.1" + object-tools "^2.0.6" + reduce-unique "^1.0.0" + reduce-without "^1.0.1" + stream-handlebars "~0.1.6" + string-tools "^1.0.0" + walk-back "^2.0.1" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-0.8.3.tgz#db8aac47ff80a7df82b4c82c126fe8970870626f" + +ejs@^2.3.1, ejs@^2.5.1: + version "2.5.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +engine.io-client@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.2" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.2" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.7" + wtf-8 "1.0.0" + +engine.io@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" + dependencies: + accepts "1.3.3" + base64id "1.0.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.2" + ws "1.1.2" + +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +errno@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +errorhandler@~1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f" + dependencies: + accepts "~1.3.0" + escape-html "~1.0.3" + +es-abstract@^1.5.0, es-abstract@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.0" + is-callable "^1.1.3" + is-regex "^1.0.3" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.15" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.15.tgz#c330a5934c1ee21284a7c081a86e5fd937c91ea6" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es5-shim@^4.5.2: + version "4.5.9" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.9.tgz#2a1e2b9e583ff5fed0c20a3ee2cbf3f75230a5c0" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.2.tgz#d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.2, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@1.7.x, escodegen@1.x.x: + version "1.7.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.7.1.tgz#30ecfcf66ca98dc67cd2fd162abeb6eafa8ce6fc" + dependencies: + esprima "^1.2.2" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.5.0" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.2.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +espree@~3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.1.7.tgz#fd5deec76a97a5120a9cd3a7cb1177a0923b11d2" + dependencies: + acorn "^3.3.0" + acorn-jsx "^3.0.0" + +esprima-fb@~15001.1001.0-dev-harmony-fb: + version "15001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" + +esprima@1.2.x, esprima@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" + +esprima@2.5.x: + version "2.5.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" + +esprima@3.x.x, esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^2.6.0, esprima@~2.7.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.8.0.tgz#3f1264fb62c8500dbae5e4f73705cd576d6af428" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +estree-walker@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@^3.3.2: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +event-stream@~3.0.18, event-stream@~3.0.20: + version "3.0.20" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.0.20.tgz#038bbb2ea9ea90385b26fbc1854d0b539f2abea3" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.0.3" + pause-stream "0.0.11" + split "0.2" + stream-combiner "~0.0.3" + through "~2.3.1" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +exit@0.1.2, exit@0.1.x, exit@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.1, expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expect.js@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.3.1.tgz#b0a59a0d2eff5437544ebf0ceaa6015841d09b5b" + +express-session@~1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.11.3.tgz#5cc98f3f5ff84ed835f91cbf0aabd0c7107400af" + dependencies: + cookie "0.1.3" + cookie-signature "1.0.6" + crc "3.3.0" + debug "~2.2.0" + depd "~1.0.1" + on-headers "~1.0.0" + parseurl "~1.3.0" + uid-safe "~2.0.0" + utils-merge "1.0.0" + +extend@3, extend@^3.0.0, extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-zip@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" + dependencies: + concat-stream "1.5.0" + debug "0.7.4" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +faker@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fast-levenshtein@~1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" + +faye-websocket@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +feature-detect-es6@^1.2.0, feature-detect-es6@^1.3.0, feature-detect-es6@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/feature-detect-es6/-/feature-detect-es6-1.3.1.tgz#f888736af9cb0c91f55663bfa4762eb96ee7047f" + dependencies: + array-back "^1.0.3" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-loader@^0.8.1: + version "0.8.5" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.8.5.tgz#9275d031fe780f27d47f5f4af02bd43713cc151b" + dependencies: + loader-utils "~0.2.5" + +file-set@^1.0.0, file-set@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/file-set/-/file-set-1.1.1.tgz#d3ec70c080ec8f18f204ba1de106780c9056926b" + dependencies: + array-back "^1.0.3" + glob "^7.1.0" + +file-set@~0.2.1: + version "0.2.8" + resolved "https://registry.yarnpkg.com/file-set/-/file-set-0.2.8.tgz#73a6571e9cbe51ac5926c88bd567d111f836f178" + dependencies: + array-tools "^2" + glob "^4" + +file-uri-to-path@0: + version "0.0.2" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz#37cdd1b5b905404b3f05e1b23645be694ff70f82" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" + dependencies: + glob "3.x" + minimatch "0.x" + +fileset@0.2.x: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" + dependencies: + glob "5.x" + minimatch "2.x" + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +filter-where@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/filter-where/-/filter-where-1.0.1.tgz#1b042569edce36bc1c4e9f73740d2c4e2feef77d" + dependencies: + test-value "^1.0.1" + +finalhandler@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b" + dependencies: + debug "~2.2.0" + escape-html "1.0.2" + on-finished "~2.3.0" + unpipe "~1.0.0" + +finalhandler@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.0.tgz#b5691c2c0912092f18ac23e9416bde5cd7dc6755" + dependencies: + debug "2.6.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-replace@^1, find-replace@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" + dependencies: + array-back "^1.0.4" + test-value "^2.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + dependencies: + expand-tilde "^1.2.1" + lodash.assignwith "^4.0.7" + lodash.isempty "^4.2.1" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.pick "^4.2.1" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +foreachasync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" + +forever-agent@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" + +forever-agent@~0.6.0, forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" + dependencies: + async "~0.9.0" + combined-stream "~0.0.4" + mime "~1.2.11" + +form-data@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.2.0.tgz#26f8bc26da6440e299cbdcfb69035c4f77a6e466" + dependencies: + async "~0.9.0" + combined-stream "~0.0.4" + mime-types "~2.0.3" + +form-data@~1.0.0-rc3: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + dependencies: + null-check "^1.0.0" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@~0.26.4: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@~0.6.1: + version "0.6.4" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.6.4.tgz#f46f0c75b7841f8d200b3348cd4d691d5a099d15" + dependencies: + jsonfile "~1.0.1" + mkdirp "0.3.x" + ncp "~0.4.2" + rimraf "~2.2.0" + +fs-readdir-recursive@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" + +fs-then-native@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fs-then-native/-/fs-then-native-1.0.2.tgz#ac8d3807c9f1bbd1279607fb228e0ab649bb41fe" + dependencies: + feature-detect-es6 "^1.3.1" + +fs.extra@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fs.extra/-/fs.extra-1.3.2.tgz#dd023f93013bee24531f1b33514c37b20fd93349" + dependencies: + fs-extra "~0.6.1" + mkdirp "~0.3.5" + walk "^2.3.9" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +"fstream@>= 0.1.30 < 1": + version "0.1.31" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" + dependencies: + graceful-fs "~3.0.2" + inherits "~2.0.0" + mkdirp "0.5" + rimraf "2" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +ftp@~0.3.5: + version "0.3.10" + resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + dependencies: + readable-stream "1.1.x" + xregexp "2.0.0" + +function-bind@^1.0.2, function-bind@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-uri@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-1.1.0.tgz#7375d04daf7fcb584b3632679cbdf339b51bb149" + dependencies: + data-uri-to-buffer "0" + debug "2" + extend "3" + file-uri-to-path "0" + ftp "~0.3.5" + readable-stream "2" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@3.2.11, glob@3.x: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" + dependencies: + graceful-fs "~2.0.0" + inherits "2" + minimatch "~0.2.11" + +glob@5.x, glob@^5.0.1, glob@^5.0.10, glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^4, glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +glob@~4.3.0: + version "4.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.3.5.tgz#80fbb08ca540f238acce5d11d1e9bc41e75173d3" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globals@^6.4.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" + +globals@^9.0.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0, graceful-fs@~3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +graceful-fs@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +gulp-babel@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-6.1.2.tgz#7c0176e4ba3f244c60588a0c4b320a45d1adefce" + dependencies: + babel-core "^6.0.2" + gulp-util "^3.0.0" + object-assign "^4.0.1" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-clean@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.3.2.tgz#a347d473acea40182f935587a451941671928102" + dependencies: + gulp-util "^2.2.14" + rimraf "^2.2.8" + through2 "^0.4.2" + +gulp-concat@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" + dependencies: + concat-with-sourcemaps "^1.0.0" + through2 "^2.0.0" + vinyl "^2.0.0" + +gulp-connect@^2.0.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gulp-connect/-/gulp-connect-2.3.1.tgz#14ae7173328b691252b01fc1930a39cbb24fb33c" + dependencies: + connect "^2.30.0" + connect-livereload "^0.5.4" + event-stream "^3.3.2" + gulp-util "^3.0.6" + tiny-lr "^0.2.1" + +gulp-header@^1.7.1: + version "1.8.8" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.8.tgz#4509c64677aab56b5ee8e4669a79b1655933a49e" + dependencies: + concat-with-sourcemaps "*" + gulp-util "*" + object-assign "*" + through2 "^2.0.0" + +gulp-jscs@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gulp-jscs/-/gulp-jscs-3.0.2.tgz#dc7fbb01ce2bfc8325bba7cbbf95d65e43530478" + dependencies: + gulp-util "^3.0.4" + jscs "^2.1.1" + through2 "^2.0.0" + tildify "^1.0.0" + +gulp-jsdoc-to-markdown@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-jsdoc-to-markdown/-/gulp-jsdoc-to-markdown-1.2.2.tgz#bd0e267e3972bc169e7bdb992f967823b023fefd" + dependencies: + gulp-util "^3.0.7" + jsdoc-to-markdown "^1.3.4" + through2 "^2.0.1" + +gulp-jshint@^1.8.4: + version "1.12.0" + resolved "https://registry.yarnpkg.com/gulp-jshint/-/gulp-jshint-1.12.0.tgz#23fbd1bafdd6fbfe61ea64667a74809a961d03de" + dependencies: + gulp-util "^3.0.0" + jshint "^2.7.0" + lodash "^3.0.1" + minimatch "^2.0.1" + rcloader "0.1.2" + through2 "~0.6.1" + +gulp-karma@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/gulp-karma/-/gulp-karma-0.0.4.tgz#65cc202483f25369966ed60ff5dba1f6476131bd" + dependencies: + event-stream "~3.0.20" + gulp-util "~2.2.14" + optimist "~0.6.0" + xtend "~2.1.1" + +gulp-mocha@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-2.2.0.tgz#1ce5eba4b94b40c7436afec3c4982c8eea894192" + dependencies: + gulp-util "^3.0.0" + mocha "^2.0.1" + plur "^2.1.0" + resolve-from "^1.0.0" + temp "^0.8.3" + through "^2.3.4" + +gulp-optimize-js@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-optimize-js/-/gulp-optimize-js-1.1.0.tgz#5fd15c68b36f6e1e7387784f8578435f75696245" + dependencies: + gulp-util "^3.0.7" + lodash "^4.16.2" + optimize-js "^1.0.0" + through2 "^2.0.1" + +gulp-rename@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" + +gulp-replace@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-0.4.0.tgz#e22bc9c03e9d051b32881cc589bd3e8c4e54168a" + dependencies: + event-stream "~3.0.18" + istextorbinary "~1.0.0" + replacestream "0.1.3" + +gulp-shell@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.5.2.tgz#a4959ca0651ad1c7bbfe70b2d0adbbb4e1aea98d" + dependencies: + async "^1.5.0" + gulp-util "^3.0.7" + lodash "^4.0.0" + through2 "^2.0.0" + +gulp-uglify@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-0.3.2.tgz#fa37bf6d4ad9a29a349c6cba862abb22eba67aac" + dependencies: + deepmerge ">=0.2.7 <0.3.0-0" + gulp-util ">=3.0.0 <4.0.0-0" + through2 ">=0.6.1 <1.0.0-0" + uglify-js "2.4.6" + +gulp-util@*, "gulp-util@>=3.0.0 <4.0.0-0", gulp-util@^3.0.0, gulp-util@^3.0.4, gulp-util@^3.0.6, gulp-util@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@^2.2.14, gulp-util@~2.2.14: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp-webdriver@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-webdriver/-/gulp-webdriver-1.0.3.tgz#98ce81cf9ae06a7a1907b86d10f69386f4383a2d" + dependencies: + dargs christian-bromann/dargs + deepmerge "^0.2.7" + gulp-util "^3.0.4" + through2 "^0.6.5" + webdriverio "^3.4.0" + +gulp-zip@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-3.2.0.tgz#ebd198dae6dc2d5f44d814569c8ec42118a93ef9" + dependencies: + chalk "^1.0.0" + concat-stream "^1.4.7" + gulp-util "^3.0.0" + through2 "^2.0.1" + yazl "^2.1.0" + +gulp@^3.8.7: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +handlebars-array@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/handlebars-array/-/handlebars-array-0.2.1.tgz#dd58395a5261d661988e8d77520ebbfaadc6bd24" + dependencies: + array-tools "^1.1.4" + +handlebars-comparison@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handlebars-comparison/-/handlebars-comparison-2.0.1.tgz#b17b95d2c298578e4aead38f5fac46e8f6005855" + dependencies: + array-tools "^1.1.0" + +handlebars-json@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/handlebars-json/-/handlebars-json-1.0.1.tgz#2ef87bb782551cd645bb4691b824e9653ec02504" + +handlebars-regexp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/handlebars-regexp/-/handlebars-regexp-1.0.1.tgz#5f47f067260e9ba8e52f1a280917f70de39f11e4" + +handlebars-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/handlebars-string/-/handlebars-string-2.0.2.tgz#b9f92208a979cfcf51ff4a90defa183dc62942ca" + dependencies: + array-tools "^1.0.6" + string-tools "^0.1.4" + +handlebars@^3.0.0, handlebars@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-3.0.3.tgz#0e09651a2f0fb3c949160583710d551f92e6d2ad" + dependencies: + optimist "^0.6.1" + source-map "^0.1.40" + optionalDependencies: + uglify-js "~2.3" + +handlebars@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@^1.4.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-1.8.0.tgz#d83842b0eb4c435960aeb108a067a3aa94c0eeb2" + dependencies: + bluebird "^2.9.30" + chalk "^1.0.0" + commander "^2.8.1" + is-my-json-valid "^2.12.0" + +har-validator@~2.0.2, har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" + dependencies: + boom "0.4.x" + cryptiles "0.2.x" + hoek "0.9.x" + sntp "0.2.x" + +hawk@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-2.3.1.tgz#1e731ce39447fa1d0f6d707f7bceebec0fd1ec1f" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~3.1.0, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@0.9.x: + version "0.9.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" + dependencies: + os-tmpdir "^1.0.1" + user-home "^1.1.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +home-path@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" + +homedir-polyfill@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8" + +htmlparser2@3.8.3, htmlparser2@3.8.x: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-errors@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" + dependencies: + inherits "~2.0.1" + statuses "1" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-proxy-agent@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz#cc1ce38e453bf984a0f7702d2dd59c73d081284a" + dependencies: + agent-base "2" + debug "2" + extend "3" + +http-proxy@^1.13.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" + dependencies: + asn1 "0.1.11" + assert-plus "^0.1.5" + ctype "0.5.3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +https-proxy-agent@1, https-proxy-agent@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + dependencies: + agent-base "2" + debug "2" + extend "3" + +i@0.3.x: + version "0.3.5" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" + +ibrik@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ibrik/-/ibrik-2.0.0.tgz#89a2434f2a5c82b92166c3d97de3b5636eea2e9c" + dependencies: + coffee-script "~1.8.0" + esprima "1.2.x" + estraverse "~1.8.0" + fileset "0.1.x" + istanbul "~0.3.2" + lodash "~2.4.1" + mkdirp "~0.5.0" + optimist "~0.6.1" + which "~1.0.5" + +iconv-lite@0.4.11: + version "0.4.11" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.11.tgz#2ecb42fd294744922209a2e7c404dac8793d8ade" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@0.4.15, iconv-lite@^0.4.5: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherit@^2.2.2: + version "2.2.6" + resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.6.tgz#f1614b06c8544e8128e4229c86347db73ad9788d" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.8.5.tgz#dbd740cf6ca3b731296a63ce6f6d961851f336df" + dependencies: + ansi-regex "^1.1.1" + chalk "^1.0.0" + cli-width "^1.0.1" + figures "^1.3.5" + lodash "^3.3.1" + readline2 "^0.1.1" + rx "^2.4.3" + through "^2.3.6" + +interpret@^0.6.4: + version "0.6.6" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" + +interpret@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.2.tgz#f4f623f0bb7122f15f5717c8e254b8161b5c5b2d" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +irregular-plurals@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-generator@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-integer@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.6.tgz#5273819fada880d123e1ac00a938e7172dd8d95e" + dependencies: + is-finite "^1.0.0" + +is-my-json-valid@^2.12.0, is-my-json-valid@^2.12.4: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-object@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-regex@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@0.1.x, isstream@~0.1.1, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-instrumenter-loader@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-0.1.3.tgz#71394c509594ed707ef280a7c7145207de7e2a50" + dependencies: + istanbul "0.x.x" + +istanbul@0.x.x, istanbul@^0.3.2, istanbul@~0.3.0, istanbul@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.3.22.tgz#3e164d85021fe19c985d1f0e7ef0c3e22d012eb6" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.7.x" + esprima "2.5.x" + fileset "0.2.x" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +istextorbinary@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" + dependencies: + binaryextensions "~1.0.0" + textextensions "~1.0.0" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@3.6.1, js-yaml@3.x: + version "3.6.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +js-yaml@~3.4.0: + version "3.4.6" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.6.tgz#6be1b23f6249f53d293370fd4d1aaa63ce1b4eb0" + dependencies: + argparse "^1.0.2" + esprima "^2.6.0" + inherit "^2.2.2" + +js2xmlparser@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-1.0.0.tgz#5a170f2e8d6476ce45405e04823242513782fe30" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jscs-jsdoc@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz#1f2c82b6ab4b97524da958f46b4e562e0305f9a7" + dependencies: + comment-parser "^0.3.1" + jsdoctypeparser "~1.2.0" + +jscs-preset-wikimedia@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz#fff563342038fc2e8826b7bb7309c3ae3406fc7e" + +jscs@^2.1.1: + version "2.11.0" + resolved "https://registry.yarnpkg.com/jscs/-/jscs-2.11.0.tgz#6e11ef0caaa07731f9dcc2b2b27d8ecee1ddbcb6" + dependencies: + babel-jscs "^2.0.0" + chalk "~1.1.0" + cli-table "~0.3.1" + commander "~2.9.0" + escope "^3.2.0" + esprima "~2.7.0" + estraverse "^4.1.0" + exit "~0.1.2" + glob "^5.0.1" + htmlparser2 "3.8.3" + js-yaml "~3.4.0" + jscs-jsdoc "^1.3.1" + jscs-preset-wikimedia "~1.0.0" + jsonlint "~1.6.2" + lodash "~3.10.0" + minimatch "~3.0.0" + natural-compare "~1.2.2" + pathval "~0.1.1" + prompt "~0.2.14" + reserved-words "^0.1.1" + resolve "^1.1.6" + strip-bom "^2.0.0" + strip-json-comments "~1.0.2" + to-double-quotes "^2.0.0" + to-single-quotes "^2.0.0" + vow "~0.4.8" + vow-fs "~0.3.4" + xmlbuilder "^3.1.0" + +jsdoc-75lb@^3.5.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jsdoc-75lb/-/jsdoc-75lb-3.6.0.tgz#a807119528b4009ccbcab49b7522f63fec6cd0bd" + dependencies: + bluebird "~3.4.6" + catharsis "~0.8.8" + escape-string-regexp "~1.0.5" + espree "~3.1.7" + js2xmlparser "~1.0.0" + klaw "~1.3.0" + marked "~0.3.6" + mkdirp "~0.5.1" + requizzle "~0.2.1" + strip-json-comments "~2.0.1" + taffydb "2.6.2" + underscore "~1.8.3" + +jsdoc-api@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/jsdoc-api/-/jsdoc-api-1.2.4.tgz#5012235927bfad1e27bc88d07b0ddddb2d3a8a59" + dependencies: + array-back "^1.0.3" + cache-point "~0.3.3" + collect-all "^1.0.2" + core-js "^2.4.1" + feature-detect-es6 "^1.3.1" + file-set "^1.0.1" + jsdoc-75lb "^3.5.6" + object-to-spawn-args "^1.1.0" + promise.prototype.finally "^1.0.1" + temp-path "^1.0.0" + then-fs "^2.0.0" + walk-back "^2.0.1" + +jsdoc-parse@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/jsdoc-parse/-/jsdoc-parse-1.2.7.tgz#54b7481b3cd6bcb7c173dc4fa69ee92735ea2525" + dependencies: + ansi-escape-sequences "^2.2.1" + array-tools "^2" + collect-json "^1.0.1" + command-line-args "^2.1.4" + command-line-tool "^0.1.0" + core-js "^2.0.1" + feature-detect-es6 "^1.2.0" + file-set "~0.2.1" + jsdoc-api "^1.0.0" + object-tools "^2" + stream-connect "^1.0.1" + test-value "^1.0.1" + +jsdoc-to-markdown@^1.3.4: + version "1.3.9" + resolved "https://registry.yarnpkg.com/jsdoc-to-markdown/-/jsdoc-to-markdown-1.3.9.tgz#774c0ece0ebd0bcc3261b2c9a2aa8d1399a61472" + dependencies: + ansi-escape-sequences "^3.0.0" + command-line-args "^3.0.1" + command-line-usage "^3.0.5" + config-master "^2.0.4" + dmd "^1.4.1" + jsdoc-parse "^1.2.7" + jsdoc2md-stats "^1.0.3" + object-tools "^2.0.6" + stream-connect "^1.0.2" + +jsdoc2md-stats@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/jsdoc2md-stats/-/jsdoc2md-stats-1.0.6.tgz#dc0e002aebbd0fbae5123534f92732afbc651fbf" + dependencies: + app-usage-stats "^0.4.0" + feature-detect-es6 "^1.3.1" + +jsdoctypeparser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz#e7dedc153a11849ffc5141144ae86a7ef0c25392" + dependencies: + lodash "^3.7.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +jshint-stylish@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jshint-stylish/-/jshint-stylish-2.2.1.tgz#242082a2c035ae03fd81044e0570cc4208cf6e61" + dependencies: + beeper "^1.1.0" + chalk "^1.0.0" + log-symbols "^1.0.0" + plur "^2.1.0" + string-length "^1.0.0" + text-table "^0.2.0" + +jshint@^2.7.0: + version "2.9.4" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.4.tgz#5e3ba97848d5290273db514aee47fe24cf592934" + dependencies: + cli "~1.0.0" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + lodash "3.7.x" + minimatch "~3.0.2" + shelljs "0.3.x" + strip-json-comments "1.0.x" + +json-loader@^0.5.1: + version "0.5.4" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-1.0.1.tgz#ea5efe40b83690b98667614a7392fc60e842c0dd" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonlint@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.2.tgz#5737045085f55eb455c68b1ff4ebc01bd50e8830" + dependencies: + JSV ">= 4.0.x" + nomnom ">= 1.5.x" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +karma-babel-preprocessor@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64950dbe11f421b74040ab08fb5a66c21" + dependencies: + babel-core "^6.0.0" + +karma-browserstack-launcher@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/karma-browserstack-launcher/-/karma-browserstack-launcher-1.2.0.tgz#acfa534835ba590041eef009c1169a219120bb5b" + dependencies: + browserstack "1.5.0" + browserstacktunnel-wrapper "~1.4.2" + q "~1.4.1" + +karma-chai@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a" + +karma-chrome-launcher@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-0.2.3.tgz#4c6d700d163a9d34c618efd87918be49e7a4a8c9" + dependencies: + fs-access "^1.0.0" + which "^1.2.1" + +karma-coverage@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-0.2.7.tgz#f76740b275bbf30a0ab9f41d8cf56843a0994576" + dependencies: + dateformat "~1.0.6" + ibrik "~2.0.0" + istanbul "~0.3.0" + minimatch "~0.3.0" + +"karma-es5-shim@https://github.com/pokehanai/karma-es5-shim/archive/v2.1.0.tar.gz": + version "2.1.0" + resolved "https://github.com/pokehanai/karma-es5-shim/archive/v2.1.0.tar.gz#28a0df8cefdfaab3d7e840d282125aa2f6d309f7" + +karma-expect@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/karma-expect/-/karma-expect-1.1.3.tgz#c6b0a56ff18903db11af4f098cc6e7cf198ce275" + dependencies: + expect.js "^0.3.1" + +karma-firefox-launcher@^0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-0.1.7.tgz#c05dd86533691e62f31952595098e8bd357d39f3" + +karma-html-reporter@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/karma-html-reporter/-/karma-html-reporter-0.2.7.tgz#fd73da9f1ac99fd5bafb309cf070942188e7ba63" + dependencies: + lodash "~2.2.0" + mu2 "~0.5.19" + +karma-ie-launcher@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/karma-ie-launcher/-/karma-ie-launcher-0.1.5.tgz#ee43bd238f61c45dd8fbc1694b13a50dfb5a3e1b" + +karma-junit-reporter@^0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-junit-reporter/-/karma-junit-reporter-0.3.8.tgz#d24b85b8507b7ddb2c8ced0d1f4f2b1ac700d3fe" + dependencies: + xmlbuilder "3.1.0" + +karma-mocha@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-0.2.2.tgz#388ed917da15dcb196d1b915c1934ef803193f8e" + +karma-opera-launcher@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/karma-opera-launcher/-/karma-opera-launcher-0.1.0.tgz#751c89db4e686a8327d291f19a58b34f00dbd078" + +karma-phantomjs-launcher@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-0.2.3.tgz#77f68243fad7852c5b321bcf9d691f1223cc0809" + dependencies: + lodash "^3.10.1" + +karma-requirejs@^0.2.2: + version "0.2.6" + resolved "https://registry.yarnpkg.com/karma-requirejs/-/karma-requirejs-0.2.6.tgz#1a770c64f901320a389c65b4944746326372def8" + +karma-safari-launcher@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-0.1.1.tgz#a6380accab60a583fdd624f41b9a3f10fdf41008" + +karma-sauce-launcher@^0.2.10: + version "0.2.14" + resolved "https://registry.yarnpkg.com/karma-sauce-launcher/-/karma-sauce-launcher-0.2.14.tgz#e42e412517c5f40534c8bba7d14bb4f10727b6a7" + dependencies: + q "~0.9.6" + sauce-connect-launcher "~0.11.1" + saucelabs "~0.1.0" + wd "~0.3.4" + +karma-script-launcher@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz#b643e7c2faead1a52cdb2eeaadcf7a245f0d772a" + +karma-sinon-ie@^2.0.0-rc10: + version "2.0.0" + resolved "https://registry.yarnpkg.com/karma-sinon-ie/-/karma-sinon-ie-2.0.0.tgz#d07f05ac911baea5f6dbc95e1404fd9c93f6cc65" + +karma-webpack@^1.5.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-1.8.1.tgz#39d5fd2edeea3cc3ef5b405989b37d5b0e6a3b4e" + dependencies: + async "~0.9.0" + loader-utils "^0.2.5" + lodash "^3.8.0" + source-map "^0.1.41" + webpack-dev-middleware "^1.0.11" + +karma@^0.13.2: + version "0.13.22" + resolved "https://registry.yarnpkg.com/karma/-/karma-0.13.22.tgz#07750b1bd063d7e7e7b91bcd2e6354d8f2aa8744" + dependencies: + batch "^0.5.3" + bluebird "^2.9.27" + body-parser "^1.12.4" + chokidar "^1.4.1" + colors "^1.1.0" + connect "^3.3.5" + core-js "^2.1.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + glob "^7.0.0" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^3.8.0" + log4js "^0.6.31" + mime "^1.3.4" + minimatch "^3.0.0" + optimist "^0.6.1" + rimraf "^2.3.3" + socket.io "^1.4.5" + source-map "^0.5.3" + useragent "^2.1.6" + +kew@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +klaw@^1.0.0, klaw@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazystream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920" + dependencies: + readable-stream "~1.0.2" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lcov-parse@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + +leven@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" + +levn@~0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" + dependencies: + prelude-ls "~1.1.0" + type-check "~0.3.1" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +livereload-js@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +localtunnel@^1.3.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.2.tgz#913051e8328b51f75ad8a22ad1f5c5b8c599a359" + dependencies: + debug "2.2.0" + openurl "1.1.0" + request "2.78.0" + yargs "3.29.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^4.0.0: + version "4.5.7" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz#ce42ade08384ef5d62fa77c30f61a46e686f8434" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash._stack@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lodash._stack/-/lodash._stack-4.1.3.tgz#751aa76c1b964b047e76d14fc72a093fcb5e2dd0" + +lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.0.3, lodash.assign@^4.0.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignwith@^4.0.7: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + +lodash.clone@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-3.0.3.tgz#84688c73d32b5a90ca25616963f189252a997043" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.defaultsdeep@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz#6c1a586e6c5647b0e64e2d798141b8836158be8a" + dependencies: + lodash._baseclone "^4.0.0" + lodash._stack "^4.0.0" + lodash.isplainobject "^4.0.0" + lodash.keysin "^4.0.0" + lodash.mergewith "^4.0.0" + lodash.rest "^4.0.0" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isempty@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.isplainobject@^4.0.0, lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.keysin@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-4.2.0.tgz#8cc3fb35c2d94acc443a1863e02fa40799ea6f28" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.mergewith@^4.0.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + +lodash.pick@^4.2.1, lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.rest@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.2.2: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + dependencies: + lodash.keys "~2.4.1" + +lodash@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.5.0.tgz#19bb3f4d51278f0b8c818ed145c74ecf9fe40e6d" + +lodash@3.7.x: + version "3.7.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" + +lodash@^3.0.1, lodash@^3.10.0, lodash@^3.10.1, lodash@^3.3.1, lodash@^3.5.0, lodash@^3.7.0, lodash@^3.8.0, lodash@^3.9.3, lodash@~3.10.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.2.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +lodash@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.2.1.tgz#ca935fd14ab3c0c872abacf198b9cda501440867" + +lodash@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + +lodash@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.2.0.tgz#4bf50a3243f9aeb0bac41a55d3d5990675a462fb" + +lodash@~3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.9.3.tgz#0159e86832feffc6d61d852b12a953b99496bd32" + +log-driver@1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + +log-symbols@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log4js@^0.6.31: + version "0.6.38" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@2.2.x: + version "2.2.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + +lru-cache@~2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5" + +magic-string@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" + dependencies: + vlq "^0.2.1" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.0.3: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked@~0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +"match-stream@>= 0.0.2 < 1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" + dependencies: + buffers "~0.1.1" + readable-stream "~1.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + +memory-fs@^0.3.0, memory-fs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +method-override@~2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.8.tgz#178234bf4bab869f89df9444b06fc6147b44828c" + dependencies: + debug "2.6.3" + methods "~1.1.2" + parseurl "~1.3.1" + vary "~1.1.0" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-db@~1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" + +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime-types@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" + +mime-types@~2.0.1, mime-types@~2.0.3: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" + dependencies: + mime-db "~1.12.0" + +mime@1.3.4, mime@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@~1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + +minimatch@0.3, minimatch@0.x, minimatch@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@3.0.3, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.0, minimatch@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimatch@2.x, minimatch@^2.0.1, minimatch@^2.0.3: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.3.x, mkdirp@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + +mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +mkpath@1.0.0, mkpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-1.0.0.tgz#ebb3a977e7af1c683ae6fda12b545a6ba6c5853d" + +mocha-nightwatch@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/mocha-nightwatch/-/mocha-nightwatch-3.2.1.tgz#0e810f9c958d91bc3982c5948044a91436182c29" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +mocha@^1.21.4: + version "1.21.5" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-1.21.5.tgz#7c58b09174df976e434a23b1e8d639873fc529e9" + dependencies: + commander "2.3.0" + debug "2.0.0" + diff "1.0.8" + escape-string-regexp "1.0.2" + glob "3.2.3" + growl "1.8.1" + jade "0.26.3" + mkdirp "0.5.0" + +mocha@^2.0.1: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +mock-fs@^3.11.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-3.12.1.tgz#ff27824cd6ab263a7eb05a115239d41d3631f5f8" + dependencies: + rewire "2.5.2" + semver "5.3.0" + +module-not-found-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + +morgan@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2" + dependencies: + basic-auth "~1.0.3" + debug "~2.2.0" + depd "~1.0.1" + on-finished "~2.3.0" + on-headers "~1.0.0" + +ms@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +mu2@~0.5.19: + version "0.5.21" + resolved "https://registry.yarnpkg.com/mu2/-/mu2-0.5.21.tgz#888a8f0fd90eb1cfda9db81476f6e199cc9e58d3" + +multiparty@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-3.3.2.tgz#35de6804dc19643e5249f3d3e3bdc6c8ce301d3f" + dependencies: + readable-stream "~1.1.9" + stream-counter "~0.2.0" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.4.tgz#a9219960a6d5d5d046597aee51252c6655f7177e" + +mute-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.1.tgz#8c84f7b14c96b89f57fbc838012180ec8ca39a01" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +natural-compare@~1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.2.2.tgz#1f96d60e3141cac1b6d05653ce0daeac763af6aa" + +ncp@0.4.x, ncp@~0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" + +negotiator@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +netmask@~1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" + +nightwatch@^0.9.5: + version "0.9.14" + resolved "https://registry.yarnpkg.com/nightwatch/-/nightwatch-0.9.14.tgz#897eb2e418b75492c3671e28e8e413abe17cc268" + dependencies: + chai-nightwatch "~0.1.x" + ejs "0.8.3" + lodash.clone "3.0.3" + lodash.defaultsdeep "4.3.2" + minimatch "3.0.3" + mkpath "1.0.0" + mocha-nightwatch "3.2.1" + optimist "0.6.1" + proxy-agent "2.0.0" + q "1.4.1" + +node-int64@~0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.3.3.tgz#2d6e6b2ece5de8588b43d88d1bc41b26cd1fa84d" + +node-libs-browser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.9.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "3.3.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.6.29: + version "0.6.34" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-uuid@~1.4.0, node-uuid@~1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +"nomnom@>= 1.5.x": + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.3.6" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npmlog@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.5.0.tgz#d767f5169325620eab2e087ef0c472e773db6461" + +oauth-sign@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.6.0.tgz#7dbeae44f6ca454e1f168451d630746735813ce3" + +oauth-sign@~0.8.0, oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@*, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-get@^2.0.0, object-get@^2.0.2, object-get@^2.0.4, object-get@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object-get/-/object-get-2.1.0.tgz#722bbdb60039efa47cad3c6dc2ce51a85c02c5ae" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object-to-spawn-args@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object-to-spawn-args/-/object-to-spawn-args-1.1.0.tgz#031a200e37db2c3dfc9b98074a0d69a5be253c1c" + +object-tools@^1.2.1, object-tools@^1.6.1: + version "1.6.7" + resolved "https://registry.yarnpkg.com/object-tools/-/object-tools-1.6.7.tgz#52d400fc875250993dbbb3ba298d7c79bb0698d0" + dependencies: + array-tools "^1.8.4" + typical "^2.2" + +object-tools@^2, object-tools@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object-tools/-/object-tools-2.0.6.tgz#f3fe1c350cda4a6f5d99d9646dc4892a02476ddd" + dependencies: + array-back "^1.0.2" + collect-json "^1.0.7" + object-get "^2.0.2" + test-value "^1.1.0" + typical "^2.4.2" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.0, on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@1.x, once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + +openurl@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.0.tgz#e2f2189d999c04823201f083f0f1a7cd8903187a" + +optimist@0.6.1, optimist@^0.6.1, optimist@~0.6.0, optimist@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimist@~0.3.5: + version "0.3.7" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" + dependencies: + wordwrap "~0.0.2" + +optimize-js@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/optimize-js/-/optimize-js-1.0.3.tgz#4326af8657c4a5ff32daf726631754f72ab7fdbc" + dependencies: + acorn "^3.3.0" + concat-stream "^1.5.1" + estree-walker "^0.3.0" + magic-string "^0.16.0" + yargs "^4.8.1" + +optionator@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.5.0.tgz#b75a8995a2d417df25b6e4e3862f50aa88651368" + dependencies: + deep-is "~0.1.2" + fast-levenshtein "~1.0.0" + levn "~0.2.5" + prelude-ls "~1.1.1" + type-check "~0.3.1" + wordwrap "~0.0.2" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +"over@>= 0.0.5 < 1": + version "0.0.5" + resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" + +pac-proxy-agent@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-1.0.0.tgz#dcd5b746581367430a236e88eacfd4e5b8d068a5" + dependencies: + agent-base "2" + debug "2" + extend "3" + get-uri "1" + http-proxy-agent "1" + https-proxy-agent "1" + pac-resolver "~1.2.1" + socks-proxy-agent "2" + stream-to-buffer "0.1.0" + +pac-resolver@~1.2.1: + version "1.2.6" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-1.2.6.tgz#ed03af0c5b5933505bdd3f07f75175466d5e7cfb" + dependencies: + co "~3.0.6" + degenerator "~1.0.0" + netmask "~1.0.4" + regenerator "~0.8.13" + thunkify "~2.1.1" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.0, parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pathval@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-0.1.1.tgz#08f911cdca9cce5942880da7817bc0b723b66d82" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pause@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74" + +pbkdf2-compat@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +phantomjs@^1.9.18: + version "1.9.20" + resolved "https://registry.yarnpkg.com/phantomjs/-/phantomjs-1.9.20.tgz#4424aca20e14d255c0b0889af6f6b8973da10e0d" + dependencies: + extract-zip "~1.5.0" + fs-extra "~0.26.4" + hasha "^2.2.0" + kew "~0.7.0" + progress "~1.1.8" + request "~2.67.0" + request-progress "~2.0.1" + which "~1.2.2" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +pkginfo@0.x.x: + version "0.4.0" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" + +plur@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + dependencies: + irregular-plurals "^1.0.0" + +prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +private@^0.1.6, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.0: + version "0.11.9" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" + +progress@~1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise.prototype.finally@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-1.0.1.tgz#91182f91c92486995740fa05e0da942ac986befa" + +"promise@>=3.2 <8": + version "7.1.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" + dependencies: + asap "~2.0.3" + +prompt@~0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc" + dependencies: + pkginfo "0.x.x" + read "1.0.x" + revalidator "0.1.x" + utile "0.2.x" + winston "0.8.x" + +proxy-agent@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.0.0.tgz#57eb5347aa805d74ec681cb25649dba39c933499" + dependencies: + agent-base "2" + debug "2" + extend "3" + http-proxy-agent "1" + https-proxy-agent "1" + lru-cache "~2.6.5" + pac-proxy-agent "1" + socks-proxy-agent "2" + +proxyquire@^1.7.10: + version "1.7.11" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.7.11.tgz#13b494eb1e71fb21cc3ebe3699e637d3bec1af9e" + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.0" + resolve "~1.1.7" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +"pullstream@>= 0.4.1 < 1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" + dependencies: + over ">= 0.0.5 < 1" + readable-stream "~1.0.31" + setimmediate ">= 1.0.2 < 2" + slice-stream ">= 1.0.0 < 2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@1.4.1, q@^1.1.2, q@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +q@~0.9.6: + version "0.9.7" + resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75" + +q@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.3.0.tgz#850d79f8cb831d92e103b46483e4e35d34640050" + +qs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" + +qs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~2.3.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" + +qs@~2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.4.2.tgz#f7ce788e5777df0b5010da7f7c4e73ba32470f5a" + +qs@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9" + +qs@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@0.0.3, querystringify@0.0.x: + version "0.0.3" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.3.tgz#0c9d36fbf8c7a4f71eb370857763577a63335be7" + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +range-parser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" + +raw-body@~2.1.2, raw-body@~2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +rcfinder@~0.1.6: + version "0.1.9" + resolved "https://registry.yarnpkg.com/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115" + dependencies: + lodash.clonedeep "^4.3.2" + +rcloader@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/rcloader/-/rcloader-0.1.2.tgz#a0963a6437d09ef8cb92d932d2dad497b0d1736c" + dependencies: + lodash "~2.4.1" + rcfinder "~0.1.6" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read@1.0.x: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +readable-stream@1.1, readable-stream@1.1.x, readable-stream@~1.1.8, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.8.tgz#ad28b686f3554c73d39bc32347fa058356624705" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.17, readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26, readable-stream@~1.0.31, readable-stream@~1.0.33: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0, readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-0.1.1.tgz#99443ba6e83b830ef3051bfd7dc241a82728d568" + dependencies: + mute-stream "0.0.4" + strip-ansi "^2.0.1" + +recast@0.10.33, recast@^0.10.10: + version "0.10.33" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" + dependencies: + ast-types "0.8.12" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +recast@^0.11.17: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reduce-extract@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reduce-extract/-/reduce-extract-1.0.0.tgz#67f2385beda65061b5f5f4312662e8b080ca1525" + dependencies: + test-value "^1.0.1" + +reduce-flatten@^1.0.0, reduce-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" + +reduce-unique@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reduce-unique/-/reduce-unique-1.0.0.tgz#7e586bcf87a4e32b6d7abd8277fad6cdec9f4803" + +reduce-without@^1.0.0, reduce-without@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/reduce-without/-/reduce-without-1.0.1.tgz#68ad0ead11855c9a37d4e8256c15bbf87972fc8c" + dependencies: + test-value "^2.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regenerator@0.8.40, regenerator@~0.8.13: + version "0.8.40" + resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" + dependencies: + commoner "~0.10.3" + defs "~1.1.0" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + recast "0.10.33" + through "~2.3.8" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" + dependencies: + esprima "^2.6.0" + recast "^0.10.10" + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.0, repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +replacestream@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-0.1.3.tgz#e018d3a37724600ccd0c005990d8a21b7b54ff34" + dependencies: + through "~2.3.4" + +req-then@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/req-then/-/req-then-0.5.1.tgz#31c6e0b56f4ddd2acd6de0ba1bcea77b6079dfdf" + dependencies: + array-back "^1.0.3" + defer-promise "^1.0.0" + feature-detect-es6 "^1.3.1" + lodash.pick "^4.4.0" + typical "^2.6.0" + +request-progress@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + +request@2.49.0: + version "2.49.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.49.0.tgz#0d4f6348dc3348059b553e4db60fd2478de662a7" + dependencies: + aws-sign2 "~0.5.0" + bl "~0.9.0" + caseless "~0.8.0" + combined-stream "~0.0.5" + forever-agent "~0.5.0" + form-data "~0.1.0" + hawk "1.1.1" + http-signature "~0.10.0" + json-stringify-safe "~5.0.0" + mime-types "~1.0.1" + node-uuid "~1.4.0" + oauth-sign "~0.5.0" + qs "~2.3.1" + stringstream "~0.0.4" + tough-cookie ">=0.12.0" + tunnel-agent "~0.4.0" + +request@2.78.0: + version "2.78.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + +request@2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@~2.55.0: + version "2.55.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.55.0.tgz#d75c1cdf679d76bb100f9bffe1fe551b5c24e93d" + dependencies: + aws-sign2 "~0.5.0" + bl "~0.9.0" + caseless "~0.9.0" + combined-stream "~0.0.5" + forever-agent "~0.6.0" + form-data "~0.2.0" + har-validator "^1.4.0" + hawk "~2.3.0" + http-signature "~0.10.0" + isstream "~0.1.1" + json-stringify-safe "~5.0.0" + mime-types "~2.0.1" + node-uuid "~1.4.0" + oauth-sign "~0.6.0" + qs "~2.4.0" + stringstream "~0.0.4" + tough-cookie ">=0.12.0" + tunnel-agent "~0.4.0" + +request@~2.67.0: + version "2.67.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.67.0.tgz#8af74780e2bf11ea0ae9aa965c11f11afd272742" + dependencies: + aws-sign2 "~0.6.0" + bl "~1.0.0" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc3" + har-validator "~2.0.2" + hawk "~3.1.0" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.0" + qs "~5.2.0" + stringstream "~0.0.4" + tough-cookie "~2.2.0" + tunnel-agent "~0.4.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +requirejs@^2.1.20: + version "2.3.3" + resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.3.tgz#aa59fd3a0287eaf407959a138228044b5dd6a6a3" + +requires-port@1.0.x, requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +requizzle@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.1.tgz#6943c3530c4d9a7e46f1cddd51c158fc670cdbde" + dependencies: + underscore "~1.6.0" + +reserved-words@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.1.tgz#6f7c15e5e5614c50da961630da46addc87c0cef2" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-url@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@~1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +response-time@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.2.tgz#ffa71bab952d62f7c1d49b7434355fbc68dffc5a" + dependencies: + depd "~1.1.0" + on-headers "~1.0.1" + +revalidator@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + +rewire@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.5.2.tgz#6427de7b7feefa7d36401507eb64a5385bc58dc7" + +rgb2hex@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.0.tgz#ccd55f860ae0c5c4ea37504b958e442d8d12325b" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +rimraf@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.6.tgz#c59597569b14d956ad29cacc42bdddf5f0ea4f4c" + +rimraf@~2.2.0, rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +ripemd160@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" + +rndm@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c" + +rx@^2.4.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +samsam@1.1.2, samsam@~1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +sauce-connect-launcher@~0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-0.11.1.tgz#65f51d8891249fdabaaf17599734de1902476129" + dependencies: + adm-zip "~0.4.3" + async "0.9.0" + lodash "3.5.0" + rimraf "2.2.6" + +saucelabs@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-0.1.1.tgz#5e0ea1cf3d735d6ea15fde94b5bda6bc15d2c06d" + +"semver@2 || 3 || 4 || 5", semver@5.3.0, semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^4.1.0, semver@~4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@~5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + +send@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.3.1" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.0.3" + statuses "~1.2.1" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serve-favicon@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.2.tgz#dd419e268de012ab72b319d337f2105013f9381f" + dependencies: + etag "~1.7.0" + fresh "0.3.0" + ms "0.7.2" + parseurl "~1.3.1" + +serve-index@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.7.3.tgz#7a057fc6ee28dc63f64566e5fa57b111a86aecd2" + dependencies: + accepts "~1.2.13" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.3.1" + mime-types "~2.1.9" + parseurl "~1.3.1" + +serve-static@~1.10.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535" + dependencies: + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.13.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sha.js@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-fmt@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" + +simple-is@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" + +sinon@^1.12.1: + version "1.17.7" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +"slice-stream@>= 1.0.0 < 2": + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" + dependencies: + readable-stream "~1.0.31" + +smart-buffer@^1.0.13: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + +sntp@0.2.x: + version "0.2.4" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" + dependencies: + hoek "0.9.x" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.3" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@^1.4.5: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" + dependencies: + debug "2.3.3" + engine.io "1.8.3" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.7.3" + socket.io-parser "2.3.1" + +socks-proxy-agent@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.0.0.tgz#c674842d70410fb28ae1e92e6135a927854bc275" + dependencies: + agent-base "2" + extend "3" + socks "~1.1.5" + +socks@~1.1.5: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + +sort-array@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-1.1.1.tgz#9032f6f0be284eecb12af98a3db02612828a66d1" + dependencies: + array-back "^1.0.3" + object-get "^2.0.4" + typical "^2.4.2" + +source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-map-resolve@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" + dependencies: + atob "~1.1.0" + resolve-url "~0.2.1" + source-map-url "~0.3.0" + urix "~0.1.0" + +source-map-support@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" + dependencies: + source-map "0.1.32" + +source-map-support@^0.4.2: + version "0.4.14" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + +source-map-url@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.1.38, source-map@^0.1.40, source-map@^0.1.41, source-map@~0.1.38, source-map@~0.1.7: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.4, source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.2: + version "0.2.10" + resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" + dependencies: + through "2" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stable@~0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" + +stack-trace@0.0.x: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + +statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +statuses@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner@~0.0.3, stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-connect@^1.0.1, stream-connect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-connect/-/stream-connect-1.0.2.tgz#18bc81f2edb35b8b5d9a8009200a985314428a97" + dependencies: + array-back "^1.0.2" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +stream-counter@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de" + dependencies: + readable-stream "~1.1.8" + +stream-handlebars@~0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/stream-handlebars/-/stream-handlebars-0.1.6.tgz#7305b5064203da171608c478acf642a149892a2f" + dependencies: + handlebars "^3.0.0" + object-tools "^1.2.1" + +stream-http@^2.3.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.0.tgz#cec1f4e3b494bc4a81b451808970f8b20b4ed5f6" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.2.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-to-buffer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" + dependencies: + stream-to "~0.2.0" + +stream-to@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" + +stream-via@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-1.0.3.tgz#cebd32a5a59d74b3b68e3404942e867184ad4ac9" + +stream-via@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-0.1.1.tgz#0cee5df9c959fb1d3f4eda4819f289d5f9205afc" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-replace-webpack-plugin@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/string-replace-webpack-plugin/-/string-replace-webpack-plugin-0.0.3.tgz#82c67448cea95ec002a1bfcfd2fb0195cd12bd24" + dependencies: + async "~0.2.10" + css-loader "^0.9.1" + file-loader "^0.8.1" + loader-utils "~0.2.3" + style-loader "^0.8.3" + +string-tools@^0.1.4: + version "0.1.8" + resolved "https://registry.yarnpkg.com/string-tools/-/string-tools-0.1.8.tgz#70884e86a26ee5103a078bef67033d558d36e337" + +string-tools@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-tools/-/string-tools-1.0.0.tgz#c69a9d5788858997da66f1d923ba7113ea466b5a" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + dependencies: + buffer-shims "~1.0.0" + +stringmap@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" + +stringset@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" + dependencies: + ansi-regex "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@1.0.x, strip-json-comments@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.8.3.tgz#f4f92eb7db63768748f15065cd6700f5a1c85357" + dependencies: + loader-utils "^0.2.5" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.3.1.tgz#15758df09d8ff3b4acc307539fabe27095e1042d" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +table-layout@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.3.0.tgz#6ee20dc483db371b3e5c87f704ed2f7c799d2c9a" + dependencies: + array-back "^1.0.3" + core-js "^2.4.1" + deep-extend "~0.4.1" + feature-detect-es6 "^1.3.1" + typical "^2.6.0" + wordwrapjs "^2.0.0-0" + +taffydb@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" + +tapable@^0.1.8, tapable@~0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar-stream@~1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.1.5.tgz#be9218c130c20029e107b0f967fb23de0579d13c" + dependencies: + bl "^0.9.0" + end-of-stream "^1.0.0" + readable-stream "~1.0.33" + xtend "^4.0.0" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-path/-/temp-path-1.0.0.tgz#24b1543973ab442896d9ad367dd9cbdbfafe918b" + +temp@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +test-value@^1.0.1, test-value@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/test-value/-/test-value-1.1.0.tgz#a09136f72ec043d27c893707c2b159bfad7de93f" + dependencies: + array-back "^1.0.2" + typical "^2.4.2" + +test-value@^2.0.0, test-value@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" + dependencies: + array-back "^1.0.3" + typical "^2.6.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textextensions@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" + +then-fs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/then-fs/-/then-fs-2.0.0.tgz#72f792dd9d31705a91ae19ebfcf8b3f968c81da2" + dependencies: + promise ">=3.2 <8" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +"through2@>=0.6.1 <1.0.0-0", through2@^0.6.1, through2@^0.6.5, through2@~0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through2@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^2.0.0, through2@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +thunkify@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" + +timers-browserify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" + dependencies: + setimmediate "^1.0.4" + +tiny-lr@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-0.2.1.tgz#b3fdba802e5d56a33c2f6f10794b32e477ac729d" + dependencies: + body-parser "~1.14.0" + debug "~2.2.0" + faye-websocket "~0.10.0" + livereload-js "^2.2.0" + parseurl "~1.3.0" + qs "~5.1.0" + +tmp@0.0.x: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-double-quotes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-double-quotes/-/to-double-quotes-2.0.0.tgz#aaf231d6fa948949f819301bbab4484d8588e4a7" + +to-fast-properties@^1.0.0, to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + +to-single-quotes@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/to-single-quotes/-/to-single-quotes-2.0.1.tgz#7cc29151f0f5f2c41946f119f5932fe554170125" + +tough-cookie@>=0.12.0, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tough-cookie@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" + +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.0, trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +try-resolve@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" + +tryor@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" + +tsscmp@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.0, tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +type-is@~1.6.10, type-is@~1.6.14, type-is@~1.6.6: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typical@^2.1, typical@^2.2, typical@^2.3.0, typical@^2.4.2, typical@^2.5.0, typical@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.0.tgz#89d51554ab139848a65bcc2c8772f8fb450c40ed" + +uglify-js@2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.6.tgz#31766a4d822babf5f32c14096251ed9259298ad3" + dependencies: + async "~0.2.6" + optimist "~0.3.5" + source-map "~0.1.7" + uglify-to-browserify "~1.0.0" + +uglify-js@^2.6, uglify-js@^2.8.10: + version "2.8.21" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.21.tgz#1733f669ae6f82fc90c7b25ec0f5c783ee375314" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@~2.3: + version "2.3.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a" + dependencies: + async "~0.2.6" + optimist "~0.3.5" + source-map "~0.1.7" + +uglify-js@~2.7.3: + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uid-safe@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.4.tgz#3ad6f38368c6d4c8c75ec17623fb79aa1d071d81" + dependencies: + random-bytes "~1.0.0" + +uid-safe@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137" + dependencies: + base64-url "1.2.1" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore-contrib@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/underscore-contrib/-/underscore-contrib-0.3.0.tgz#665b66c24783f8fa2b18c9f8cbb0e2c7d48c26c7" + dependencies: + underscore "1.6.0" + +underscore.string@~3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.0.3.tgz#4617b8c1a250cf6e5064fbbb363d0fa96cf14552" + +underscore@1.6.0, underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + +underscore@~1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unzip@~0.1.9: + version "0.1.11" + resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" + dependencies: + binary ">= 0.3.0 < 1" + fstream ">= 0.1.30 < 1" + match-stream ">= 0.0.2 < 1" + pullstream ">= 0.4.1 < 1" + readable-stream "~1.0.31" + setimmediate ">= 1.0.1 < 2" + +urix@^0.1.0, urix@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse@^1.0.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.8.tgz#7a65b3a8d57a1e86af6b4e2276e34774167c0156" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +url@~0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +usage-stats@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/usage-stats/-/usage-stats-0.8.2.tgz#d7be5203682e267f7696b354356c8c376aa12542" + dependencies: + array-back "^1.0.3" + cli-commands "0.1.0" + core-js "^2.4.1" + feature-detect-es6 "^1.3.1" + home-path "^1.0.3" + mkdirp "^0.5.1" + req-then "^0.5.1" + typical "^2.6.0" + uuid "^3.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +useragent@^2.1.6: + version "2.1.13" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10" + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, "util@>=0.10.3 <1", util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utile@0.2.x: + version "0.2.1" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7" + dependencies: + async "~0.2.9" + deep-equal "*" + i "0.3.x" + mkdirp "0.x.x" + ncp "0.4.x" + rimraf "2.x.x" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.2: + version "2.0.12" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.12.tgz#73235d9f7176f8e8833fb286795445f7938d84e5" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vargs@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" + +vary@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" + +vary@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vhost@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.1.tgz#1c3b4931e7ac4c1efee743f3b91a74c094407bb6" + dependencies: + clone "^1.0.0" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + is-stream "^1.1.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vlq@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.1.tgz#14439d711891e682535467f8587c5630e4222a6c" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +vow-fs@~0.3.4: + version "0.3.6" + resolved "https://registry.yarnpkg.com/vow-fs/-/vow-fs-0.3.6.tgz#2d4c59be22e2bf2618ddf597ab4baa923be7200d" + dependencies: + glob "^7.0.5" + uuid "^2.0.2" + vow "^0.4.7" + vow-queue "^0.4.1" + +vow-queue@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/vow-queue/-/vow-queue-0.4.2.tgz#e7fe17160e15c7c4184d1b666a9bc64e18e30184" + dependencies: + vow "~0.4.0" + +vow@^0.4.7, vow@~0.4.0, vow@~0.4.8: + version "0.4.15" + resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.15.tgz#0579163aff6ba0ae05c456b2c0e4ca6373f111b3" + +walk-back@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-2.0.1.tgz#554e2a9d874fac47a8cb006bf44c2f0c4998a0a4" + +walk@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b" + dependencies: + foreachasync "^3.0.0" + +watchpack@^0.2.1: + version "0.2.9" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" + dependencies: + async "^0.9.0" + chokidar "^1.0.0" + graceful-fs "^4.1.2" + +wd@~0.3.4: + version "0.3.12" + resolved "https://registry.yarnpkg.com/wd/-/wd-0.3.12.tgz#3fb4f1d759f8c85dde5393d17334ffe03e9bb329" + dependencies: + archiver "~0.14.0" + async "~1.0.0" + lodash "~3.9.3" + q "~1.4.1" + request "~2.55.0" + underscore.string "~3.0.3" + vargs "~0.1.0" + +webdriverio@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-3.4.0.tgz#d9d4d3c31366f053e10af644b0eaad5e873ab7b5" + dependencies: + archiver "~0.14.3" + array.from "^0.2.0" + co "^4.5.4" + css-parse "~2.0.0" + css-value "~0.0.1" + deepmerge "~0.2.7" + ejs "^2.3.1" + glob "^5.0.10" + inquirer "^0.8.5" + is-generator "^1.0.2" + optimist "^0.6.1" + q "~1.3.0" + request "2.49.0" + rgb2hex "~0.1.0" + supports-color "^1.3.1" + url "~0.10.3" + wgxpath "~1.0.0" + +webpack-core@~0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-dev-middleware@^1.0.11: + version "1.10.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.1.tgz#c6b4cf428139cf1aefbe06a0c00fdb4f8da2f893" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + +webpack-stream@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-stream/-/webpack-stream-3.2.0.tgz#3a1d160fb11d41727b7ce6f32f722464f98b2186" + dependencies: + gulp-util "^3.0.7" + lodash.clone "^4.3.2" + lodash.some "^4.2.2" + memory-fs "^0.3.0" + through "^2.3.8" + vinyl "^1.1.0" + webpack "^1.12.9" + +webpack@^1.12.3, webpack@^1.12.9: + version "1.14.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" + dependencies: + acorn "^3.0.0" + async "^1.3.0" + clone "^1.0.2" + enhanced-resolve "~0.9.0" + interpret "^0.6.4" + loader-utils "^0.2.11" + memory-fs "~0.3.0" + mkdirp "~0.5.0" + node-libs-browser "^0.7.0" + optimist "~0.6.0" + supports-color "^3.1.0" + tapable "~0.1.8" + uglify-js "~2.7.3" + watchpack "^0.2.1" + webpack-core "~0.6.9" + +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +wgxpath@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.1.1, which@^1.2.1, which@^1.2.12, which@~1.2.2: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +which@~1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +winston@0.8.x: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrapjs@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-1.2.1.tgz#754a5ea0664cfbff50540dc32d67bda3289fc34b" + dependencies: + array-back "^1.0.3" + typical "^2.5.0" + +wordwrapjs@^2.0.0-0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-2.0.0.tgz#ab55f695e6118da93858fdd70c053d1c5e01ac20" + dependencies: + array-back "^1.0.3" + feature-detect-es6 "^1.3.1" + reduce-flatten "^1.0.1" + typical "^2.6.0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xmlbuilder@3.1.0, xmlbuilder@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-3.1.0.tgz#2c86888f2d4eade850fa38ca7f7223f7209516e1" + dependencies: + lodash "^3.5.0" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +xregexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs@3.29.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" + dependencies: + camelcase "^1.2.1" + cliui "^3.0.3" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + +yargs@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.3.3.tgz#054de8b61f22eefdb7207059eaef9d6b83fb931a" + +yargs@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yargs@~3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" + dependencies: + camelcase "^1.2.1" + cliui "^2.1.0" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +yazl@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.2.tgz#14cb19083e1e25a70092c1588aabe0f4e4dd4d88" + dependencies: + buffer-crc32 "~0.2.3" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + +zip-stream@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.5.2.tgz#32dcbc506d0dab4d21372625bd7ebaac3c2fff56" + dependencies: + compress-commons "~0.2.0" + lodash "~3.2.0" + readable-stream "~1.0.26" From 2a7298fbe647245bf110c625ea983f42eb7dd6fa Mon Sep 17 00:00:00 2001 From: Kir Apukhtin Date: Fri, 14 Apr 2017 01:12:19 +0300 Subject: [PATCH 29/38] Update Roxot prebid analytic adapter (#1034) * add roxot adapter * update roxot analytics system * remove unused test * remove unused import * update code after review * add analytic adapter - roxot prebid analytic * Update roxot prebid analytic * update * Fix tests * Fix Roxot tests * Fix endpoint * Register config only once. * Clear ad parameter for optimize traffic * Fix after review * Fix remove ad from global object * Add tests. * Remove request_bids event from AnalyticsAdapter.js * Remove extra dependencies --- package.json | 2 +- src/adapters/analytics/AnalyticsAdapter.js | 2 + src/adapters/analytics/roxot.js | 99 +++++++++++++++++-- .../adapters/analytics/roxot_analytic_spec.js | 35 +++++++ 4 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 test/spec/adapters/analytics/roxot_analytic_spec.js diff --git a/package.json b/package.json index 926d3270068..28f0ac3375f 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "babel-plugin-transform-es3-member-expression-literals": "^6.8.0", "babel-plugin-transform-es3-property-literals": "^6.8.0", "babel-plugin-transform-object-assign": "^6.8.0", - "babel-preset-es2015": "^6.5.0", + "babel-preset-es2015": "^6.24.1", "block-loader": "^2.1.0", "chai": "^3.3.0", "coveralls": "^2.11.11", diff --git a/src/adapters/analytics/AnalyticsAdapter.js b/src/adapters/analytics/AnalyticsAdapter.js index 1cb007371e5..2c177621047 100644 --- a/src/adapters/analytics/AnalyticsAdapter.js +++ b/src/adapters/analytics/AnalyticsAdapter.js @@ -6,6 +6,7 @@ const events = require('src/events'); const utils = require('../../utils'); const AUCTION_INIT = CONSTANTS.EVENTS.AUCTION_INIT; +const AUCTION_END = CONSTANTS.EVENTS.AUCTION_END; const BID_REQUESTED = CONSTANTS.EVENTS.BID_REQUESTED; const BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT; const BID_RESPONSE = CONSTANTS.EVENTS.BID_RESPONSE; @@ -105,6 +106,7 @@ export default function AnalyticsAdapter({ url, analyticsType, global, handler } [BID_TIMEOUT]: args => this.enqueue({ eventType: BID_TIMEOUT, args }), [BID_WON]: args => this.enqueue({ eventType: BID_WON, args }), [BID_ADJUSTMENT]: args => this.enqueue({ eventType: BID_ADJUSTMENT, args }), + [AUCTION_END]: args => this.enqueue({ eventType: AUCTION_END, args }), [AUCTION_INIT]: args => { args.config = config.options; // enableAnaltyics configuration object this.enqueue({ eventType: AUCTION_INIT, args }); diff --git a/src/adapters/analytics/roxot.js b/src/adapters/analytics/roxot.js index 2b71dda84db..7668d0ba050 100644 --- a/src/adapters/analytics/roxot.js +++ b/src/adapters/analytics/roxot.js @@ -1,19 +1,98 @@ -import { ajax } from 'src/ajax'; -import adapter from 'AnalyticsAdapter'; +import {ajax} from "src/ajax"; +import adapter from "AnalyticsAdapter"; +import CONSTANTS from "src/constants.json"; const utils = require('../../utils'); -const url = '//d.rxthdr.com/analytics'; +const url = '//pa.rxthdr.com/analytic'; const analyticsType = 'endpoint'; -export default Object.assign(adapter( - { - url, - analyticsType +let auctionInitConst = CONSTANTS.EVENTS.AUCTION_INIT; +let auctionEndConst = CONSTANTS.EVENTS.AUCTION_END; +let bidWonConst = CONSTANTS.EVENTS.BID_WON; + +let initOptions = {publisherIds: []}; +let bidWon = {options: {}, events: []}; +let eventStack = {options: {}, events: []}; + +let auctionStatus = 'not_started'; + +function checkOptions() { + if (typeof initOptions.publisherIds === 'undefined') { + return false; } - ), + + return initOptions.publisherIds.length > 0; +} + +function buildBidWon(eventType, args) { + bidWon.options = initOptions; + bidWon.events = [{args: args, eventType: eventType}]; +} + +function buildEventStack() { + eventStack.options = initOptions; +} + +function send(eventType, data, sendDataType) { + let fullUrl = url + '?publisherIds[]=' + initOptions.publisherIds.join('&publisherIds[]=') + '&host=' + window.location.hostname; + + ajax( + fullUrl, + (result) => utils.logInfo('Event ' + eventType + ' sent ' + sendDataType + ' to roxot prebid analytic with result' + result), + JSON.stringify(data) + ); +} + +function pushEvent(eventType, args) { + eventStack.events.push({eventType, args}); +} + +function flushEvents() { + eventStack.events = []; +} + +let roxotAdapter = Object.assign(adapter({url, analyticsType}), { - track({ eventType, args }) { - ajax(url, (result) => utils.logInfo('Event ' + eventType + ' sent to roxot analytics with result ' + result), JSON.stringify({ eventType, args })); + track({eventType, args}) { + if (!checkOptions()) { + return; + } + + let info = Object.assign({}, args); + + if (info && info.ad) { + info.ad = ""; + } + + if (eventType === auctionInitConst) { + auctionStatus = 'started'; + flushEvents(); + } + + if ((eventType === bidWonConst) && auctionStatus === 'not_started') { + buildBidWon(eventType,info); + send(eventType, bidWon, 'bidWon'); + return; + } + + if (eventType === auctionEndConst) { + buildEventStack(eventType); + send(eventType, eventStack, 'eventStack'); + flushEvents(); + auctionStatus = 'not_started'; + } else { + pushEvent(eventType, info); + } } }); + +roxotAdapter.originEnableAnalytics = roxotAdapter.enableAnalytics; + +roxotAdapter.enableAnalytics = function (config) { + initOptions = config.options; + utils.logInfo('Roxot Analytics enabled with config', initOptions); + roxotAdapter.originEnableAnalytics(config); +}; + +export default roxotAdapter; diff --git a/test/spec/adapters/analytics/roxot_analytic_spec.js b/test/spec/adapters/analytics/roxot_analytic_spec.js new file mode 100644 index 00000000000..fd19ca464a8 --- /dev/null +++ b/test/spec/adapters/analytics/roxot_analytic_spec.js @@ -0,0 +1,35 @@ +import roxotAnalytic from 'src/adapters/analytics/roxot'; +let events = require('../../../../src/events'); +let adaptermanager = require('../../../../src/adaptermanager'); +let constants = require('../../../../src/constants.json'); + +describe('Roxot Prebid Analytic', function () { + + describe('enableAnalytics', function () { + + + it('should catch all events', function () { + sinon.spy(roxotAnalytic, 'track'); + + adaptermanager.registerAnalyticsAdapter({ + code: 'roxot', + adapter: roxotAnalytic + }); + + adaptermanager.enableAnalytics({ + provider: 'roxot', + options: { + publisherIds: ['test_roxot_prebid_analytid_publisher_id'] + } + }); + + events.emit(constants.EVENTS.AUCTION_INIT, {}); + events.emit(constants.EVENTS.AUCTION_END, {}); + events.emit(constants.EVENTS.BID_REQUESTED, {}); + events.emit(constants.EVENTS.BID_RESPONSE, {}); + events.emit(constants.EVENTS.BID_WON, {}); + + sinon.assert.callCount(roxotAnalytic.track, 5); + }); + }); +}); From 4257158a4d72302de6c3553c79541f9e672084de Mon Sep 17 00:00:00 2001 From: Devastator Date: Fri, 14 Apr 2017 21:41:12 +0800 Subject: [PATCH 30/38] - New Adapter: Innity (#1074) * Oct 27 Oct 27 * Added Innity Innity Adapter * Innity GPT Test Page * Restore Master pbjs_example_gpt.html * Changes based on jaiminpanchal27 feedback - Align innity in adapters.json - Format innity_spec.js - Add bidRequest into innity.js * Fixed formatting and remove unnecessary code (#1074) --- adapters.json | 1 + integrationExamples/gpt/pbjs_innity_gpt.html | 94 +++++++++++ src/adapters/innity.js | 56 +++++++ test/spec/adapters/innity_spec.js | 162 +++++++++++++++++++ 4 files changed, 313 insertions(+) create mode 100644 integrationExamples/gpt/pbjs_innity_gpt.html create mode 100644 src/adapters/innity.js create mode 100644 test/spec/adapters/innity_spec.js diff --git a/adapters.json b/adapters.json index bf65a6d033d..eb586a76cd4 100644 --- a/adapters.json +++ b/adapters.json @@ -19,6 +19,7 @@ "gumgum", "hiromedia", "indexExchange", + "innity", "kruxlink", "getintent", "inneractive", diff --git a/integrationExamples/gpt/pbjs_innity_gpt.html b/integrationExamples/gpt/pbjs_innity_gpt.html new file mode 100644 index 00000000000..7882d44791d --- /dev/null +++ b/integrationExamples/gpt/pbjs_innity_gpt.html @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + +

Prebid.js Test

+
Div-1
+
+ +
+ + \ No newline at end of file diff --git a/src/adapters/innity.js b/src/adapters/innity.js new file mode 100644 index 00000000000..0f877f6f8a1 --- /dev/null +++ b/src/adapters/innity.js @@ -0,0 +1,56 @@ +var bidfactory = require('../bidfactory.js'); +var bidmanager = require('../bidmanager.js'); +var adloader = require('../adloader.js'); +var utils = require('../utils.js'); +var CONSTANTS = require('../constants.json'); + +var InnityAdapter = function InnityAdapter() { + + function _callBids(params) { + var bidURL, bids = params.bids || [], requestURL = window.location.protocol + '//as.innity.com/synd/?cb=' + new Date().getTime() + '&ver=2&hb=1&output=js&'; + for (var i = 0; i < bids.length; i++) { + var requestParams = {}, bid = bids[i]; + requestParams.pub = bid.params.pub; + requestParams.zone = bid.params.zone; + // Page URL + requestParams.url = utils.getTopWindowUrl(); + // Sizes + var parseSized = utils.parseSizesInput(bid.sizes), arrSize = parseSized[0].split('x'); + requestParams.width = arrSize[0]; + requestParams.height = arrSize[1]; + // Callback function + requestParams.callback = "$$PREBID_GLOBAL$$._doInnityCallback"; + // Callback ID + requestParams.callback_uid = bid.bidId; + // Load Bidder URL + bidURL = requestURL + utils.parseQueryStringParameters(requestParams); + utils.logMessage('Innity.prebid, Bid ID: ' + bid.bidId + ', Pub ID: ' + bid.params.pub + ', Zone ID: ' + bid.params.zone + ', URL: ' + bidURL); + adloader.loadScript(bidURL); + } + } + + $$PREBID_GLOBAL$$._doInnityCallback = function(response) { + var bidObject, bidRequest, callbackID, libURL = window.location.protocol + "//cdn.innity.net/frame_util.js"; + callbackID = response.callback_uid; + bidRequest = utils.getBidRequest(callbackID); + if (response.cpm > 0) { + bidObject = bidfactory.createBid(CONSTANTS.STATUS.GOOD, bidRequest); + bidObject.bidderCode = 'innity'; + bidObject.cpm = parseFloat(response.cpm) / 100; + bidObject.ad = '' + response.tag; + bidObject.width = response.width; + bidObject.height = response.height; + } else { + bidObject = bidfactory.createBid(CONSTANTS.STATUS.NO_BID, bidRequest); + bidObject.bidderCode = 'innity'; + utils.logMessage('No Bid response from Innity request: ' + callbackID); + } + bidmanager.addBidResponse(bidRequest.placementCode, bidObject); + }; + + return { + callBids: _callBids + }; +}; + +module.exports = InnityAdapter; \ No newline at end of file diff --git a/test/spec/adapters/innity_spec.js b/test/spec/adapters/innity_spec.js new file mode 100644 index 00000000000..850cdf99041 --- /dev/null +++ b/test/spec/adapters/innity_spec.js @@ -0,0 +1,162 @@ +describe('innity adapter tests', function () { + + var expect = require('chai').expect; + var urlParse = require('url-parse'); + var querystringify = require('querystringify'); + var adapter = require('src/adapters/innity'); + var adLoader = require('src/adloader'); + var bidmanager = require('src/bidmanager'); + + var stubLoadScript; + + beforeEach(function () { + stubLoadScript = sinon.stub(adLoader, 'loadScript'); + }); + + afterEach(function () { + stubLoadScript.restore(); + }); + + describe('creation of bid url', function () { + + if (typeof($$PREBID_GLOBAL$$._bidsReceived) === "undefined") { + $$PREBID_GLOBAL$$._bidsReceived = []; + } + if (typeof($$PREBID_GLOBAL$$._bidsRequested) === "undefined") { + $$PREBID_GLOBAL$$._bidsRequested = []; + } + + it('bid request for single placement', function () { + + var params = { + bids: [{ + placementCode: '/19968336/header-bid-tag-0', + sizes: [[300,250]], + bidId: 'b12345', + bidder: 'innity', + params: { pub: '267', zone: '62546' } + }] + }; + + adapter().callBids(params); + + var bidUrl = stubLoadScript.getCall(0).args[0]; + + sinon.assert.calledOnce(stubLoadScript); + + var parsedBidUrl = urlParse(bidUrl); + var parsedBidUrlQueryString = querystringify.parse(parsedBidUrl.query); + + expect(parsedBidUrlQueryString).to.have.property('pub').and.to.equal('267'); + expect(parsedBidUrlQueryString).to.have.property('zone').and.to.equal('62546'); + expect(parsedBidUrlQueryString).to.have.property('width').and.to.equal('300'); + expect(parsedBidUrlQueryString).to.have.property('height').and.to.equal('250'); + }); + }); + + describe('handling bid response', function () { + it('should return complete bid response', function() { + + var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse'); + + var params = { + bids: [{ + placementCode: '/19968336/header-bid-tag-0', + sizes: [[300,250]], + bidId: 'b12345', + bidder: 'innity', + params: { pub: '267', zone: '62546' } + }] + }; + + var response = { + cpm: 100, + width: 300, + height: 250, + callback_uid: 'b12345', + tag: '' - }; + }, { + batchKey: [DEFAULT_ENDPOINT,'1337','728x90',''].join('-'), + width: '728', + height: '90', + cpm: 0.4, + ad: '' + }]; + // Instead of the dead stub defined in the top scope, we'll use // one that mocks a response. loadScriptStub.restore(); + let id = 0; const activeLoadScriptStub = sandbox.stub(adloader, 'loadScript', (url) => { const handler = getResponseHandler(); - handler(response); + handler(expectedResponses[id]); + id += 1; }); const params = { - bids: [allowedPlacement(), allowedPlacement()] + bids: [tilePlacement(), leaderPlacement()] }; adapter.callBids(params); - // single request but two responses - sinon.assert.calledOnce(activeLoadScriptStub); - sinon.assert.calledTwice(addBidResponseStub); + sinon.assert.calledTwice(activeLoadScriptStub); + sinon.assert.calledTwice(addBidResponseStub); - const placementCode = addBidResponseStub.getCall(0).args[0]; - const secondPlacementCode = addBidResponseStub.getCall(1).args[0]; + expectedResponses.forEach((expectedResponse, i) => { - const bidObject = addBidResponseStub.getCall(0).args[1]; - const secondBidObject = addBidResponseStub.getCall(1).args[1]; + const placementCode = addBidResponseStub.getCall(i).args[0]; + const bidObject = addBidResponseStub.getCall(i).args[1]; - expect(placementCode).to.be.equal('div-gpt-ad-12345-1'); - expect(secondPlacementCode).to.be.equal('div-gpt-ad-12345-2'); + expect(placementCode).to.be.equal('div-gpt-ad-12345-' + (i + 1)); - expect(bidObject.getStatusCode()).to.be.equal(STATUS.GOOD); - expect(bidObject).to.have.property('cpm').and.to.equal(0.4); - expect(bidObject).to.have.property('ad').and.to.equal(''); - expect(bidObject).to.have.property('width').and.to.equal('300'); - expect(bidObject).to.have.property('height').and.to.equal('250'); + expect(bidObject.getStatusCode()).to.be.equal(STATUS.GOOD); + expect(bidObject).to.have.property('cpm').and.to.equal(expectedResponse.cpm); + expect(bidObject).to.have.property('ad').and.to.equal(expectedResponse.ad); + expect(bidObject).to.have.property('width').and.to.equal(expectedResponse.width); + expect(bidObject).to.have.property('height').and.to.equal(expectedResponse.height); - expect(secondBidObject.getStatusCode()).to.be.equal(STATUS.GOOD); - expect(secondBidObject).to.have.property('cpm').and.to.equal(0.4); - expect(secondBidObject).to.have.property('ad').and.to.equal(''); - expect(secondBidObject).to.have.property('width').and.to.equal('300'); - expect(secondBidObject).to.have.property('height').and.to.equal('250'); + }); }); @@ -404,7 +310,7 @@ describe('hiromedia adapter', function () { it('adds responses according to the sampling defined in the response', () => { const response = { - batchKey: [DEFAULT_ENDPOINT,'1337','300x250'].join('-'), + batchKey: [DEFAULT_ENDPOINT,'1337','300x250',''].join('-'), cpm: 0.4, chance: 0.25, ad: '' @@ -437,7 +343,7 @@ describe('hiromedia adapter', function () { }); const params = { - bids: [allowedPlacement()] + bids: [tilePlacement()] }; adapter.callBids(params); From 83f6ce67f71e043e5e954ce69fb4a859f4227dd2 Mon Sep 17 00:00:00 2001 From: ronenst Date: Tue, 18 Apr 2017 18:30:20 +0300 Subject: [PATCH 36/38] Fix `buildMasterVideoTagFromAdserverTag()` not selecting winning bid (#1106) --- src/adserver.js | 12 +++++---- test/spec/unit/pbjs_api_spec.js | 45 ++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/adserver.js b/src/adserver.js index b4ec8a22a63..dbdcb0f916b 100644 --- a/src/adserver.js +++ b/src/adserver.js @@ -1,12 +1,12 @@ import {formatQS} from './url'; +import {getWinningBids} from './targeting'; //Adserver parent class const AdServer = function(attr) { this.name = attr.adserver; this.code = attr.code; this.getWinningBidByCode = function() { - var bidObject = $$PREBID_GLOBAL$$._bidsReceived.find(bid => bid.adUnitCode === this.code); - return bidObject; + return getWinningBids(this.code)[0]; }; }; @@ -30,9 +30,11 @@ exports.dfpAdserver = function (options, urlComponents) { adserver.appendQueryParams = function() { var bid = adserver.getWinningBidByCode(); - this.urlComponents.search.description_url = encodeURIComponent(bid.descriptionUrl); - this.urlComponents.search.cust_params = getCustomParams(bid.adserverTargeting); - this.urlComponents.search.correlator = Date.now(); + if (bid) { + this.urlComponents.search.description_url = encodeURIComponent(bid.descriptionUrl); + this.urlComponents.search.cust_params = getCustomParams(bid.adserverTargeting); + this.urlComponents.search.correlator = Date.now(); + } }; adserver.verifyAdserverTag = function() { diff --git a/test/spec/unit/pbjs_api_spec.js b/test/spec/unit/pbjs_api_spec.js index c1d093cfe00..8947b604a45 100644 --- a/test/spec/unit/pbjs_api_spec.js +++ b/test/spec/unit/pbjs_api_spec.js @@ -11,6 +11,8 @@ import { var assert = require('chai').assert; var expect = require('chai').expect; +var urlParse = require('url-parse'); + var prebid = require('src/prebid'); var utils = require('src/utils'); var bidmanager = require('src/bidmanager'); @@ -1432,6 +1434,27 @@ describe('Unit: Prebid Module', function () { beforeEach(() => { resetAuction(); $$PREBID_GLOBAL$$._bidsReceived = [ + { + "bidderCode": "appnexusAstDummyName", + "width": 0, + "height": 0, + "statusMessage": "Bid returned empty or error response", + "adId": "233bcbee889d46d", + "requestId": 123456, + "responseTimestamp": 1462919238959, + "requestTimestamp": 1462919238910, + "cpm": 0, + "bidder": "appnexus", + "adUnitCode": "/19968336/header-bid-tag-0", + "timeToRespond": 49, + "pbLg": "0.00", + "pbMg": "0.00", + "pbHg": "0.00", + "pbAg": "0.00", + "pbDg": "0.00", + "pbCg": "", + "adserverTargeting": {} + }, { "bidderCode": "appnexusAst", "dealId" : "1234", @@ -1441,7 +1464,8 @@ describe('Unit: Prebid Module', function () { "adId": "233bcbee889d46d", "creative_id": 29681110, "cpm": 10, - "adUrl": "http://lax1-ib.adnxs.com/ab?e=wqT_3QL8BKh8AgAAAwDWAAUBCMjAybkFEMLLiJWTu9PsVxjL84KE1tzG-kkgASotCQAAAQII4D8RAQcQAADgPxkJCQjwPyEJCQjgPykRCaAwuvekAji-B0C-B0gCUNbLkw5YweAnYABokUB4190DgAEBigEDVVNEkgUG8FKYAawCoAH6AagBAbABALgBAcABA8gBANABANgBAOABAPABAIoCOnVmKCdhJywgNDk0NDcyLCAxNDYyOTE5MjQwKTt1ZigncicsIDI5NjgxMTEwLDIeAPBskgLZASFmU21rZ0FpNjBJY0VFTmJMa3c0WUFDREI0Q2N3QURnQVFBUkl2Z2RRdXZla0FsZ0FZSk1IYUFCd0EzZ0RnQUVEaUFFRGtBRUJtQUVCb0FFQnFBRURzQUVBdVFFQUFBQUFBQURnUDhFQgkMTEFBNERfSkFRMkxMcEVUMU93XzJRFSggd1AtQUJBUFVCBSxASmdDaW9EVTJnV2dBZ0MxQWcBFgRDOQkIqERBQWdQSUFnUFFBZ1BZQWdQZ0FnRG9BZ0Q0QWdDQUF3RS6aAiUhV1FrbmI63AAcd2VBbklBUW8JXPCVVS7YAugH4ALH0wHqAh9odHRwOi8vcHJlYmlkLm9yZzo5OTk5L2dwdC5odG1sgAMAiAMBkAMAmAMFoAMBqgMAsAMAuAMAwAOsAsgDANgDAOADAOgDAPgDA4AEAJIEBC9qcHSYBACiBAoxMC4xLjEzLjM3qAQAsgQICAAQABgAIAC4BADABADIBADSBAoxMC4wLjg1Ljkx&s=1bf15e8cdc7c0c8c119614c6386ab1496560da39&referrer=http%3A%2F%2Fprebid.org%3A9999%2Fgpt.html", + "vastUrl": "http://www.simplevideoad.com/", + "descriptionUrl": "http://www.simplevideoad.com/", "responseTimestamp": 1462919239340, "requestTimestamp": 1462919238919, "bidder": "appnexus", @@ -1487,6 +1511,15 @@ describe('Unit: Prebid Module', function () { expect(masterTagUrl).to.equal(adserverTag); }); + it('should return original adservertag if there are no bids for the given placement code', () => { + var options = { + 'adserver': 'dfp', + 'code': 'one-without-bids' + }; + var masterTagUrl = $$PREBID_GLOBAL$$.buildMasterVideoTagFromAdserverTag(adserverTag, options); + expect(masterTagUrl).to.equal(adserverTag); + }); + it('should log error when google\'s parameters are missing in adserverTag', () => { var logErrorSpy = sinon.spy(utils, 'logError'); var adserverTag = 'https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/19968336/header-bid-tag-0&impl=s&gdfp_req=1&env=vp&output=xml_vast2&unviewed_position_start=1&url=www.test.com'; @@ -1494,6 +1527,16 @@ describe('Unit: Prebid Module', function () { assert.ok(logErrorSpy.calledOnce, true); utils.logError.restore(); }); + + it('should append parameters to the adserverTag', () => { + var masterTagUrl = $$PREBID_GLOBAL$$.buildMasterVideoTagFromAdserverTag(adserverTag, options); + var masterTagUrlParsed = urlParse(masterTagUrl, true); + var masterTagQuery = masterTagUrlParsed.query; + var expectedTargetingQuery = 'hb_bidder=appnexus&hb_adid=233bcbee889d46d&hb_pb=10.00&hb_size=300x250&foobar=300x250&hb_deal_appnexusAst=1234'; + + expect(masterTagQuery).to.have.property('cust_params').and.to.equal(expectedTargetingQuery); + expect(masterTagQuery).to.have.property('description_url').and.to.equal('http://www.simplevideoad.com/'); + }); }); describe('setBidderSequence', () => { From 7f1814c9e9a32f14d66d804ff3681d495fee5e99 Mon Sep 17 00:00:00 2001 From: Hugo Duthil Date: Tue, 18 Apr 2017 17:57:21 +0200 Subject: [PATCH 37/38] Send transactionID to Criteo Services (#1113) --- src/adapters/criteo.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/adapters/criteo.js b/src/adapters/criteo.js index 25759c30876..eb1c522350a 100644 --- a/src/adapters/criteo.js +++ b/src/adapters/criteo.js @@ -47,7 +47,9 @@ var CriteoAdapter = function CriteoAdapter() { slots.push( new Criteo.PubTag.DirectBidding.DirectBiddingSlot( bid.placementCode, - bid.params.zoneId + bid.params.zoneId, + undefined, + bid.transactionId ) ); From 6a6724c6e92bb11d89b72e71c0065ab7480e57a0 Mon Sep 17 00:00:00 2001 From: Dan Harton Date: Tue, 18 Apr 2017 14:30:47 -0700 Subject: [PATCH 38/38] Add optional domain parameter to AdButler adapter (#1078) * Adding AdButler Adapter * Prevent AdButler TypeError Only attempt to build a bid response if we have the information of which bid to respond to. * Refactor AdButler Testing Now stubbing adLoader instead of spying. Additional changes to ensure all tests still passed. * Prevent AdButler TypeErrors Prevent AdButler TypeErrors and pass bid request object into the bid response. * Add optional domain parameter. Add optional domain parameter to AdButler adapter. --- src/adapters/adbutler.js | 15 ++++++++++----- test/spec/adapters/adbutler_spec.js | 28 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/adapters/adbutler.js b/src/adapters/adbutler.js index 00f8d4db1a2..a0005e89e4f 100644 --- a/src/adapters/adbutler.js +++ b/src/adapters/adbutler.js @@ -105,11 +105,16 @@ var AdButlerAdapter = function AdButlerAdapter() { } function buildRequest(bid,adIndex,pageID){ - var accountID = utils.getBidIdParameter('accountID', bid.params); - var zoneID = utils.getBidIdParameter('zoneID', bid.params); - var keyword = utils.getBidIdParameter('keyword', bid.params); - - var requestURI = location.protocol + '//servedbyadbutler.com/adserve/;type=hbr;'; + var accountID = utils.getBidIdParameter('accountID', bid.params), + zoneID = utils.getBidIdParameter('zoneID', bid.params), + keyword = utils.getBidIdParameter('keyword', bid.params), + domain = utils.getBidIdParameter('domain', bid.params); + + if(typeof domain === 'undefined' || domain.length === 0){ + domain = 'servedbyadbutler.com'; + } + + var requestURI = location.protocol + '//' + domain + '/adserve/;type=hbr;'; requestURI += 'ID='+encodeURIComponent(accountID)+';'; requestURI += 'setID='+encodeURIComponent(zoneID)+';'; requestURI += 'pid='+encodeURIComponent(pageID)+';'; diff --git a/test/spec/adapters/adbutler_spec.js b/test/spec/adapters/adbutler_spec.js index 465ef89bfe6..172c2205210 100644 --- a/test/spec/adapters/adbutler_spec.js +++ b/test/spec/adapters/adbutler_spec.js @@ -83,7 +83,33 @@ describe('adbutler adapter tests', function () { var requestURI = stubLoadScript.getCall(0).args[0]; expect(requestURI).to.have.string(';kw=fish;'); - }) + }); + + it('should use custom domain string',function(){ + var params = { + bidderCode: 'adbutler', + bids: [ + { + bidId: '3c9408cdbf2f68', + sizes: [[300, 250]], + bidder: 'adbutler', + params: { + accountID: '107878', + zoneID: '86133', + domain: 'servedbyadbutler.com.dan.test' + }, + requestId: '10b327aa396609', + placementCode: '/123456/header-bid-tag-1' + } + ] + }; + + adapter().callBids(params); + + var requestURI = stubLoadScript.getCall(0).args[0]; + + expect(requestURI).to.have.string('.dan.test'); + }); }); describe('bid responses',function(){