diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap
index f2f97d81..7048bc83 100644
--- a/__tests__/__snapshots__/index.js.snap
+++ b/__tests__/__snapshots__/index.js.snap
@@ -58,6 +58,8 @@ Object {
       "getLookerDone": [Function],
     },
     "lookup": Object {
+      "getAllCountriesDone": [Function],
+      "getAllCountriesInit": [Function],
       "getCountriesDone": [Function],
       "getCountriesInit": [Function],
       "getSkillTagsDone": [Function],
diff --git a/__tests__/actions/__snapshots__/lookup.js.snap b/__tests__/actions/__snapshots__/lookup.js.snap
index 8940c5c6..1b96d5b6 100644
--- a/__tests__/actions/__snapshots__/lookup.js.snap
+++ b/__tests__/actions/__snapshots__/lookup.js.snap
@@ -3,6 +3,8 @@
 exports[`Module exports 1`] = `
 Object {
   "lookup": Object {
+    "getAllCountriesDone": [Function],
+    "getAllCountriesInit": [Function],
     "getCountriesDone": [Function],
     "getCountriesInit": [Function],
     "getSkillTagsDone": [Function],
diff --git a/__tests__/reducers/__snapshots__/lookup.js.snap b/__tests__/reducers/__snapshots__/lookup.js.snap
index a6e9710e..366913f0 100644
--- a/__tests__/reducers/__snapshots__/lookup.js.snap
+++ b/__tests__/reducers/__snapshots__/lookup.js.snap
@@ -2,6 +2,7 @@
 
 exports[`Default reducer Get countries 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [
     Object {
       "country": "Afghanistan",
@@ -23,6 +24,7 @@ Object {
 
 exports[`Default reducer Get countries error 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [
     Object {
       "country": "Afghanistan",
@@ -44,6 +46,7 @@ Object {
 
 exports[`Default reducer Get skill tags 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [],
   "loadingSkillTagsError": false,
   "skillTags": Array [
@@ -59,6 +62,7 @@ Object {
 
 exports[`Default reducer Get skill tags error 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [],
   "loadingSkillTagsError": true,
   "skillTags": Array [
@@ -74,6 +78,7 @@ Object {
 
 exports[`Default reducer Initial state 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [],
   "skillTags": Array [],
 }
@@ -81,6 +86,7 @@ Object {
 
 exports[`Factory without server side rendering Get countries 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [
     Object {
       "country": "Afghanistan",
@@ -102,6 +108,7 @@ Object {
 
 exports[`Factory without server side rendering Get countries error 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [
     Object {
       "country": "Afghanistan",
@@ -123,6 +130,7 @@ Object {
 
 exports[`Factory without server side rendering Get skill tags 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [],
   "loadingSkillTagsError": false,
   "skillTags": Array [
@@ -138,6 +146,7 @@ Object {
 
 exports[`Factory without server side rendering Get skill tags error 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [],
   "loadingSkillTagsError": true,
   "skillTags": Array [
@@ -153,6 +162,7 @@ Object {
 
 exports[`Factory without server side rendering Initial state 1`] = `
 Object {
+  "allCountries": Array [],
   "countries": Array [],
   "skillTags": Array [],
 }
diff --git a/dist/dev/index.js b/dist/dev/index.js
index 05fbe807..8e98183f 100644
--- a/dist/dev/index.js
+++ b/dist/dev/index.js
@@ -412,7 +412,7 @@ eval("var Keys = __webpack_require__(/*! object-keys */ \"./node_modules/object-
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _api = __webpack_require__(/*! ../services/api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.auth\"\n    * @desc Actions related to Topcoder authentication system.\n    */\n\n/**\n * @static\n * @desc Creates an action that loads Topcoder user profile from v3 API.\n * @param {String} userTokenV3 v3 authentication token.\n * @return {Action}\n */\nfunction loadProfileDone(userTokenV3) {\n  if (!userTokenV3) return _promise2.default.resolve(null);\n  var user = (0, _tcAccounts.decodeToken)(userTokenV3);\n  var api = (0, _api.getApi)('V3', userTokenV3);\n  return _promise2.default.all([api.get('/members/' + user.handle).then(function (res) {\n    return res.json();\n  }).then(function (res) {\n    return res.result.status === 200 ? res.result.content : {};\n  }), api.get('/groups?memberId=' + user.userId + '&membershipType=user').then(function (res) {\n    return res.json();\n  }).then(function (res) {\n    return res.result.status === 200 ? res.result.content : [];\n  })]).then(function (_ref) {\n    var _ref2 = (0, _slicedToArray3.default)(_ref, 2),\n        profile = _ref2[0],\n        groups = _ref2[1];\n\n    return (0, _extends3.default)({}, profile, { groups: groups });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that sets Topcoder v2 authentication token.\n * @param {String} tokenV2 Topcoder v2 authentication token.\n * @return {Action}\n */\nfunction setTcTokenV2(tokenV2) {\n  return tokenV2;\n}\n\n/**\n * @static\n * @desc Creates an action that decodes Topcoder v3 authentication token,\n * to get user object, and then writes both the token and the user object into\n * Redux store.\n * @param {String} tokenV3 Topcoder v3 authentication token.\n * @return {Action}\n */\nfunction setTcTokenV3(tokenV3) {\n  return tokenV3;\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  AUTH: {\n    LOAD_PROFILE: loadProfileDone,\n    SET_TC_TOKEN_V2: setTcTokenV2,\n    SET_TC_TOKEN_V3: setTcTokenV3\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(loadProfileDone, 'loadProfileDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/auth.js');\n  reactHotLoader.register(setTcTokenV2, 'setTcTokenV2', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/auth.js');\n  reactHotLoader.register(setTcTokenV3, 'setTcTokenV3', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/auth.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/auth.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/auth.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _api = __webpack_require__(/*! ../services/api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.auth\"\n    * @desc Actions related to Topcoder authentication system.\n    */\n\n/**\n * @static\n * @desc Creates an action that loads Topcoder user profile from v3 API.\n * @param {String} userTokenV3 v3 authentication token.\n * @return {Action}\n */\nfunction loadProfileDone(userTokenV3) {\n  if (!userTokenV3) return _promise2.default.resolve(null);\n  var user = (0, _tcAccounts.decodeToken)(userTokenV3);\n  var api = (0, _api.getApi)('V3', userTokenV3);\n  return _promise2.default.all([api.get('/members/' + user.handle).then(function (res) {\n    return res.json();\n  }).then(function (res) {\n    return res.result.status === 200 ? res.result.content : {};\n  }), api.get('/groups?memberId=' + user.userId + '&membershipType=user').then(function (res) {\n    return res.json();\n  }).then(function (res) {\n    return res.result.status === 200 ? res.result.content : [];\n  })]).then(function (_ref) {\n    var _ref2 = (0, _slicedToArray3.default)(_ref, 2),\n        profile = _ref2[0],\n        groups = _ref2[1];\n\n    return (0, _extends3.default)({}, profile, { groups: groups });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that sets Topcoder v2 authentication token.\n * @param {String} tokenV2 Topcoder v2 authentication token.\n * @return {Action}\n */\nfunction setTcTokenV2(tokenV2) {\n  return tokenV2;\n}\n\n/**\n * @static\n * @desc Creates an action that decodes Topcoder v3 authentication token,\n * to get user object, and then writes both the token and the user object into\n * Redux store.\n * @param {String} tokenV3 Topcoder v3 authentication token.\n * @return {Action}\n */\nfunction setTcTokenV3(tokenV3) {\n  return tokenV3;\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  AUTH: {\n    LOAD_PROFILE: loadProfileDone,\n    SET_TC_TOKEN_V2: setTcTokenV2,\n    SET_TC_TOKEN_V3: setTcTokenV3\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(loadProfileDone, 'loadProfileDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/auth.js');\n  reactHotLoader.register(setTcTokenV2, 'setTcTokenV2', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/auth.js');\n  reactHotLoader.register(setTcTokenV3, 'setTcTokenV3', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/auth.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/auth.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/auth.js?");
 
 /***/ }),
 
@@ -424,7 +424,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads Marathon Match submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {Array} registrants The array of register.\n * @param {String} tokenV3  Topcoder auth token v3.\n * @return {Action}\n */\nvar getMMSubmissionsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(challengeId, registrants, tokenV3) {\n    var submissionsService, submissions;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            submissionsService = (0, _submissions.getService)(tokenV3);\n            _context.next = 3;\n            return submissionsService.getSubmissions(challengeId);\n\n          case 3:\n            submissions = _context.sent;\n            return _context.abrupt('return', { challengeId: challengeId, submissions: submissions, tokenV3: tokenV3 });\n\n          case 5:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getMMSubmissionsDone(_x, _x2, _x3) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that signals beginning of registration for a\n * challenge.\n * @return {Action}\n */\n\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\nvar _submissions = __webpack_require__(/*! ../services/submissions */ \"./src/services/submissions.js\");\n\nvar _api = __webpack_require__(/*! ../services/api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.challenge\"\n    * @desc Actions related to Topcoder challenges APIs.\n    */\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all checkpoints loaded\n *  before.\n * @return {Action}\n */\nfunction dropCheckpoints() {}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all challenge results\n *  loaded before.\n * @return {Action}\n */\nfunction dropResults() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction getDetailsInit(challengeId) {\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge details.\n * @param {Number|String} challengeId Challenge ID.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @return {Action}\n */\nfunction getDetailsDone(challengeId, tokenV3, tokenV2) {\n  var service = (0, _challenges.getService)(tokenV3, tokenV2);\n  var v3Promise = service.getChallengeDetails(challengeId);\n  return v3Promise;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getSubmissionsInit(challengeId) {\n  /* As a safeguard, we enforce challengeId to be string (in case somebody\n   * passes in a number, by mistake). */\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads user's submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {String} tokenV2  Topcoder auth token v2.\n * @return {Action}\n */\nfunction getSubmissionsDone(challengeId, tokenV2) {\n  return (0, _api.getApi)('V2', tokenV2).fetch('/challenges/submissions/' + challengeId + '/mySubmissions').then(function (response) {\n    return response.json();\n  }).then(function (response) {\n    return {\n      challengeId: _lodash2.default.toString(challengeId),\n      submissions: response.submissions\n    };\n  }).catch(function (error) {\n    var err = { challengeId: _lodash2.default.toString(challengeId), error: error };\n    throw err;\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of Marathon Match submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getMMSubmissionsInit(challengeId) {\n  /* As a safeguard, we enforce challengeId to be string (in case somebody\n   * passes in a number, by mistake). */\n  return _lodash2.default.toString(challengeId);\n}function registerInit() {}\n\n/**\n * @static\n * @desc Creates an action that registers user for a challenge.\n * @param {Object} auth An object that holds auth tokens. You can directly pass\n *  here the `auth` segment of Redux store.\n * @param [auth.tokenV2]{String} Topcoder auth token v2.\n * @param [auth.tokenV3]{String} Topcoder auth token v3.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction registerDone(auth, challengeId) {\n  return (0, _challenges.getService)(auth.tokenV3).register(challengeId)\n  /* As a part of registration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. */\n  // Uses a delay to allow API time to update\n  .then(function () {\n    return new _promise2.default(function (resolve) {\n      return setTimeout(function () {\n        return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n      }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n    });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user unregistration from a\n *  challenge.\n * @return {Action}\n */\nfunction unregisterInit() {}\n\n/**\n * @static\n * @desc Creates an action that unregisters user from a challenge.\n * @param {Object} auth Object that holds Topcoder auth tokens.\n * @param {String} [auth.tokenV2] v2 token.\n * @param {String} [auth.tokenV3] v3 token.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction unregisterDone(auth, challengeId) {\n  return (0, _challenges.getService)(auth.tokenV3).unregister(challengeId)\n  /* As a part of unregistration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. */\n  // Uses a delay to allow API time to update\n  .then(function () {\n    return new _promise2.default(function (resolve) {\n      return setTimeout(function () {\n        return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n      }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n    });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge results loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction loadResultsInit(challengeId) {\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge results.\n * @param {Object} auth Object that holds Topcoder auth tokens.\n * @param {String} [auth.tokenV2] v2 token.\n * @param {String} [auth.tokenV3] v3 token.\n * @param {Number|String} challengeId Challenge ID. Should match the one passed\n *  in the previous {@link module:actions.challenge.loadResultsInit} call.\n * @param {String} type Challenge type.\n * @return {Action}\n */\nfunction loadResultsDone(auth, challengeId, type) {\n  return (0, _api.getApi)('V2', auth.tokenV2).fetch('/' + type + '/challenges/result/' + challengeId).then(function (response) {\n    return response.json();\n  }).then(function (response) {\n    return {\n      challengeId: _lodash2.default.toString(challengeId),\n      results: response.results\n    };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge checkpoints data\n *  loading.\n * @return {Action}\n */\nfunction fetchCheckpointsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads challenge checkpoints data.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @param {String} challengeId Challenge ID.\n */\nfunction fetchCheckpointsDone(tokenV2, challengeId) {\n  var endpoint = '/design/challenges/checkpoint/' + challengeId;\n  return (0, _api.getApi)('V2', tokenV2).fetch(endpoint).then(function (response) {\n    if (response.status !== 200) {\n      throw response.status;\n    } else {\n      return response.json();\n    }\n  }).then(function (response) {\n    // Expanded key is used for UI expand/collapse.\n    response.checkpointResults.forEach(function (checkpoint, index) {\n      response.checkpointResults[index].expanded = false;\n    });\n    return {\n      challengeId: Number(challengeId),\n      checkpoints: response\n    };\n  }).catch(function (error) {\n    return {\n      error: error,\n      challengeId: Number(challengeId)\n    };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that Toggles checkpoint details panel in the Topcoder\n *  Submission Management Page.\n * @todo This is UI action relevant to a specific page in specific app. Must be\n *  moved back to Community App.\n * @param {Number} id Checkpoint ID.\n * @param {Boolean} open Target state: `true` to expand, `false` to collapse the\n *  details.\n * @return {Action}\n */\nfunction toggleCheckpointFeedback(id, open) {\n  return { id: id, open: open };\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details update.\n * @todo No idea, why we have this action. This functionality should be covered\n *  by {@link module:actions.challenge.getDetailsInit} and\n *  {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid UUID of the operation (the same should be passed into\n *  the corresponding {@link module:actions.challenge.updateChallengeDone}).\n * @return {Action}\n */\nfunction updateChallengeInit(uuid) {\n  return uuid;\n}\n\n/**\n * @static\n * @desc Creates an action that updates challenge details.\n * @todo No idea, why we have this action. This functionality should be covered\n *  by {@link module:actions.challenge.getDetailsInit} and\n *  {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid Operation UUID. Should match the one passed into the\n *  previous {@link module:actions.challenge.updateChallengeInit} call.\n * @param {Object} challenge Challenge data.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction updateChallengeDone(uuid, challenge, tokenV3) {\n  return (0, _challenges.getService)(tokenV3).updateChallenge(challenge).then(function (res) {\n    return { uuid: uuid, res: res };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting count of user's active challenges.\n * @return {Action}\n */\nfunction getActiveChallengesCountInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets count of user's active challenges from the backend.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Optional. Topcoder auth token v3. Without token only\n *  public challenges will be counted. With the token provided, the action will\n *  also count private challenges related to this user.\n * @return {Action}\n */\nfunction getActiveChallengesCountDone(handle, tokenV3) {\n  return (0, _challenges.getService)(tokenV3).getActiveChallengesCount(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information by submission id\n * @param {String} submissionId The submission id\n * @return {Action}\n */\nfunction getSubmissionInformationInit(submissionId) {\n  return _lodash2.default.toString(submissionId);\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information from the backend.\n * @param {String} submissionId The submission id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getSubmissionInformationDone(submissionId, tokenV3) {\n  return (0, _submissions.getService)(tokenV3).getSubmissionInformation(submissionId).then(function (response) {\n    return {\n      submissionId: submissionId, submission: response\n    };\n  });\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  CHALLENGE: {\n    DROP_CHECKPOINTS: dropCheckpoints,\n    DROP_RESULTS: dropResults,\n    FETCH_CHECKPOINTS_INIT: fetchCheckpointsInit,\n    FETCH_CHECKPOINTS_DONE: fetchCheckpointsDone,\n    GET_DETAILS_INIT: getDetailsInit,\n    GET_DETAILS_DONE: getDetailsDone,\n    GET_SUBMISSIONS_INIT: getSubmissionsInit,\n    GET_SUBMISSIONS_DONE: getSubmissionsDone,\n    LOAD_RESULTS_INIT: loadResultsInit,\n    LOAD_RESULTS_DONE: loadResultsDone,\n    REGISTER_INIT: registerInit,\n    REGISTER_DONE: registerDone,\n    TOGGLE_CHECKPOINT_FEEDBACK: toggleCheckpointFeedback,\n    UNREGISTER_INIT: unregisterInit,\n    UNREGISTER_DONE: unregisterDone,\n    UPDATE_CHALLENGE_INIT: updateChallengeInit,\n    UPDATE_CHALLENGE_DONE: updateChallengeDone,\n    GET_ACTIVE_CHALLENGES_COUNT_INIT: getActiveChallengesCountInit,\n    GET_ACTIVE_CHALLENGES_COUNT_DONE: getActiveChallengesCountDone,\n    GET_MM_SUBMISSIONS_INIT: getMMSubmissionsInit,\n    GET_MM_SUBMISSIONS_DONE: getMMSubmissionsDone,\n    GET_SUBMISSION_INFORMATION_INIT: getSubmissionInformationInit,\n    GET_SUBMISSION_INFORMATION_DONE: getSubmissionInformationDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(dropCheckpoints, 'dropCheckpoints', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(dropResults, 'dropResults', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getDetailsInit, 'getDetailsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getDetailsDone, 'getDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionsInit, 'getSubmissionsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionsDone, 'getSubmissionsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getMMSubmissionsInit, 'getMMSubmissionsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getMMSubmissionsDone, 'getMMSubmissionsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(registerInit, 'registerInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(registerDone, 'registerDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(unregisterInit, 'unregisterInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(unregisterDone, 'unregisterDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(loadResultsInit, 'loadResultsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(loadResultsDone, 'loadResultsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(fetchCheckpointsInit, 'fetchCheckpointsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(fetchCheckpointsDone, 'fetchCheckpointsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(toggleCheckpointFeedback, 'toggleCheckpointFeedback', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(updateChallengeInit, 'updateChallengeInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(updateChallengeDone, 'updateChallengeDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getActiveChallengesCountInit, 'getActiveChallengesCountInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getActiveChallengesCountDone, 'getActiveChallengesCountDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionInformationInit, 'getSubmissionInformationInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionInformationDone, 'getSubmissionInformationDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/challenge.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/challenge.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\nvar _submissions = __webpack_require__(/*! ../services/submissions */ \"./src/services/submissions.js\");\n\nvar _members = __webpack_require__(/*! ../services/members */ \"./src/services/members.js\");\n\nvar _api = __webpack_require__(/*! ../services/api */ \"./src/services/api.js\");\n\nvar _submission = __webpack_require__(/*! ../utils/submission */ \"./src/utils/submission.js\");\n\nvar submissionUtil = _interopRequireWildcard(_submission);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.challenge\"\n    * @desc Actions related to Topcoder challenges APIs.\n    */\n\n/* global CONFIG */\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000},\n    PAGE_SIZE = _CONFIG.PAGE_SIZE;\n\n/**\n * Private. Loads from the backend all data matching some conditions.\n * @param {Function} getter Given params object of shape { limit, offset }\n *  loads from the backend at most \"limit\" data, skipping the first\n *  \"offset\" ones. Returns loaded data as an array.\n * @param {Number} page Optional. Next page of data to load.\n * @param {Number} perPage Optional. The size of the page content to load.\n * @param {Array} prev Optional. data loaded so far.\n */\n\nfunction getAll(getter) {\n  var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var perPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : PAGE_SIZE;\n  var prev = arguments[3];\n\n  /* Amount of submissions to fetch in one API call. 50 is the current maximum\n   * amount of submissions the backend returns, event when the larger limit is\n   * explicitely required. */\n  return getter({\n    page: page,\n    perPage: perPage\n  }).then(function (res) {\n    if (res.length === 0) {\n      return prev || res;\n    }\n    // parse submissions\n    var current = [];\n    if (prev) {\n      current = prev.concat(res);\n    } else {\n      current = res;\n    }\n    return getAll(getter, 1 + page, perPage, current);\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all checkpoints loaded\n *  before.\n * @return {Action}\n */\nfunction dropCheckpoints() {}\n\n/**\n * @static\n * @desc Creates an action that drops from Redux store all challenge results\n *  loaded before.\n * @return {Action}\n */\nfunction dropResults() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction getDetailsInit(challengeId) {\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge details.\n * @param {Number|String} challengeId Challenge ID.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @return {Action}\n */\nfunction getDetailsDone(challengeId, tokenV3, tokenV2) {\n  var service = (0, _challenges.getService)(tokenV3, tokenV2);\n  var v3Promise = service.getChallengeDetails(challengeId);\n  return v3Promise;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getSubmissionsInit(challengeId) {\n  /* As a safeguard, we enforce challengeId to be string (in case somebody\n   * passes in a number, by mistake). */\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads user's submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {String} tokenV2  Topcoder auth token v2.\n * @return {Action}\n */\nfunction getSubmissionsDone(challengeId, tokenV2) {\n  return (0, _api.getApi)('V2', tokenV2).fetch('/challenges/submissions/' + challengeId + '/mySubmissions').then(function (response) {\n    return response.json();\n  }).then(function (response) {\n    return {\n      challengeId: _lodash2.default.toString(challengeId),\n      submissions: response.submissions\n    };\n  }).catch(function (error) {\n    var err = { challengeId: _lodash2.default.toString(challengeId), error: error };\n    throw err;\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of Marathon Match submissions loading.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction getMMSubmissionsInit(challengeId) {\n  /* As a safeguard, we enforce challengeId to be string (in case somebody\n   * passes in a number, by mistake). */\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads Marathon Match submissions to the specified\n * challenge.\n * @param {String} challengeId Challenge ID.\n * @param {Array} registrants The array of register.\n * @param {String} tokenV3  Topcoder auth token v3.\n * @return {Action}\n */\nfunction getMMSubmissionsDone(challengeId, registrants, tokenV3) {\n  var filter = { challengeId: challengeId };\n  var memberService = (0, _members.getService)(tokenV3);\n  var submissionsService = (0, _submissions.getService)(tokenV3);\n\n  // TODO: Move those numbers to configs\n  return getAll(function (params) {\n    return submissionsService.getSubmissions(filter, params);\n  }, 1, 500).then(function (submissions) {\n    var userIds = _lodash2.default.uniq(_lodash2.default.map(submissions, function (sub) {\n      return sub.memberId;\n    }));\n    return memberService.getMembersInformation(userIds).then(function (resources) {\n      var finalSubmissions = submissionUtil.processMMSubmissions(submissions, resources, registrants);\n      return {\n        challengeId: challengeId,\n        submissions: finalSubmissions,\n        tokenV3: tokenV3\n      };\n    });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of registration for a\n * challenge.\n * @return {Action}\n */\nfunction registerInit() {}\n\n/**\n * @static\n * @desc Creates an action that registers user for a challenge.\n * @param {Object} auth An object that holds auth tokens. You can directly pass\n *  here the `auth` segment of Redux store.\n * @param [auth.tokenV2]{String} Topcoder auth token v2.\n * @param [auth.tokenV3]{String} Topcoder auth token v3.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction registerDone(auth, challengeId) {\n  return (0, _challenges.getService)(auth.tokenV3).register(challengeId)\n  /* As a part of registration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. */\n  // Uses a delay to allow API time to update\n  .then(function () {\n    return new _promise2.default(function (resolve) {\n      return setTimeout(function () {\n        return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n      }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n    });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user unregistration from a\n *  challenge.\n * @return {Action}\n */\nfunction unregisterInit() {}\n\n/**\n * @static\n * @desc Creates an action that unregisters user from a challenge.\n * @param {Object} auth Object that holds Topcoder auth tokens.\n * @param {String} [auth.tokenV2] v2 token.\n * @param {String} [auth.tokenV3] v3 token.\n * @param {String} challengeId Challenge ID.\n * @return {Action}\n */\nfunction unregisterDone(auth, challengeId) {\n  return (0, _challenges.getService)(auth.tokenV3).unregister(challengeId)\n  /* As a part of unregistration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. */\n  // Uses a delay to allow API time to update\n  .then(function () {\n    return new _promise2.default(function (resolve) {\n      return setTimeout(function () {\n        return resolve(getDetailsDone(challengeId, auth.tokenV3, auth.tokenV2));\n      }, _topcoderReactUtils.config.CHALLENGE_DETAILS_REFRESH_DELAY);\n    });\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge results loading.\n * @param {Number|String} challengeId Challenge ID\n * @return {Action}\n */\nfunction loadResultsInit(challengeId) {\n  return _lodash2.default.toString(challengeId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads challenge results.\n * @param {Object} auth Object that holds Topcoder auth tokens.\n * @param {String} [auth.tokenV2] v2 token.\n * @param {String} [auth.tokenV3] v3 token.\n * @param {Number|String} challengeId Challenge ID. Should match the one passed\n *  in the previous {@link module:actions.challenge.loadResultsInit} call.\n * @param {String} type Challenge type.\n * @return {Action}\n */\nfunction loadResultsDone(auth, challengeId, type) {\n  return (0, _api.getApi)('V2', auth.tokenV2).fetch('/' + type + '/challenges/result/' + challengeId).then(function (response) {\n    return response.json();\n  }).then(function (response) {\n    return {\n      challengeId: _lodash2.default.toString(challengeId),\n      results: response.results\n    };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge checkpoints data\n *  loading.\n * @return {Action}\n */\nfunction fetchCheckpointsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads challenge checkpoints data.\n * @param {String} tokenV2 Topcoder v2 auth token.\n * @param {String} challengeId Challenge ID.\n */\nfunction fetchCheckpointsDone(tokenV2, challengeId) {\n  var endpoint = '/design/challenges/checkpoint/' + challengeId;\n  return (0, _api.getApi)('V2', tokenV2).fetch(endpoint).then(function (response) {\n    if (response.status !== 200) {\n      throw response.status;\n    } else {\n      return response.json();\n    }\n  }).then(function (response) {\n    // Expanded key is used for UI expand/collapse.\n    response.checkpointResults.forEach(function (checkpoint, index) {\n      response.checkpointResults[index].expanded = false;\n    });\n    return {\n      challengeId: Number(challengeId),\n      checkpoints: response\n    };\n  }).catch(function (error) {\n    return {\n      error: error,\n      challengeId: Number(challengeId)\n    };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that Toggles checkpoint details panel in the Topcoder\n *  Submission Management Page.\n * @todo This is UI action relevant to a specific page in specific app. Must be\n *  moved back to Community App.\n * @param {Number} id Checkpoint ID.\n * @param {Boolean} open Target state: `true` to expand, `false` to collapse the\n *  details.\n * @return {Action}\n */\nfunction toggleCheckpointFeedback(id, open) {\n  return { id: id, open: open };\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of challenge details update.\n * @todo No idea, why we have this action. This functionality should be covered\n *  by {@link module:actions.challenge.getDetailsInit} and\n *  {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid UUID of the operation (the same should be passed into\n *  the corresponding {@link module:actions.challenge.updateChallengeDone}).\n * @return {Action}\n */\nfunction updateChallengeInit(uuid) {\n  return uuid;\n}\n\n/**\n * @static\n * @desc Creates an action that updates challenge details.\n * @todo No idea, why we have this action. This functionality should be covered\n *  by {@link module:actions.challenge.getDetailsInit} and\n *  {@link module:actions.challenge.getDetailsDone}. We need to refactor this.\n * @param {String} uuid Operation UUID. Should match the one passed into the\n *  previous {@link module:actions.challenge.updateChallengeInit} call.\n * @param {Object} challenge Challenge data.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction updateChallengeDone(uuid, challenge, tokenV3) {\n  return (0, _challenges.getService)(tokenV3).updateChallenge(challenge).then(function (res) {\n    return { uuid: uuid, res: res };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting count of user's active challenges.\n * @return {Action}\n */\nfunction getActiveChallengesCountInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets count of user's active challenges from the backend.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Optional. Topcoder auth token v3. Without token only\n *  public challenges will be counted. With the token provided, the action will\n *  also count private challenges related to this user.\n * @return {Action}\n */\nfunction getActiveChallengesCountDone(handle, tokenV3) {\n  return (0, _challenges.getService)(tokenV3).getActiveChallengesCount(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information by submission id\n * @param {String} submissionId The submission id\n * @return {Action}\n */\nfunction getSubmissionInformationInit(challengeId, submissionId) {\n  return { challengeId: _lodash2.default.toString(challengeId), submissionId: _lodash2.default.toString(submissionId) };\n}\n\n/**\n * @static\n * @desc Creates an action that gets submission information from the backend.\n * @param {String} submissionId The submission id\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getSubmissionInformationDone(challengeId, submissionId, tokenV3) {\n  var filter = { challengeId: challengeId };\n  var submissionsService = (0, _submissions.getService)(tokenV3);\n\n  return getAll(function (params) {\n    return submissionsService.getSubmissions(filter, params);\n  }, 1, 500).then(function (submissions) {\n    var submission = _lodash2.default.find(submissions, { id: submissionId });\n    _lodash2.default.remove(submission.review, function (review) {\n      return review.typeId === {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000}.AV_SCAN_SCORER_REVIEW_TYPE_ID;\n    });\n    return { submissionId: submissionId, submission: submission };\n  });\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  CHALLENGE: {\n    DROP_CHECKPOINTS: dropCheckpoints,\n    DROP_RESULTS: dropResults,\n    FETCH_CHECKPOINTS_INIT: fetchCheckpointsInit,\n    FETCH_CHECKPOINTS_DONE: fetchCheckpointsDone,\n    GET_DETAILS_INIT: getDetailsInit,\n    GET_DETAILS_DONE: getDetailsDone,\n    GET_SUBMISSIONS_INIT: getSubmissionsInit,\n    GET_SUBMISSIONS_DONE: getSubmissionsDone,\n    LOAD_RESULTS_INIT: loadResultsInit,\n    LOAD_RESULTS_DONE: loadResultsDone,\n    REGISTER_INIT: registerInit,\n    REGISTER_DONE: registerDone,\n    TOGGLE_CHECKPOINT_FEEDBACK: toggleCheckpointFeedback,\n    UNREGISTER_INIT: unregisterInit,\n    UNREGISTER_DONE: unregisterDone,\n    UPDATE_CHALLENGE_INIT: updateChallengeInit,\n    UPDATE_CHALLENGE_DONE: updateChallengeDone,\n    GET_ACTIVE_CHALLENGES_COUNT_INIT: getActiveChallengesCountInit,\n    GET_ACTIVE_CHALLENGES_COUNT_DONE: getActiveChallengesCountDone,\n    GET_MM_SUBMISSIONS_INIT: getMMSubmissionsInit,\n    GET_MM_SUBMISSIONS_DONE: getMMSubmissionsDone,\n    GET_SUBMISSION_INFORMATION_INIT: getSubmissionInformationInit,\n    GET_SUBMISSION_INFORMATION_DONE: getSubmissionInformationDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(PAGE_SIZE, 'PAGE_SIZE', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getAll, 'getAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(dropCheckpoints, 'dropCheckpoints', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(dropResults, 'dropResults', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getDetailsInit, 'getDetailsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getDetailsDone, 'getDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionsInit, 'getSubmissionsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionsDone, 'getSubmissionsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getMMSubmissionsInit, 'getMMSubmissionsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getMMSubmissionsDone, 'getMMSubmissionsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(registerInit, 'registerInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(registerDone, 'registerDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(unregisterInit, 'unregisterInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(unregisterDone, 'unregisterDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(loadResultsInit, 'loadResultsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(loadResultsDone, 'loadResultsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(fetchCheckpointsInit, 'fetchCheckpointsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(fetchCheckpointsDone, 'fetchCheckpointsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(toggleCheckpointFeedback, 'toggleCheckpointFeedback', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(updateChallengeInit, 'updateChallengeInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(updateChallengeDone, 'updateChallengeDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getActiveChallengesCountInit, 'getActiveChallengesCountInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getActiveChallengesCountDone, 'getActiveChallengesCountDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionInformationInit, 'getSubmissionInformationInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(getSubmissionInformationDone, 'getSubmissionInformationDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/challenge.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/challenge.js?");
 
 /***/ }),
 
@@ -436,7 +436,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads projects related to a user.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Boolean} hasActiveBillingAccount Optional. Defaults to false.\n *  Whether only projects with active billing accounts should be included\n *  into the results.\n * @return {Action}\n */\nvar getUserProjectsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(tokenV3, hasActiveBillingAccount) {\n    var params, projects;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            params = {};\n\n            if (hasActiveBillingAccount) params.hasActiveBillingAccount = true;\n            _context.next = 4;\n            return (0, _direct.getService)(tokenV3).getUserProjects(params);\n\n          case 4:\n            projects = _context.sent;\n            return _context.abrupt('return', { tokenV3: tokenV3, projects: projects });\n\n          case 6:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getUserProjectsDone(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _direct = __webpack_require__(/*! ../services/direct */ \"./src/services/direct.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.direct\"\n    * @desc Actions related to Direct API: access to projects, billing accounts,\n    * copilot operations, and other similar stuff is handled by them.\n    */\n\n/**\n * @static\n * @desc Creates an action that drops out of Redux store all Direct-related\n *  data, loaded by other actions from this module, and also cancels any pending\n *  loading operations.\n * @return {Action}\n */\nfunction dropAll() {\n  return null;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of project details loading.\n * @param {Number} projectId Project ID.\n * @return {Action}\n */\nfunction getProjectDetailsInit(projectId) {\n  return projectId;\n}\n\n/**\n * @static\n * @desc Creates an action that loads project details.\n * @param {Number} projectId Project ID.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getProjectDetailsDone(projectId, tokenV3) {\n  return (0, _direct.getService)(tokenV3).getProjectDetails(projectId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of project permissions\n *  loading.\n * @param {Number|String} projectId Project ID.\n * @return {Action}\n */\nfunction getProjectPermissionsInit(projectId) {\n  return _lodash2.default.toNumber(projectId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads project permissions.\n * @param {Number|String} projectId Project ID.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction getProjectPermissionsDone(projectId, tokenV3) {\n  return (0, _direct.getService)(tokenV3).getProjectPermissions(projectId).then(function (permissions) {\n    return { permissions: permissions, projectId: projectId };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the projects\n *  related with a user.\n * @param {String} tokenV3 Topcoder v3 auth token of the user for who we load\n *  the projects.\n * @return {Action}\n */\nfunction getUserProjectsInit(tokenV3) {\n  return tokenV3;\n}\nvar _default = (0, _reduxActions.createActions)({\n  DIRECT: {\n    DROP_ALL: dropAll,\n    GET_PROJECT_DETAILS_INIT: getProjectDetailsInit,\n    GET_PROJECT_DETAILS_DONE: getProjectDetailsDone,\n    GET_PROJECT_PERMISSIONS_INIT: getProjectPermissionsInit,\n    GET_PROJECT_PERMISSIONS_DONE: getProjectPermissionsDone,\n    GET_USER_PROJECTS_INIT: getUserProjectsInit,\n    GET_USER_PROJECTS_DONE: getUserProjectsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(dropAll, 'dropAll', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectDetailsInit, 'getProjectDetailsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectDetailsDone, 'getProjectDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectPermissionsInit, 'getProjectPermissionsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectPermissionsDone, 'getProjectPermissionsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getUserProjectsInit, 'getUserProjectsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getUserProjectsDone, 'getUserProjectsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/direct.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/direct.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads projects related to a user.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Boolean} hasActiveBillingAccount Optional. Defaults to false.\n *  Whether only projects with active billing accounts should be included\n *  into the results.\n * @return {Action}\n */\nvar getUserProjectsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(tokenV3, hasActiveBillingAccount) {\n    var params, projects;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            params = {};\n\n            if (hasActiveBillingAccount) params.hasActiveBillingAccount = true;\n            _context.next = 4;\n            return (0, _direct.getService)(tokenV3).getUserProjects(params);\n\n          case 4:\n            projects = _context.sent;\n            return _context.abrupt('return', { tokenV3: tokenV3, projects: projects });\n\n          case 6:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getUserProjectsDone(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _direct = __webpack_require__(/*! ../services/direct */ \"./src/services/direct.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.direct\"\n    * @desc Actions related to Direct API: access to projects, billing accounts,\n    * copilot operations, and other similar stuff is handled by them.\n    */\n\n/**\n * @static\n * @desc Creates an action that drops out of Redux store all Direct-related\n *  data, loaded by other actions from this module, and also cancels any pending\n *  loading operations.\n * @return {Action}\n */\nfunction dropAll() {\n  return null;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of project details loading.\n * @param {Number} projectId Project ID.\n * @return {Action}\n */\nfunction getProjectDetailsInit(projectId) {\n  return projectId;\n}\n\n/**\n * @static\n * @desc Creates an action that loads project details.\n * @param {Number} projectId Project ID.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getProjectDetailsDone(projectId, tokenV3) {\n  return (0, _direct.getService)(tokenV3).getProjectDetails(projectId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of project permissions\n *  loading.\n * @param {Number|String} projectId Project ID.\n * @return {Action}\n */\nfunction getProjectPermissionsInit(projectId) {\n  return _lodash2.default.toNumber(projectId);\n}\n\n/**\n * @static\n * @desc Creates an action that loads project permissions.\n * @param {Number|String} projectId Project ID.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction getProjectPermissionsDone(projectId, tokenV3) {\n  return (0, _direct.getService)(tokenV3).getProjectPermissions(projectId).then(function (permissions) {\n    return { permissions: permissions, projectId: projectId };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the projects\n *  related with a user.\n * @param {String} tokenV3 Topcoder v3 auth token of the user for who we load\n *  the projects.\n * @return {Action}\n */\nfunction getUserProjectsInit(tokenV3) {\n  return tokenV3;\n}\nvar _default = (0, _reduxActions.createActions)({\n  DIRECT: {\n    DROP_ALL: dropAll,\n    GET_PROJECT_DETAILS_INIT: getProjectDetailsInit,\n    GET_PROJECT_DETAILS_DONE: getProjectDetailsDone,\n    GET_PROJECT_PERMISSIONS_INIT: getProjectPermissionsInit,\n    GET_PROJECT_PERMISSIONS_DONE: getProjectPermissionsDone,\n    GET_USER_PROJECTS_INIT: getUserProjectsInit,\n    GET_USER_PROJECTS_DONE: getUserProjectsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(dropAll, 'dropAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectDetailsInit, 'getProjectDetailsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectDetailsDone, 'getProjectDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectPermissionsInit, 'getProjectPermissionsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getProjectPermissionsDone, 'getProjectPermissionsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getUserProjectsInit, 'getUserProjectsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(getUserProjectsDone, 'getUserProjectsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/direct.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/direct.js?");
 
 /***/ }),
 
@@ -448,7 +448,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.errors\"\n    * @desc Actions related to the standard application-wide error handling and\n    * messaging.\n    *\n    * Pending to be documented. You are not supposed to use them directly anyway.\n    *\n    * @todo This module does not belong to `topcoder-react-lib`, it will be moved\n    *  to `topcoder-react-utils` soon.\n    */\n\n\nvar _default = (0, _reduxActions.createActions)({\n  ERRORS: {\n    CLEAR_ERROR: _lodash2.default.noop,\n    NEW_ERROR: function NEW_ERROR(title, details) {\n      return { title: title, details: details };\n    },\n    CLEAR_ALL_ERROR_ICONS: _lodash2.default.noop,\n    SET_ERROR_ICON: function SET_ERROR_ICON(id, title, message) {\n      return { id: id, title: title, message: message };\n    },\n    CLEAR_ERROR_ICON: function CLEAR_ERROR_ICON(id) {\n      return { id: id };\n    }\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/errors.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/errors.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.errors\"\n    * @desc Actions related to the standard application-wide error handling and\n    * messaging.\n    *\n    * Pending to be documented. You are not supposed to use them directly anyway.\n    *\n    * @todo This module does not belong to `topcoder-react-lib`, it will be moved\n    *  to `topcoder-react-utils` soon.\n    */\n\n\nvar _default = (0, _reduxActions.createActions)({\n  ERRORS: {\n    CLEAR_ERROR: _lodash2.default.noop,\n    NEW_ERROR: function NEW_ERROR(title, details) {\n      return { title: title, details: details };\n    },\n    CLEAR_ALL_ERROR_ICONS: _lodash2.default.noop,\n    SET_ERROR_ICON: function SET_ERROR_ICON(id, title, message) {\n      return { id: id, title: title, message: message };\n    },\n    CLEAR_ERROR_ICON: function CLEAR_ERROR_ICON(id) {\n      return { id: id };\n    }\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/errors.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/errors.js?");
 
 /***/ }),
 
@@ -460,7 +460,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _groups = __webpack_require__(/*! ../services/groups */ \"./src/services/groups.js\");\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.groups\"\n    * @desc Actions related to user groups.\n    * @todo Some group-related actions can be found elsewhere (e.g. addition of\n    * members to group is located inside tc-communities actions, because joining\n    * a community is equivalent to adding user to a group). It will be great to\n    * move such actions in here.\n    */\n\n/**\n * @static\n * @desc Creates an action that removes from Redux store all group data loaded\n *  before by other actions in this module, and also cancels any on-going\n *  loading operations.\n * @return {Action}\n */\nfunction dropGroups() {\n  return undefined;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of group data loading.\n * @param {String|String[]} groupIds ID, or an array of IDs, for groups to load.\n * @return {Action}\n */\nfunction getGroupsInit(groupIds) {\n  return groupIds;\n}\n\n/**\n * @static\n * @desc Creates an action that loads group data.\n * @param {String|String[]} groupIds ID, or an array of IDs, of groups to load.\n * @param {String} tokenV3 Optional. Topcoder v3 auth token.\n * @return {Action}\n */\nfunction getGroupsDone(groupIds, tokenV3) {\n  return (0, _groups.getService)(tokenV3).getGroupMap(groupIds);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  GROUPS: {\n    DROP_GROUPS: dropGroups,\n    GET_GROUPS_INIT: getGroupsInit,\n    GET_GROUPS_DONE: getGroupsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(dropGroups, 'dropGroups', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/groups.js');\n  reactHotLoader.register(getGroupsInit, 'getGroupsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/groups.js');\n  reactHotLoader.register(getGroupsDone, 'getGroupsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/groups.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/groups.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/groups.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _groups = __webpack_require__(/*! ../services/groups */ \"./src/services/groups.js\");\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.groups\"\n    * @desc Actions related to user groups.\n    * @todo Some group-related actions can be found elsewhere (e.g. addition of\n    * members to group is located inside tc-communities actions, because joining\n    * a community is equivalent to adding user to a group). It will be great to\n    * move such actions in here.\n    */\n\n/**\n * @static\n * @desc Creates an action that removes from Redux store all group data loaded\n *  before by other actions in this module, and also cancels any on-going\n *  loading operations.\n * @return {Action}\n */\nfunction dropGroups() {\n  return undefined;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of group data loading.\n * @param {String|String[]} groupIds ID, or an array of IDs, for groups to load.\n * @return {Action}\n */\nfunction getGroupsInit(groupIds) {\n  return groupIds;\n}\n\n/**\n * @static\n * @desc Creates an action that loads group data.\n * @param {String|String[]} groupIds ID, or an array of IDs, of groups to load.\n * @param {String} tokenV3 Optional. Topcoder v3 auth token.\n * @return {Action}\n */\nfunction getGroupsDone(groupIds, tokenV3) {\n  return (0, _groups.getService)(tokenV3).getGroupMap(groupIds);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  GROUPS: {\n    DROP_GROUPS: dropGroups,\n    GET_GROUPS_INIT: getGroupsInit,\n    GET_GROUPS_DONE: getGroupsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(dropGroups, 'dropGroups', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/groups.js');\n  reactHotLoader.register(getGroupsInit, 'getGroupsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/groups.js');\n  reactHotLoader.register(getGroupsDone, 'getGroupsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/groups.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/groups.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/groups.js?");
 
 /***/ }),
 
@@ -472,7 +472,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.actions = undefined;\n\nvar _auth = __webpack_require__(/*! ./auth */ \"./src/actions/auth.js\");\n\nvar _auth2 = _interopRequireDefault(_auth);\n\nvar _smp = __webpack_require__(/*! ./smp */ \"./src/actions/smp.js\");\n\nvar _smp2 = _interopRequireDefault(_smp);\n\nvar _stats = __webpack_require__(/*! ./stats */ \"./src/actions/stats.js\");\n\nvar _stats2 = _interopRequireDefault(_stats);\n\nvar _terms = __webpack_require__(/*! ./terms */ \"./src/actions/terms.js\");\n\nvar _terms2 = _interopRequireDefault(_terms);\n\nvar _direct = __webpack_require__(/*! ./direct */ \"./src/actions/direct.js\");\n\nvar _direct2 = _interopRequireDefault(_direct);\n\nvar _groups = __webpack_require__(/*! ./groups */ \"./src/actions/groups.js\");\n\nvar _groups2 = _interopRequireDefault(_groups);\n\nvar _errors = __webpack_require__(/*! ./errors */ \"./src/actions/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nvar _challenge = __webpack_require__(/*! ./challenge */ \"./src/actions/challenge.js\");\n\nvar _challenge2 = _interopRequireDefault(_challenge);\n\nvar _profile = __webpack_require__(/*! ./profile */ \"./src/actions/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/actions/members.js\");\n\nvar _members2 = _interopRequireDefault(_members);\n\nvar _memberTasks = __webpack_require__(/*! ./member-tasks */ \"./src/actions/member-tasks.js\");\n\nvar _memberTasks2 = _interopRequireDefault(_memberTasks);\n\nvar _reviewOpportunity = __webpack_require__(/*! ./reviewOpportunity */ \"./src/actions/reviewOpportunity.js\");\n\nvar _reviewOpportunity2 = _interopRequireDefault(_reviewOpportunity);\n\nvar _lookup = __webpack_require__(/*! ./lookup */ \"./src/actions/lookup.js\");\n\nvar _lookup2 = _interopRequireDefault(_lookup);\n\nvar _settings = __webpack_require__(/*! ./settings */ \"./src/actions/settings.js\");\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _looker = __webpack_require__(/*! ./looker */ \"./src/actions/looker.js\");\n\nvar _looker2 = _interopRequireDefault(_looker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\nvar actions = exports.actions = {\n  auth: _auth2.default.auth,\n  smp: _smp2.default.smp,\n  challenge: _challenge2.default.challenge,\n  terms: _terms2.default.terms,\n  stats: _stats2.default.stats,\n  direct: _direct2.default.direct,\n  groups: _groups2.default.groups,\n  errors: _errors2.default.errors,\n  profile: _profile2.default.profile,\n  members: _members2.default.members,\n  memberTasks: _memberTasks2.default.memberTasks,\n  reviewOpportunity: _reviewOpportunity2.default.reviewOpportunity,\n  lookup: _lookup2.default.lookup,\n  settings: _settings2.default.settings,\n  looker: _looker2.default.looker\n};\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(actions, 'actions', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/index.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/index.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.actions = undefined;\n\nvar _auth = __webpack_require__(/*! ./auth */ \"./src/actions/auth.js\");\n\nvar _auth2 = _interopRequireDefault(_auth);\n\nvar _smp = __webpack_require__(/*! ./smp */ \"./src/actions/smp.js\");\n\nvar _smp2 = _interopRequireDefault(_smp);\n\nvar _stats = __webpack_require__(/*! ./stats */ \"./src/actions/stats.js\");\n\nvar _stats2 = _interopRequireDefault(_stats);\n\nvar _terms = __webpack_require__(/*! ./terms */ \"./src/actions/terms.js\");\n\nvar _terms2 = _interopRequireDefault(_terms);\n\nvar _direct = __webpack_require__(/*! ./direct */ \"./src/actions/direct.js\");\n\nvar _direct2 = _interopRequireDefault(_direct);\n\nvar _groups = __webpack_require__(/*! ./groups */ \"./src/actions/groups.js\");\n\nvar _groups2 = _interopRequireDefault(_groups);\n\nvar _errors = __webpack_require__(/*! ./errors */ \"./src/actions/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nvar _challenge = __webpack_require__(/*! ./challenge */ \"./src/actions/challenge.js\");\n\nvar _challenge2 = _interopRequireDefault(_challenge);\n\nvar _profile = __webpack_require__(/*! ./profile */ \"./src/actions/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/actions/members.js\");\n\nvar _members2 = _interopRequireDefault(_members);\n\nvar _memberTasks = __webpack_require__(/*! ./member-tasks */ \"./src/actions/member-tasks.js\");\n\nvar _memberTasks2 = _interopRequireDefault(_memberTasks);\n\nvar _reviewOpportunity = __webpack_require__(/*! ./reviewOpportunity */ \"./src/actions/reviewOpportunity.js\");\n\nvar _reviewOpportunity2 = _interopRequireDefault(_reviewOpportunity);\n\nvar _lookup = __webpack_require__(/*! ./lookup */ \"./src/actions/lookup.js\");\n\nvar _lookup2 = _interopRequireDefault(_lookup);\n\nvar _settings = __webpack_require__(/*! ./settings */ \"./src/actions/settings.js\");\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _looker = __webpack_require__(/*! ./looker */ \"./src/actions/looker.js\");\n\nvar _looker2 = _interopRequireDefault(_looker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\nvar actions = exports.actions = {\n  auth: _auth2.default.auth,\n  smp: _smp2.default.smp,\n  challenge: _challenge2.default.challenge,\n  terms: _terms2.default.terms,\n  stats: _stats2.default.stats,\n  direct: _direct2.default.direct,\n  groups: _groups2.default.groups,\n  errors: _errors2.default.errors,\n  profile: _profile2.default.profile,\n  members: _members2.default.members,\n  memberTasks: _memberTasks2.default.memberTasks,\n  reviewOpportunity: _reviewOpportunity2.default.reviewOpportunity,\n  lookup: _lookup2.default.lookup,\n  settings: _settings2.default.settings,\n  looker: _looker2.default.looker\n};\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(actions, 'actions', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/index.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/index.js?");
 
 /***/ }),
 
@@ -484,7 +484,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that gets look data by id.\n * @return {Action}\n */\nvar getLookerDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(lookerId) {\n    var data;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return (0, _looker.getService)().getLooker(lookerId);\n\n          case 2:\n            data = _context.sent;\n            return _context.abrupt('return', { data: data, lookerId: lookerId });\n\n          case 4:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getLookerDone(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _looker = __webpack_require__(/*! ../services/looker */ \"./src/services/looker.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.looker\"\n    * @desc Actions related to looker data.\n    */\n\nvar _default = (0, _reduxActions.createActions)({\n  LOOKER: {\n    GET_LOOKER_DONE: getLookerDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getLookerDone, 'getLookerDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/looker.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/looker.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/looker.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that gets look data by id.\n * @return {Action}\n */\nvar getLookerDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(lookerId) {\n    var data;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return (0, _looker.getService)().getLooker(lookerId);\n\n          case 2:\n            data = _context.sent;\n            return _context.abrupt('return', { data: data, lookerId: lookerId });\n\n          case 4:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getLookerDone(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _looker = __webpack_require__(/*! ../services/looker */ \"./src/services/looker.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.looker\"\n    * @desc Actions related to looker data.\n    */\n\nvar _default = (0, _reduxActions.createActions)({\n  LOOKER: {\n    GET_LOOKER_DONE: getLookerDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getLookerDone, 'getLookerDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/looker.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/looker.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/looker.js?");
 
 /***/ }),
 
@@ -496,7 +496,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _lookup = __webpack_require__(/*! ../services/lookup */ \"./src/services/lookup.js\");\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.lookup\"\n    * @desc Actions related to lookup data.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting all skill tags.\n * @return {Action}\n */\nfunction getSkillTagsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets all skill tags.\n * @return {Action}\n */\nfunction getSkillTagsDone() {\n  var params = {\n    domain: 'SKILLS',\n    status: 'APPROVED'\n  };\n  return (0, _lookup.getService)().getTags(params);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting all countries.\n * @return {Action}\n */\nfunction getCountriesInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets all countries.\n * @return {Action}\n */\nfunction getCountriesDone() {\n  return (0, _lookup.getService)().getCountries();\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  LOOKUP: {\n    GET_SKILL_TAGS_INIT: getSkillTagsInit,\n    GET_SKILL_TAGS_DONE: getSkillTagsDone,\n    GET_COUNTRIES_INIT: getCountriesInit,\n    GET_COUNTRIES_DONE: getCountriesDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getSkillTagsInit, 'getSkillTagsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getSkillTagsDone, 'getSkillTagsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getCountriesInit, 'getCountriesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getCountriesDone, 'getCountriesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/lookup.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/lookup.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _lookup = __webpack_require__(/*! ../services/lookup */ \"./src/services/lookup.js\");\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.lookup\"\n    * @desc Actions related to lookup data.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting all skill tags.\n * @return {Action}\n */\nfunction getSkillTagsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets all skill tags.\n * @return {Action}\n */\nfunction getSkillTagsDone() {\n  var params = {\n    domain: 'SKILLS',\n    status: 'APPROVED'\n  };\n  return (0, _lookup.getService)().getTags(params);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting all countries.\n * @return {Action}\n */\nfunction getCountriesInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets all countries.\n * @return {Action}\n */\nfunction getCountriesDone() {\n  return (0, _lookup.getService)().getCountries();\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting all countries api version 5.\n * @return {Action}\n */\nfunction getAllCountriesInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets all countries api version 5.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {Action}\n */\nfunction getAllCountriesDone(tokenV3) {\n  return (0, _lookup.getService)(tokenV3).getAllCountries();\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  LOOKUP: {\n    GET_SKILL_TAGS_INIT: getSkillTagsInit,\n    GET_SKILL_TAGS_DONE: getSkillTagsDone,\n    GET_COUNTRIES_INIT: getCountriesInit,\n    GET_COUNTRIES_DONE: getCountriesDone,\n    GET_ALL_COUNTRIES_INIT: getAllCountriesInit,\n    GET_ALL_COUNTRIES_DONE: getAllCountriesDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getSkillTagsInit, 'getSkillTagsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getSkillTagsDone, 'getSkillTagsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getCountriesInit, 'getCountriesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getCountriesDone, 'getCountriesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getAllCountriesInit, 'getAllCountriesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(getAllCountriesDone, 'getAllCountriesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/lookup.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/lookup.js?");
 
 /***/ }),
 
@@ -508,7 +508,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PAGE_SIZE = undefined;\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.member-tasks\"\n    * @desc Actions for management of member tasks and payments. Under the hood it\n    * is very similar to the challenge listing management, as these tasks are in\n    * fact just challenges of a special kind); however, due to differences in the\n    * use cases, we can implement task management more efficient with dedicated\n    * actions and reducer; thus, this module.\n    */\n\n/**\n * Holds the size of member tasks page for the MEMBER_TASK/GET_DONE\n * action. Mind that current version of TC API v3 restricts the possible page\n * size by 50 tasks anyway, thus setting this to a larger value will result in\n * problems.\n */\nvar PAGE_SIZE = exports.PAGE_SIZE = 50;\n\n/**\n * @static\n * @desc Creates an action that removes all loaded member tasks from Redux\n * store, and cancels any on-going loading operations.\n * @return {Action}\n */\nfunction dropAll() {\n  return null;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of member tasks page loading.\n * Note that dispatching this action before a previous loading operation has\n * been completed will cancel the previous loading operation.\n * @param {String} uuid UUID of the loading operation.\n * @param {Number} pageNum 0-based index of the page to load (PAGE_SIZE constant\n *  holds the page size).\n * @return {Action}\n */\nfunction getInit(uuid, pageNum) {\n  return { pageNum: pageNum, uuid: uuid };\n}\n\n/**\n * @static\n * @desc Creates an action that loads a page of member tasks.\n * Prior to this action always dispatch\n * {@link module:actions.member-tasks.getInit} action with\n * the same arguments. The result of this action will be silently\n * discarted if its uuid is not stored in the Redux list of pending requests\n * to load tasks.\n * @param {String} uuid UUID of the loading operation.\n * @param {String} projectId Project filter for tasks.\n * @param {Number} pageNum 0-based index of the page to load (PAGE_SIZE constant\n *  holds the page size).\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction getDone(uuid, projectId, pageNum, tokenV3) {\n  return (0, _challenges.getService)(tokenV3).getChallenges({\n    isTask: 1,\n    projectId: projectId\n  }, {\n    limit: PAGE_SIZE,\n    offset: pageNum * PAGE_SIZE\n  }).then(function (_ref) {\n    var challenges = _ref.challenges,\n        totalCount = _ref.totalCount;\n    return {\n      projectId: projectId,\n      tasks: challenges,\n      totalCount: totalCount,\n      uuid: uuid\n    };\n  });\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  MEMBER_TASKS: {\n    DROP_ALL: dropAll,\n    GET_INIT: getInit,\n    GET_DONE: getDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(PAGE_SIZE, 'PAGE_SIZE', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(dropAll, 'dropAll', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(getInit, 'getInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(getDone, 'getDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/member-tasks.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/member-tasks.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PAGE_SIZE = undefined;\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.member-tasks\"\n    * @desc Actions for management of member tasks and payments. Under the hood it\n    * is very similar to the challenge listing management, as these tasks are in\n    * fact just challenges of a special kind); however, due to differences in the\n    * use cases, we can implement task management more efficient with dedicated\n    * actions and reducer; thus, this module.\n    */\n\n/**\n * Holds the size of member tasks page for the MEMBER_TASK/GET_DONE\n * action. Mind that current version of TC API v3 restricts the possible page\n * size by 50 tasks anyway, thus setting this to a larger value will result in\n * problems.\n */\nvar PAGE_SIZE = exports.PAGE_SIZE = 50;\n\n/**\n * @static\n * @desc Creates an action that removes all loaded member tasks from Redux\n * store, and cancels any on-going loading operations.\n * @return {Action}\n */\nfunction dropAll() {\n  return null;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of member tasks page loading.\n * Note that dispatching this action before a previous loading operation has\n * been completed will cancel the previous loading operation.\n * @param {String} uuid UUID of the loading operation.\n * @param {Number} pageNum 0-based index of the page to load (PAGE_SIZE constant\n *  holds the page size).\n * @return {Action}\n */\nfunction getInit(uuid, pageNum) {\n  return { pageNum: pageNum, uuid: uuid };\n}\n\n/**\n * @static\n * @desc Creates an action that loads a page of member tasks.\n * Prior to this action always dispatch\n * {@link module:actions.member-tasks.getInit} action with\n * the same arguments. The result of this action will be silently\n * discarted if its uuid is not stored in the Redux list of pending requests\n * to load tasks.\n * @param {String} uuid UUID of the loading operation.\n * @param {String} projectId Project filter for tasks.\n * @param {Number} pageNum 0-based index of the page to load (PAGE_SIZE constant\n *  holds the page size).\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @return {Action}\n */\nfunction getDone(uuid, projectId, pageNum, tokenV3) {\n  return (0, _challenges.getService)(tokenV3).getChallenges({\n    isTask: 1,\n    projectId: projectId\n  }, {\n    limit: PAGE_SIZE,\n    offset: pageNum * PAGE_SIZE\n  }).then(function (_ref) {\n    var challenges = _ref.challenges,\n        totalCount = _ref.totalCount;\n    return {\n      projectId: projectId,\n      tasks: challenges,\n      totalCount: totalCount,\n      uuid: uuid\n    };\n  });\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  MEMBER_TASKS: {\n    DROP_ALL: dropAll,\n    GET_INIT: getInit,\n    GET_DONE: getDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(PAGE_SIZE, 'PAGE_SIZE', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(dropAll, 'dropAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(getInit, 'getInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(getDone, 'getDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/member-tasks.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/member-tasks.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/member-tasks.js?");
 
 /***/ }),
 
@@ -520,7 +520,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads member achievements.\n * @param {String} handle Member handle.\n * @param {String} uuid Loading operation\n * @return {Action}\n */\nvar getAchievementsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle, uuid) {\n    var data;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            data = void 0;\n            _context.prev = 1;\n            _context.next = 4;\n            return (0, _user.getService)().getAchievements(handle);\n\n          case 4:\n            data = _context.sent;\n            _context.next = 10;\n            break;\n\n          case 7:\n            _context.prev = 7;\n            _context.t0 = _context['catch'](1);\n\n            data = [];\n\n          case 10:\n            return _context.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 11:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this, [[1, 7]]);\n  }));\n\n  return function getAchievementsDone(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that loads member achievements from v3 API.\n * @param {String} handle Member handle.\n * @param {String} uuid Loading operation\n * @return {Action}\n */\n\n\nvar getAchievementsV3Done = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle, uuid) {\n    var data;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            data = void 0;\n            _context2.prev = 1;\n            _context2.next = 4;\n            return (0, _user.getService)().getAchievementsV3(handle);\n\n          case 4:\n            data = _context2.sent;\n            _context2.next = 10;\n            break;\n\n          case 7:\n            _context2.prev = 7;\n            _context2.t0 = _context2['catch'](1);\n\n            data = [];\n\n          case 10:\n            return _context2.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 11:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this, [[1, 7]]);\n  }));\n\n  return function getAchievementsV3Done(_x3, _x4) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the member's\n *  financial information.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\n/**\n * @static\n * @desc Creates an action that loads member's financial information.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\nvar getFinancesDone = function () {\n  var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            _context3.next = 2;\n            return (0, _members.getService)(tokenV3).getMemberFinances(handle);\n\n          case 2:\n            data = _context3.sent;\n            return _context3.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context3.stop();\n        }\n      }\n    }, _callee3, this);\n  }));\n\n  return function getFinancesDone(_x5, _x6, _x7) {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that signals beginning of member stats loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getStatsInit = function () {\n  var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee4$(_context4) {\n      while (1) {\n        switch (_context4.prev = _context4.next) {\n          case 0:\n            return _context4.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context4.stop();\n        }\n      }\n    }, _callee4, this);\n  }));\n\n  return function getStatsInit(_x8, _x9) {\n    return _ref4.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads member statistics.\n * @param {String} handle Member handle.\n * @param {String} groupIds Group ids.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar getStatsDone = function () {\n  var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(handle, groupIds, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee5$(_context5) {\n      while (1) {\n        switch (_context5.prev = _context5.next) {\n          case 0:\n            _context5.next = 2;\n            return (0, _members.getService)(tokenV3).getStats(handle, groupIds);\n\n          case 2:\n            data = _context5.sent;\n            return _context5.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context5.stop();\n        }\n      }\n    }, _callee5, this);\n  }));\n\n  return function getStatsDone(_x10, _x11, _x12, _x13) {\n    return _ref5.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Payload creator for the action that inits the loading of member active challenges.\n * @param {String} handle\n * @param {String} uuid\n * @returns {Object} Payload\n */\n\n\nvar getActiveChallengesInit = function () {\n  var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee6$(_context6) {\n      while (1) {\n        switch (_context6.prev = _context6.next) {\n          case 0:\n            return _context6.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context6.stop();\n        }\n      }\n    }, _callee6, this);\n  }));\n\n  return function getActiveChallengesInit(_x14, _x15) {\n    return _ref6.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Payload creator for the action that loads the member active challenges.\n * @param {String} handle\n * @param {String} uuid\n * @param {String} tokenV3\n * @returns {Object} Payload\n */\n\n\nvar getActiveChallengesDone = function () {\n  var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(handle, uuid, tokenV3) {\n    var filter, service, getAll, calls, _ref9, _ref10, challenges;\n\n    return _regenerator2.default.wrap(function _callee7$(_context7) {\n      while (1) {\n        switch (_context7.prev = _context7.next) {\n          case 0:\n            getAll = function getAll(getter) {\n              var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n              var prev = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n              var PAGE_SIZE = 50;\n              return getter({\n                limit: PAGE_SIZE,\n                offset: page * PAGE_SIZE\n              }).then(function (_ref8) {\n                var chunk = _ref8.challenges;\n\n                if (!chunk.length) return prev || [];\n                return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);\n              });\n            };\n\n            filter = { status: 'ACTIVE' };\n            service = (0, _challenges.getService)(tokenV3);\n            /* TODO: Reuse `getAll` from `actions/challenge-listing`\n            /* after it moved from `community-app` to here.\n             */\n\n            calls = [getAll(function (params) {\n              return service.getUserChallenges(handle, filter, params);\n            })];\n            _context7.next = 6;\n            return _promise2.default.all(calls);\n\n          case 6:\n            _ref9 = _context7.sent;\n            _ref10 = (0, _slicedToArray3.default)(_ref9, 1);\n            challenges = _ref10[0];\n            return _context7.abrupt('return', { handle: handle, challenges: challenges, uuid: uuid });\n\n          case 10:\n          case 'end':\n            return _context7.stop();\n        }\n      }\n    }, _callee7, this);\n  }));\n\n  return function getActiveChallengesDone(_x16, _x17, _x18) {\n    return _ref7.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member stats distribution history.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getStatsHistoryInit = function () {\n  var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee8$(_context8) {\n      while (1) {\n        switch (_context8.prev = _context8.next) {\n          case 0:\n            return _context8.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context8.stop();\n        }\n      }\n    }, _callee8, this);\n  }));\n\n  return function getStatsHistoryInit(_x21, _x22) {\n    return _ref11.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member stats history.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar getStatsHistoryDone = function () {\n  var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(handle, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee9$(_context9) {\n      while (1) {\n        switch (_context9.prev = _context9.next) {\n          case 0:\n            _context9.next = 2;\n            return (0, _members.getService)(tokenV3).getStatsHistory(handle);\n\n          case 2:\n            data = _context9.sent;\n            return _context9.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context9.stop();\n        }\n      }\n    }, _callee9, this);\n  }));\n\n  return function getStatsHistoryDone(_x23, _x24, _x25) {\n    return _ref12.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member stats distribution loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getStatsDistributionInit = function () {\n  var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee10$(_context10) {\n      while (1) {\n        switch (_context10.prev = _context10.next) {\n          case 0:\n            return _context10.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context10.stop();\n        }\n      }\n    }, _callee10, this);\n  }));\n\n  return function getStatsDistributionInit(_x26, _x27) {\n    return _ref13.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member stats distribution.\n * @param {String} handle Member handle.\n * @param {String} track Main track name.\n * @param {String} subTrack Subtrack name.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar getStatsDistributionDone = function () {\n  var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(handle, track, subTrack, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee11$(_context11) {\n      while (1) {\n        switch (_context11.prev = _context11.next) {\n          case 0:\n            _context11.next = 2;\n            return (0, _members.getService)(tokenV3).getStatsDistribution(handle, track, subTrack);\n\n          case 2:\n            data = _context11.sent;\n            return _context11.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context11.stop();\n        }\n      }\n    }, _callee11, this);\n  }));\n\n  return function getStatsDistributionDone(_x28, _x29, _x30, _x31, _x32) {\n    return _ref14.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of subtrack challenges loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getSubtrackChallengesInit = function () {\n  var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee12$(_context12) {\n      while (1) {\n        switch (_context12.prev = _context12.next) {\n          case 0:\n            return _context12.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context12.stop();\n        }\n      }\n    }, _callee12, this);\n  }));\n\n  return function getSubtrackChallengesInit(_x33, _x34) {\n    return _ref15.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member subtrack challenges.\n * @param {String} uuid Operation UUID.\n * @param {String} handle Member handle.\n * @param {String} tokenV3 v3 auth token.\n * @param {String} track Main track name.\n * @param {String} subTrack Subtrack name.\n * @param {Number} start page.\n * @param {Number} page size.\n * @param {Boolean} whether to refresh.\n * @return {Action}\n */\n\n\nvar getSubtrackChallengesDone = function () {\n  var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(uuid, handle, tokenV3, track, subTrack, pageNum, pageSize, refresh) {\n    var filter, params, service;\n    return _regenerator2.default.wrap(function _callee13$(_context13) {\n      while (1) {\n        switch (_context13.prev = _context13.next) {\n          case 0:\n            filter = {\n              status: 'completed',\n              hasUserSubmittedForReview: 'true',\n              track: track,\n              subTrack: subTrack\n            };\n            params = {};\n\n            params.orderBy = 'submissionEndDate desc';\n            params.limit = pageSize;\n            params.offset = pageNum * pageSize;\n\n            service = (0, _challenges.getService)(tokenV3);\n            return _context13.abrupt('return', service.getUserChallenges(handle, filter, params).then(function (res) {\n              return {\n                uuid: uuid,\n                challenges: res.challenges,\n                refresh: refresh,\n                handle: handle\n              };\n            }));\n\n          case 7:\n          case 'end':\n            return _context13.stop();\n        }\n      }\n    }, _callee13, this);\n  }));\n\n  return function getSubtrackChallengesDone(_x35, _x36, _x37, _x38, _x39, _x40, _x41, _x42) {\n    return _ref16.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member SRM loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getUserSRMInit = function () {\n  var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee14$(_context14) {\n      while (1) {\n        switch (_context14.prev = _context14.next) {\n          case 0:\n            return _context14.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context14.stop();\n        }\n      }\n    }, _callee14, this);\n  }));\n\n  return function getUserSRMInit(_x43, _x44) {\n    return _ref17.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member SRM.\n * @param {String} uuid Operation UUID.\n * @param {String} handle Member handle.\n * @param {String} tokenV3 v3 auth token.\n * @param {Number} start page.\n * @param {Number} page size.\n * @param {Boolean} whether to refresh.\n * @return {Action}\n */\n\n\nvar getUserSRMDone = function () {\n  var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(uuid, handle, tokenV3, pageNum, pageSize, refresh) {\n    var filter, params, service;\n    return _regenerator2.default.wrap(function _callee15$(_context15) {\n      while (1) {\n        switch (_context15.prev = _context15.next) {\n          case 0:\n            filter = {\n              status: 'past',\n              isRatedForSRM: 'true'\n            };\n            params = {\n              filter: _qs2.default.stringify(filter, { encode: false }),\n              limit: pageSize,\n              offset: pageNum * pageSize\n            };\n            service = (0, _challenges.getService)(tokenV3);\n            return _context15.abrupt('return', service.getUserSrms(handle, params).then(function (res) {\n              return {\n                uuid: uuid,\n                srms: res,\n                refresh: refresh,\n                handle: handle\n              };\n            }));\n\n          case 4:\n          case 'end':\n            return _context15.stop();\n        }\n      }\n    }, _callee15, this);\n  }));\n\n  return function getUserSRMDone(_x45, _x46, _x47, _x48, _x49, _x50) {\n    return _ref18.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member marathon loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getUserMarathonInit = function () {\n  var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee16$(_context16) {\n      while (1) {\n        switch (_context16.prev = _context16.next) {\n          case 0:\n            return _context16.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context16.stop();\n        }\n      }\n    }, _callee16, this);\n  }));\n\n  return function getUserMarathonInit(_x51, _x52) {\n    return _ref19.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member marathon.\n * @param {String} uuid Operation UUID.\n * @param {String} handle Member handle.\n * @param {String} tokenV3 v3 auth token.\n * @param {Number} start page.\n * @param {Number} page size.\n * @param {Boolean} whether to refresh.\n * @return {Action}\n */\n\n\nvar getUserMarathonDone = function () {\n  var _ref20 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(uuid, handle, tokenV3, pageNum, pageSize, refresh) {\n    var filter, params, service;\n    return _regenerator2.default.wrap(function _callee17$(_context17) {\n      while (1) {\n        switch (_context17.prev = _context17.next) {\n          case 0:\n            filter = { status: 'PAST', isRatedForMM: 'true' };\n            params = {};\n\n            params.orderBy = 'endDate desc';\n            params.limit = pageSize;\n            params.offset = pageNum * pageSize;\n\n            service = (0, _challenges.getService)(tokenV3);\n            return _context17.abrupt('return', service.getUserMarathonMatches(handle, filter, params).then(function (res) {\n              return {\n                uuid: uuid,\n                marathons: res,\n                refresh: refresh,\n                handle: handle\n              };\n            }));\n\n          case 7:\n          case 'end':\n            return _context17.stop();\n        }\n      }\n    }, _callee17, this);\n  }));\n\n  return function getUserMarathonDone(_x53, _x54, _x55, _x56, _x57, _x58) {\n    return _ref20.apply(this, arguments);\n  };\n}();\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _members = __webpack_require__(/*! ../services/members */ \"./src/services/members.js\");\n\nvar _user = __webpack_require__(/*! ../services/user */ \"./src/services/user.js\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.members\"\n    * @desc Actions related to members data.\n    */\n\n/**\n * @static\n * @desc Creates an action that drops all information related to the specfied\n *  member.\n * @param {String} handle Topcoder user handle.\n * @return {Action}\n */\nfunction drop(handle) {\n  return handle;\n}\n\n/**\n * @static\n * @desc Creates an action that drops all member information loaded by\n *  actions from this module.\n * @return {Action}\n */\nfunction dropAll() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of member achievements\n *  loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Loading operation UUID.\n * @return {Action}\n */\nfunction getAchievementsInit(handle, uuid) {\n  return { handle: handle, uuid: uuid };\n}function getFinancesInit(handle, uuid) {\n  return { handle: handle, uuid: uuid };\n}\nvar _default = (0, _reduxActions.createActions)({\n  MEMBERS: {\n    DROP: drop,\n    DROP_ALL: dropAll,\n    GET_ACHIEVEMENTS_INIT: getAchievementsInit,\n    GET_ACHIEVEMENTS_DONE: getAchievementsDone,\n    GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,\n    GET_FINANCES_INIT: getFinancesInit,\n    GET_FINANCES_DONE: getFinancesDone,\n    GET_STATS_INIT: getStatsInit,\n    GET_STATS_DONE: getStatsDone,\n    GET_STATS_HISTORY_INIT: getStatsHistoryInit,\n    GET_STATS_HISTORY_DONE: getStatsHistoryDone,\n    GET_STATS_DISTRIBUTION_INIT: getStatsDistributionInit,\n    GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone,\n    GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,\n    GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone,\n    GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit,\n    GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesDone,\n    GET_USER_SRM_INIT: getUserSRMInit,\n    GET_USER_SRM_DONE: getUserSRMDone,\n    GET_USER_MARATHON_INIT: getUserMarathonInit,\n    GET_USER_MARATHON_DONE: getUserMarathonDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(drop, 'drop', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(dropAll, 'dropAll', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getAchievementsInit, 'getAchievementsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getAchievementsDone, 'getAchievementsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getAchievementsV3Done, 'getAchievementsV3Done', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getFinancesInit, 'getFinancesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getFinancesDone, 'getFinancesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsInit, 'getStatsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsDone, 'getStatsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getActiveChallengesInit, 'getActiveChallengesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getActiveChallengesDone, 'getActiveChallengesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsHistoryInit, 'getStatsHistoryInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsHistoryDone, 'getStatsHistoryDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsDistributionInit, 'getStatsDistributionInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsDistributionDone, 'getStatsDistributionDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getSubtrackChallengesInit, 'getSubtrackChallengesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getSubtrackChallengesDone, 'getSubtrackChallengesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserSRMInit, 'getUserSRMInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserSRMDone, 'getUserSRMDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserMarathonInit, 'getUserMarathonInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserMarathonDone, 'getUserMarathonDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/members.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/members.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads member achievements.\n * @param {String} handle Member handle.\n * @param {String} uuid Loading operation\n * @return {Action}\n */\nvar getAchievementsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle, uuid) {\n    var data;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            data = void 0;\n            _context.prev = 1;\n            _context.next = 4;\n            return (0, _user.getService)().getAchievements(handle);\n\n          case 4:\n            data = _context.sent;\n            _context.next = 10;\n            break;\n\n          case 7:\n            _context.prev = 7;\n            _context.t0 = _context['catch'](1);\n\n            data = [];\n\n          case 10:\n            return _context.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 11:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this, [[1, 7]]);\n  }));\n\n  return function getAchievementsDone(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that loads member achievements from v3 API.\n * @param {String} handle Member handle.\n * @param {String} uuid Loading operation\n * @return {Action}\n */\n\n\nvar getAchievementsV3Done = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle, uuid) {\n    var data;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            data = void 0;\n            _context2.prev = 1;\n            _context2.next = 4;\n            return (0, _user.getService)().getAchievementsV3(handle);\n\n          case 4:\n            data = _context2.sent;\n            _context2.next = 10;\n            break;\n\n          case 7:\n            _context2.prev = 7;\n            _context2.t0 = _context2['catch'](1);\n\n            data = [];\n\n          case 10:\n            return _context2.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 11:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this, [[1, 7]]);\n  }));\n\n  return function getAchievementsV3Done(_x3, _x4) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the member's\n *  financial information.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\n/**\n * @static\n * @desc Creates an action that loads member's financial information.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\nvar getFinancesDone = function () {\n  var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            _context3.next = 2;\n            return (0, _members.getService)(tokenV3).getMemberFinances(handle);\n\n          case 2:\n            data = _context3.sent;\n            return _context3.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context3.stop();\n        }\n      }\n    }, _callee3, this);\n  }));\n\n  return function getFinancesDone(_x5, _x6, _x7) {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that signals beginning of member stats loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getStatsInit = function () {\n  var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee4$(_context4) {\n      while (1) {\n        switch (_context4.prev = _context4.next) {\n          case 0:\n            return _context4.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context4.stop();\n        }\n      }\n    }, _callee4, this);\n  }));\n\n  return function getStatsInit(_x8, _x9) {\n    return _ref4.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads member statistics.\n * @param {String} handle Member handle.\n * @param {String} groupIds Group ids.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar getStatsDone = function () {\n  var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(handle, groupIds, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee5$(_context5) {\n      while (1) {\n        switch (_context5.prev = _context5.next) {\n          case 0:\n            _context5.next = 2;\n            return (0, _members.getService)(tokenV3).getStats(handle, groupIds);\n\n          case 2:\n            data = _context5.sent;\n            return _context5.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context5.stop();\n        }\n      }\n    }, _callee5, this);\n  }));\n\n  return function getStatsDone(_x10, _x11, _x12, _x13) {\n    return _ref5.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Payload creator for the action that inits the loading of member active challenges.\n * @param {String} handle\n * @param {String} uuid\n * @returns {Object} Payload\n */\n\n\nvar getActiveChallengesInit = function () {\n  var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee6$(_context6) {\n      while (1) {\n        switch (_context6.prev = _context6.next) {\n          case 0:\n            return _context6.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context6.stop();\n        }\n      }\n    }, _callee6, this);\n  }));\n\n  return function getActiveChallengesInit(_x14, _x15) {\n    return _ref6.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Payload creator for the action that loads the member active challenges.\n * @param {String} handle\n * @param {String} uuid\n * @param {String} tokenV3\n * @returns {Object} Payload\n */\n\n\nvar getActiveChallengesDone = function () {\n  var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(handle, uuid, tokenV3) {\n    var filter, service, getAll, calls, _ref9, _ref10, challenges;\n\n    return _regenerator2.default.wrap(function _callee7$(_context7) {\n      while (1) {\n        switch (_context7.prev = _context7.next) {\n          case 0:\n            getAll = function getAll(getter) {\n              var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n              var prev = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n              var PAGE_SIZE = 50;\n              return getter({\n                limit: PAGE_SIZE,\n                offset: page * PAGE_SIZE\n              }).then(function (_ref8) {\n                var chunk = _ref8.challenges;\n\n                if (!chunk.length) return prev || [];\n                return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);\n              });\n            };\n\n            filter = { status: 'ACTIVE' };\n            service = (0, _challenges.getService)(tokenV3);\n            /* TODO: Reuse `getAll` from `actions/challenge-listing`\n            /* after it moved from `community-app` to here.\n             */\n\n            calls = [getAll(function (params) {\n              return service.getUserChallenges(handle, filter, params);\n            })];\n            _context7.next = 6;\n            return _promise2.default.all(calls);\n\n          case 6:\n            _ref9 = _context7.sent;\n            _ref10 = (0, _slicedToArray3.default)(_ref9, 1);\n            challenges = _ref10[0];\n            return _context7.abrupt('return', { handle: handle, challenges: challenges, uuid: uuid });\n\n          case 10:\n          case 'end':\n            return _context7.stop();\n        }\n      }\n    }, _callee7, this);\n  }));\n\n  return function getActiveChallengesDone(_x16, _x17, _x18) {\n    return _ref7.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member stats distribution history.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getStatsHistoryInit = function () {\n  var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee8$(_context8) {\n      while (1) {\n        switch (_context8.prev = _context8.next) {\n          case 0:\n            return _context8.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context8.stop();\n        }\n      }\n    }, _callee8, this);\n  }));\n\n  return function getStatsHistoryInit(_x21, _x22) {\n    return _ref11.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member stats history.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar getStatsHistoryDone = function () {\n  var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(handle, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee9$(_context9) {\n      while (1) {\n        switch (_context9.prev = _context9.next) {\n          case 0:\n            _context9.next = 2;\n            return (0, _members.getService)(tokenV3).getStatsHistory(handle);\n\n          case 2:\n            data = _context9.sent;\n            return _context9.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context9.stop();\n        }\n      }\n    }, _callee9, this);\n  }));\n\n  return function getStatsHistoryDone(_x23, _x24, _x25) {\n    return _ref12.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member stats distribution loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getStatsDistributionInit = function () {\n  var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee10$(_context10) {\n      while (1) {\n        switch (_context10.prev = _context10.next) {\n          case 0:\n            return _context10.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context10.stop();\n        }\n      }\n    }, _callee10, this);\n  }));\n\n  return function getStatsDistributionInit(_x26, _x27) {\n    return _ref13.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member stats distribution.\n * @param {String} handle Member handle.\n * @param {String} track Main track name.\n * @param {String} subTrack Subtrack name.\n * @param {String} uuid Operation UUID.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar getStatsDistributionDone = function () {\n  var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(handle, track, subTrack, uuid, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee11$(_context11) {\n      while (1) {\n        switch (_context11.prev = _context11.next) {\n          case 0:\n            _context11.next = 2;\n            return (0, _members.getService)(tokenV3).getStatsDistribution(handle, track, subTrack);\n\n          case 2:\n            data = _context11.sent;\n            return _context11.abrupt('return', { data: data, handle: handle, uuid: uuid });\n\n          case 4:\n          case 'end':\n            return _context11.stop();\n        }\n      }\n    }, _callee11, this);\n  }));\n\n  return function getStatsDistributionDone(_x28, _x29, _x30, _x31, _x32) {\n    return _ref14.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of subtrack challenges loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getSubtrackChallengesInit = function () {\n  var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee12$(_context12) {\n      while (1) {\n        switch (_context12.prev = _context12.next) {\n          case 0:\n            return _context12.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context12.stop();\n        }\n      }\n    }, _callee12, this);\n  }));\n\n  return function getSubtrackChallengesInit(_x33, _x34) {\n    return _ref15.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member subtrack challenges.\n * @param {String} uuid Operation UUID.\n * @param {String} handle Member handle.\n * @param {String} tokenV3 v3 auth token.\n * @param {String} track Main track name.\n * @param {String} subTrack Subtrack name.\n * @param {Number} start page.\n * @param {Number} page size.\n * @param {Boolean} whether to refresh.\n * @return {Action}\n */\n\n\nvar getSubtrackChallengesDone = function () {\n  var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(uuid, handle, tokenV3, track, subTrack, pageNum, pageSize, refresh) {\n    var filter, params, service;\n    return _regenerator2.default.wrap(function _callee13$(_context13) {\n      while (1) {\n        switch (_context13.prev = _context13.next) {\n          case 0:\n            filter = {\n              status: 'completed',\n              hasUserSubmittedForReview: 'true',\n              track: track,\n              subTrack: subTrack\n            };\n            params = {};\n\n            params.orderBy = 'submissionEndDate desc';\n            params.limit = pageSize;\n            params.offset = pageNum * pageSize;\n\n            service = (0, _challenges.getService)(tokenV3);\n            return _context13.abrupt('return', service.getUserChallenges(handle, filter, params).then(function (res) {\n              return {\n                uuid: uuid,\n                challenges: res.challenges,\n                refresh: refresh,\n                handle: handle\n              };\n            }));\n\n          case 7:\n          case 'end':\n            return _context13.stop();\n        }\n      }\n    }, _callee13, this);\n  }));\n\n  return function getSubtrackChallengesDone(_x35, _x36, _x37, _x38, _x39, _x40, _x41, _x42) {\n    return _ref16.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member SRM loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getUserSRMInit = function () {\n  var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee14$(_context14) {\n      while (1) {\n        switch (_context14.prev = _context14.next) {\n          case 0:\n            return _context14.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context14.stop();\n        }\n      }\n    }, _callee14, this);\n  }));\n\n  return function getUserSRMInit(_x43, _x44) {\n    return _ref17.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member SRM.\n * @param {String} uuid Operation UUID.\n * @param {String} handle Member handle.\n * @param {String} tokenV3 v3 auth token.\n * @param {Number} start page.\n * @param {Number} page size.\n * @param {Boolean} whether to refresh.\n * @return {Action}\n */\n\n\nvar getUserSRMDone = function () {\n  var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(uuid, handle, tokenV3, pageNum, pageSize, refresh) {\n    var filter, params, service;\n    return _regenerator2.default.wrap(function _callee15$(_context15) {\n      while (1) {\n        switch (_context15.prev = _context15.next) {\n          case 0:\n            filter = {\n              status: 'past',\n              isRatedForSRM: 'true'\n            };\n            params = {\n              filter: _qs2.default.stringify(filter, { encode: false }),\n              limit: pageSize,\n              offset: pageNum * pageSize\n            };\n            service = (0, _challenges.getService)(tokenV3);\n            return _context15.abrupt('return', service.getUserSrms(handle, params).then(function (res) {\n              return {\n                uuid: uuid,\n                srms: res,\n                refresh: refresh,\n                handle: handle\n              };\n            }));\n\n          case 4:\n          case 'end':\n            return _context15.stop();\n        }\n      }\n    }, _callee15, this);\n  }));\n\n  return function getUserSRMDone(_x45, _x46, _x47, _x48, _x49, _x50) {\n    return _ref18.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that signals beginning of member marathon loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\n\n\nvar getUserMarathonInit = function () {\n  var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(handle, uuid) {\n    return _regenerator2.default.wrap(function _callee16$(_context16) {\n      while (1) {\n        switch (_context16.prev = _context16.next) {\n          case 0:\n            return _context16.abrupt('return', { handle: handle, uuid: uuid });\n\n          case 1:\n          case 'end':\n            return _context16.stop();\n        }\n      }\n    }, _callee16, this);\n  }));\n\n  return function getUserMarathonInit(_x51, _x52) {\n    return _ref19.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Create an action that loads the member marathon.\n * @param {String} uuid Operation UUID.\n * @param {String} handle Member handle.\n * @param {String} tokenV3 v3 auth token.\n * @param {Number} start page.\n * @param {Number} page size.\n * @param {Boolean} whether to refresh.\n * @return {Action}\n */\n\n\nvar getUserMarathonDone = function () {\n  var _ref20 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(uuid, handle, tokenV3, pageNum, pageSize, refresh) {\n    var filter, params, service;\n    return _regenerator2.default.wrap(function _callee17$(_context17) {\n      while (1) {\n        switch (_context17.prev = _context17.next) {\n          case 0:\n            filter = { status: 'PAST', isRatedForMM: 'true' };\n            params = {};\n\n            params.orderBy = 'endDate desc';\n            params.limit = pageSize;\n            params.offset = pageNum * pageSize;\n\n            service = (0, _challenges.getService)(tokenV3);\n            return _context17.abrupt('return', service.getUserMarathonMatches(handle, filter, params).then(function (res) {\n              return {\n                uuid: uuid,\n                marathons: res,\n                refresh: refresh,\n                handle: handle\n              };\n            }));\n\n          case 7:\n          case 'end':\n            return _context17.stop();\n        }\n      }\n    }, _callee17, this);\n  }));\n\n  return function getUserMarathonDone(_x53, _x54, _x55, _x56, _x57, _x58) {\n    return _ref20.apply(this, arguments);\n  };\n}();\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _members = __webpack_require__(/*! ../services/members */ \"./src/services/members.js\");\n\nvar _user = __webpack_require__(/*! ../services/user */ \"./src/services/user.js\");\n\nvar _challenges = __webpack_require__(/*! ../services/challenges */ \"./src/services/challenges.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.members\"\n    * @desc Actions related to members data.\n    */\n\n/**\n * @static\n * @desc Creates an action that drops all information related to the specfied\n *  member.\n * @param {String} handle Topcoder user handle.\n * @return {Action}\n */\nfunction drop(handle) {\n  return handle;\n}\n\n/**\n * @static\n * @desc Creates an action that drops all member information loaded by\n *  actions from this module.\n * @return {Action}\n */\nfunction dropAll() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of member achievements\n *  loading.\n * @param {String} handle Member handle.\n * @param {String} uuid Loading operation UUID.\n * @return {Action}\n */\nfunction getAchievementsInit(handle, uuid) {\n  return { handle: handle, uuid: uuid };\n}function getFinancesInit(handle, uuid) {\n  return { handle: handle, uuid: uuid };\n}\nvar _default = (0, _reduxActions.createActions)({\n  MEMBERS: {\n    DROP: drop,\n    DROP_ALL: dropAll,\n    GET_ACHIEVEMENTS_INIT: getAchievementsInit,\n    GET_ACHIEVEMENTS_DONE: getAchievementsDone,\n    GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,\n    GET_FINANCES_INIT: getFinancesInit,\n    GET_FINANCES_DONE: getFinancesDone,\n    GET_STATS_INIT: getStatsInit,\n    GET_STATS_DONE: getStatsDone,\n    GET_STATS_HISTORY_INIT: getStatsHistoryInit,\n    GET_STATS_HISTORY_DONE: getStatsHistoryDone,\n    GET_STATS_DISTRIBUTION_INIT: getStatsDistributionInit,\n    GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone,\n    GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,\n    GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone,\n    GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit,\n    GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesDone,\n    GET_USER_SRM_INIT: getUserSRMInit,\n    GET_USER_SRM_DONE: getUserSRMDone,\n    GET_USER_MARATHON_INIT: getUserMarathonInit,\n    GET_USER_MARATHON_DONE: getUserMarathonDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(drop, 'drop', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(dropAll, 'dropAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getAchievementsInit, 'getAchievementsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getAchievementsDone, 'getAchievementsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getAchievementsV3Done, 'getAchievementsV3Done', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getFinancesInit, 'getFinancesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getFinancesDone, 'getFinancesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsInit, 'getStatsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsDone, 'getStatsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getActiveChallengesInit, 'getActiveChallengesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getActiveChallengesDone, 'getActiveChallengesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsHistoryInit, 'getStatsHistoryInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsHistoryDone, 'getStatsHistoryDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsDistributionInit, 'getStatsDistributionInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getStatsDistributionDone, 'getStatsDistributionDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getSubtrackChallengesInit, 'getSubtrackChallengesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getSubtrackChallengesDone, 'getSubtrackChallengesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserSRMInit, 'getUserSRMInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserSRMDone, 'getUserSRMDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserMarathonInit, 'getUserMarathonInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(getUserMarathonDone, 'getUserMarathonDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/members.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/members.js?");
 
 /***/ }),
 
@@ -532,7 +532,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _user = __webpack_require__(/*! ../services/user */ \"./src/services/user.js\");\n\nvar _members = __webpack_require__(/*! ../services/members */ \"./src/services/members.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.profile\"\n    * @desc Actions for interactions with profile details API.\n    * @todo Some of them repeat actions in {@link actions.members.md}. The code\n    *  should be refactored to avoid redundancy.\n    */\n\n\n/**\n * @static\n * @desc Creates and action that loads user profile.\n * @todo This action does not follow the pattern with init/done pairs of\n *  actions. Should be improved.\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction loadProfile(handle) {\n  return handle;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user achievements loading.\n * @todo This duplicates similar action in {@link actions.members.md}!\n * @return {Action}\n */\nfunction getAchievementsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads user achievements from API v2.\n * @todo This duplicates similar action in {@link actions.members.md}!\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getAchievementsDone(handle) {\n  return (0, _user.getService)().getUserPublic(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that loads user achievements from API v3.\n * @todo This duplicates similar action in {@link actions.members.md}!\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getAchievementsV3Done(handle) {\n  return (0, _user.getService)().getUserPublicV3(handle);\n}\n\n/**\n * @static\n * @todo To be documented.\n * @return {Action}\n */\nfunction getExternalAccountsInit() {}\n\n/**\n * @static\n * @todo To be documented.\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getExternalAccountsDone(handle) {\n  return (0, _members.getService)().getExternalAccounts(handle);\n}\n\n/**\n * @static\n * @todo Figure out what does this action do.\n * @return {Action}\n */\nfunction getExternalLinksInit() {}\n\n/**\n * @static\n * @todo Figure out the purpose of this action\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getExternalLinksDone(handle) {\n  return (0, _members.getService)().getExternalLinks(handle);\n}\n\n/**\n * @static\n * @todo Figure out the purpose of this action.\n * @return {Action}\n */\nfunction getInfoInit() {}\n\n/**\n * @static\n * @todo Figure out the purpose of this action.\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getInfoDone(handle) {\n  return (0, _members.getService)().getMemberInfo(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the member's\n *  skills info.\n * @return {Action}\n */\nfunction getSkillsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads member's skills info.\n * @param {String} handle Member handle.\n * @return {Action}\n */\nfunction getSkillsDone(handle) {\n  return (0, _members.getService)().getSkills(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading member's stats.\n * @todo This is similar to {@link actions.members.md#module_actions.members.getStatsInit}!\n * @return {Action}\n */\nfunction getStatsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads member's stats.\n * @param {String} handle Member handle.\n * @param {String} groupIds Group ids.\n * @return {Action}\n */\nfunction getStatsDone(handle, groupIds) {\n  return (0, _members.getService)().getStats(handle, groupIds);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting linked accounts.\n * @return {Action}\n */\nfunction getLinkedAccountsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets linked accounts.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getLinkedAccountsDone(profile, tokenV3) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.getLinkedAccounts(profile.userId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting credential.\n * @return {Action}\n */\nfunction getCredentialInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets credential.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getCredentialDone(profile, tokenV3) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.getCredential(profile.userId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting email preferences.\n * @return {Action}\n */\nfunction getEmailPreferencesInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets email preferences.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getEmailPreferencesDone(profile, tokenV3) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.getEmailPreferences(profile.userId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of uploading user's photo.\n * @return {Action}\n */\nfunction uploadPhotoInit() {}\n\n/**\n * @static\n * @desc Creates an action that uploads user's photo.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} file The photo file.\n * @return {Action}\n */\nfunction uploadPhotoDone(handle, tokenV3, file) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.getPresignedUrl(handle, file).then(function (res) {\n    return service.uploadFileToS3(res);\n  }).then(function (res) {\n    return service.updateMemberPhoto(res);\n  }).then(function (photoURL) {\n    return { handle: handle, photoURL: photoURL };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of deleting user's photo.\n * @return {Action}\n */\nfunction deletePhotoInit() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of updating user's profile.\n * @return {Action}\n */\nfunction updateProfileInit() {}\n\n/**\n * @static\n * @desc Creates an action that updates user's profile.\n * @param {String} profile Topcoder user profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction updateProfileDone(profile, tokenV3) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.updateMemberProfile(profile);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of adding user's skill.\n * @return {Action}\n */\nfunction addSkillInit() {}\n\n/**\n * @static\n * @desc Creates an action that adds user's skill.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Object} skill Skill to add.\n * @return {Action}\n */\nfunction addSkillDone(handle, tokenV3, skill) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.addSkill(handle, skill.tagId).then(function (res) {\n    return { skills: res.skills, handle: handle, skill: skill };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of hiding user's skill.\n * @return {Action}\n */\nfunction hideSkillInit() {}\n\n/**\n * @static\n * @desc Creates an action that hides user's skill.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Object} skill Skill to hide.\n * @return {Action}\n */\nfunction hideSkillDone(handle, tokenV3, skill) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.hideSkill(handle, skill.tagId).then(function (res) {\n    return { skills: res.skills, handle: handle, skill: skill };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of adding user's web link.\n * @return {Action}\n */\nfunction addWebLinkInit() {}\n\n/**\n * @static\n * @desc Creates an action that adds user's web link.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} webLink Web link to add.\n * @return {Action}\n */\nfunction addWebLinkDone(handle, tokenV3, webLink) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.addWebLink(handle, webLink).then(function (res) {\n    return { data: res, handle: handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of deleting user's web link.\n * @param {Object} key Web link key to delete.\n * @return {Action}\n */\nfunction deleteWebLinkInit(_ref) {\n  var key = _ref.key;\n\n  return { key: key };\n}\n\n/**\n * @static\n * @desc Creates an action that deletes user's web link.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} webLink Web link to delete.\n * @return {Action}\n */\nfunction deleteWebLinkDone(handle, tokenV3, webLink) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.deleteWebLink(handle, webLink.key).then(function (res) {\n    return { data: res, handle: handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of linking external account.\n * @return {Action}\n */\nfunction linkExternalAccountInit() {}\n\n/**\n * @static\n * @desc Creates an action that links external account.\n * @param {Object} profile Topcoder member handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} providerType The external account service provider\n * @param {String} callbackUrl Optional. The callback url\n * @return {Action}\n */\nfunction linkExternalAccountDone(profile, tokenV3, providerType, callbackUrl) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.linkExternalAccount(profile.userId, providerType, callbackUrl).then(function (res) {\n    return { data: res, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of unlinking external account.\n * @param {Object} providerType External account provider type to delete.\n * @return {Action}\n */\nfunction unlinkExternalAccountInit(_ref2) {\n  var providerType = _ref2.providerType;\n\n  return { providerType: providerType };\n}\n\n/**\n * @static\n * @desc Creates an action that unlinks external account.\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} providerType The external account service provider\n * @return {Action}\n */\nfunction unlinkExternalAccountDone(profile, tokenV3, providerType) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.unlinkExternalAccount(profile.userId, providerType).then(function () {\n    return { providerType: providerType, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of saving email preferences.\n * @return {Action}\n */\nfunction saveEmailPreferencesInit() {}\n\n/**\n * @static\n * @desc Creates an action that saves email preferences.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Object} preferences The email preferences\n * @return {Action}\n */\nfunction saveEmailPreferencesDone(profile, tokenV3, preferences) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.saveEmailPreferences(profile, preferences).then(function (res) {\n    return { data: res, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of updating user password.\n * @return {Action}\n */\nfunction updatePasswordInit() {}\n\n/**\n * @static\n * @desc Creates an action that updates user password.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} newPassword The new password\n * @param {String} oldPassword The old password\n * @return {Action}\n */\nfunction updatePasswordDone(profile, tokenV3, newPassword, oldPassword) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.updatePassword(profile.userId, newPassword, oldPassword).then(function (res) {\n    return { data: res, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of verify member new email.\n * @return {Action}\n */\nfunction verifyMemberNewEmailInit() {}\n\n/**\n * @static\n * @desc Creates an action that verify member new email.\n *\n * @param {Object} handle Topcoder member handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} emailVerifyToken The verify token of new email.\n * @return {Action}\n */\nfunction verifyMemberNewEmailDone(handle, tokenV3, emailVerifyToken) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.verifyMemberNewEmail(handle, emailVerifyToken).then(function (res) {\n    return { data: res };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that toggles isEmailConflict state\n * @param {boolean} state\n * @return {Action}\n */\nfunction updateEmailConflict() {\n  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n  return state;\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  PROFILE: {\n    LOAD_PROFILE: loadProfile,\n    CLEAR_PROFILE: _lodash2.default.noop,\n    GET_ACHIEVEMENTS_INIT: getAchievementsInit,\n    GET_ACHIEVEMENTS_DONE: getAchievementsDone,\n    GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,\n    GET_EXTERNAL_ACCOUNTS_INIT: getExternalAccountsInit,\n    GET_EXTERNAL_ACCOUNTS_DONE: getExternalAccountsDone,\n    GET_EXTERNAL_LINKS_INIT: getExternalLinksInit,\n    GET_EXTERNAL_LINKS_DONE: getExternalLinksDone,\n    GET_INFO_INIT: getInfoInit,\n    GET_INFO_DONE: getInfoDone,\n    GET_SKILLS_INIT: getSkillsInit,\n    GET_SKILLS_DONE: getSkillsDone,\n    GET_STATS_INIT: getStatsInit,\n    GET_STATS_DONE: getStatsDone,\n    GET_LINKED_ACCOUNTS_INIT: getLinkedAccountsInit,\n    GET_LINKED_ACCOUNTS_DONE: getLinkedAccountsDone,\n    GET_EMAIL_PREFERENCES_INIT: getEmailPreferencesInit,\n    GET_EMAIL_PREFERENCES_DONE: getEmailPreferencesDone,\n    GET_CREDENTIAL_INIT: getCredentialInit,\n    GET_CREDENTIAL_DONE: getCredentialDone,\n    UPLOAD_PHOTO_INIT: uploadPhotoInit,\n    UPLOAD_PHOTO_DONE: uploadPhotoDone,\n    DELETE_PHOTO_INIT: deletePhotoInit,\n    DELETE_PHOTO_DONE: updateProfileDone,\n    UPDATE_PROFILE_INIT: updateProfileInit,\n    UPDATE_PROFILE_DONE: updateProfileDone,\n    ADD_SKILL_INIT: addSkillInit,\n    ADD_SKILL_DONE: addSkillDone,\n    HIDE_SKILL_INIT: hideSkillInit,\n    HIDE_SKILL_DONE: hideSkillDone,\n    ADD_WEB_LINK_INIT: addWebLinkInit,\n    ADD_WEB_LINK_DONE: addWebLinkDone,\n    DELETE_WEB_LINK_INIT: deleteWebLinkInit,\n    DELETE_WEB_LINK_DONE: deleteWebLinkDone,\n    LINK_EXTERNAL_ACCOUNT_INIT: linkExternalAccountInit,\n    LINK_EXTERNAL_ACCOUNT_DONE: linkExternalAccountDone,\n    UNLINK_EXTERNAL_ACCOUNT_INIT: unlinkExternalAccountInit,\n    UNLINK_EXTERNAL_ACCOUNT_DONE: unlinkExternalAccountDone,\n    SAVE_EMAIL_PREFERENCES_INIT: saveEmailPreferencesInit,\n    SAVE_EMAIL_PREFERENCES_DONE: saveEmailPreferencesDone,\n    UPDATE_PASSWORD_INIT: updatePasswordInit,\n    UPDATE_PASSWORD_DONE: updatePasswordDone,\n    VERIFY_MEMBER_NEW_EMAIL_INIT: verifyMemberNewEmailInit,\n    VERIFY_MEMBER_NEW_EMAIL_DONE: verifyMemberNewEmailDone,\n    UPDATE_EMAIL_CONFLICT: updateEmailConflict\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(loadProfile, 'loadProfile', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getAchievementsInit, 'getAchievementsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getAchievementsDone, 'getAchievementsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getAchievementsV3Done, 'getAchievementsV3Done', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalAccountsInit, 'getExternalAccountsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalAccountsDone, 'getExternalAccountsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalLinksInit, 'getExternalLinksInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalLinksDone, 'getExternalLinksDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getInfoInit, 'getInfoInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getInfoDone, 'getInfoDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getSkillsInit, 'getSkillsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getSkillsDone, 'getSkillsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getStatsInit, 'getStatsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getStatsDone, 'getStatsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getLinkedAccountsInit, 'getLinkedAccountsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getLinkedAccountsDone, 'getLinkedAccountsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getCredentialInit, 'getCredentialInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getCredentialDone, 'getCredentialDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getEmailPreferencesInit, 'getEmailPreferencesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getEmailPreferencesDone, 'getEmailPreferencesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(uploadPhotoInit, 'uploadPhotoInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(uploadPhotoDone, 'uploadPhotoDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(deletePhotoInit, 'deletePhotoInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updateProfileInit, 'updateProfileInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updateProfileDone, 'updateProfileDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addSkillInit, 'addSkillInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addSkillDone, 'addSkillDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(hideSkillInit, 'hideSkillInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(hideSkillDone, 'hideSkillDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addWebLinkInit, 'addWebLinkInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addWebLinkDone, 'addWebLinkDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(deleteWebLinkInit, 'deleteWebLinkInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(deleteWebLinkDone, 'deleteWebLinkDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(linkExternalAccountInit, 'linkExternalAccountInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(linkExternalAccountDone, 'linkExternalAccountDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(unlinkExternalAccountInit, 'unlinkExternalAccountInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(unlinkExternalAccountDone, 'unlinkExternalAccountDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(saveEmailPreferencesInit, 'saveEmailPreferencesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(saveEmailPreferencesDone, 'saveEmailPreferencesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updatePasswordInit, 'updatePasswordInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updatePasswordDone, 'updatePasswordDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(verifyMemberNewEmailInit, 'verifyMemberNewEmailInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(verifyMemberNewEmailDone, 'verifyMemberNewEmailDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updateEmailConflict, 'updateEmailConflict', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/profile.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/profile.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _user = __webpack_require__(/*! ../services/user */ \"./src/services/user.js\");\n\nvar _members = __webpack_require__(/*! ../services/members */ \"./src/services/members.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.profile\"\n    * @desc Actions for interactions with profile details API.\n    * @todo Some of them repeat actions in {@link actions.members.md}. The code\n    *  should be refactored to avoid redundancy.\n    */\n\n\n/**\n * @static\n * @desc Creates and action that loads user profile.\n * @todo This action does not follow the pattern with init/done pairs of\n *  actions. Should be improved.\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction loadProfile(handle) {\n  return handle;\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of user achievements loading.\n * @todo This duplicates similar action in {@link actions.members.md}!\n * @return {Action}\n */\nfunction getAchievementsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads user achievements from API v2.\n * @todo This duplicates similar action in {@link actions.members.md}!\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getAchievementsDone(handle) {\n  return (0, _user.getService)().getUserPublic(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that loads user achievements from API v3.\n * @todo This duplicates similar action in {@link actions.members.md}!\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getAchievementsV3Done(handle) {\n  return (0, _user.getService)().getUserPublicV3(handle);\n}\n\n/**\n * @static\n * @todo To be documented.\n * @return {Action}\n */\nfunction getExternalAccountsInit() {}\n\n/**\n * @static\n * @todo To be documented.\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getExternalAccountsDone(handle) {\n  return (0, _members.getService)().getExternalAccounts(handle);\n}\n\n/**\n * @static\n * @todo Figure out what does this action do.\n * @return {Action}\n */\nfunction getExternalLinksInit() {}\n\n/**\n * @static\n * @todo Figure out the purpose of this action\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getExternalLinksDone(handle) {\n  return (0, _members.getService)().getExternalLinks(handle);\n}\n\n/**\n * @static\n * @todo Figure out the purpose of this action.\n * @return {Action}\n */\nfunction getInfoInit() {}\n\n/**\n * @static\n * @todo Figure out the purpose of this action.\n * @param {String} handle User handle.\n * @return {Action}\n */\nfunction getInfoDone(handle) {\n  return (0, _members.getService)().getMemberInfo(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the member's\n *  skills info.\n * @return {Action}\n */\nfunction getSkillsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads member's skills info.\n * @param {String} handle Member handle.\n * @return {Action}\n */\nfunction getSkillsDone(handle) {\n  return (0, _members.getService)().getSkills(handle);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading member's stats.\n * @todo This is similar to {@link actions.members.md#module_actions.members.getStatsInit}!\n * @return {Action}\n */\nfunction getStatsInit() {}\n\n/**\n * @static\n * @desc Creates an action that loads member's stats.\n * @param {String} handle Member handle.\n * @param {String} groupIds Group ids.\n * @return {Action}\n */\nfunction getStatsDone(handle, groupIds) {\n  return (0, _members.getService)().getStats(handle, groupIds);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting linked accounts.\n * @return {Action}\n */\nfunction getLinkedAccountsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets linked accounts.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getLinkedAccountsDone(profile, tokenV3) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.getLinkedAccounts(profile.userId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting credential.\n * @return {Action}\n */\nfunction getCredentialInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets credential.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getCredentialDone(profile, tokenV3) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.getCredential(profile.userId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting email preferences.\n * @return {Action}\n */\nfunction getEmailPreferencesInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets email preferences.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction getEmailPreferencesDone(profile, tokenV3) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.getEmailPreferences(profile.userId);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of uploading user's photo.\n * @return {Action}\n */\nfunction uploadPhotoInit() {}\n\n/**\n * @static\n * @desc Creates an action that uploads user's photo.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} file The photo file.\n * @return {Action}\n */\nfunction uploadPhotoDone(handle, tokenV3, file) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.getPresignedUrl(handle, file).then(function (res) {\n    return service.uploadFileToS3(res);\n  }).then(function (res) {\n    return service.updateMemberPhoto(res);\n  }).then(function (photoURL) {\n    return { handle: handle, photoURL: photoURL };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of deleting user's photo.\n * @return {Action}\n */\nfunction deletePhotoInit() {}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of updating user's profile.\n * @return {Action}\n */\nfunction updateProfileInit() {}\n\n/**\n * @static\n * @desc Creates an action that updates user's profile.\n * @param {String} profile Topcoder user profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Action}\n */\nfunction updateProfileDone(profile, tokenV3) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.updateMemberProfile(profile);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of adding user's skill.\n * @return {Action}\n */\nfunction addSkillInit() {}\n\n/**\n * @static\n * @desc Creates an action that adds user's skill.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Object} skill Skill to add.\n * @return {Action}\n */\nfunction addSkillDone(handle, tokenV3, skill) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.addSkill(handle, skill.tagId).then(function (res) {\n    return { skills: res.skills, handle: handle, skill: skill };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of hiding user's skill.\n * @return {Action}\n */\nfunction hideSkillInit() {}\n\n/**\n * @static\n * @desc Creates an action that hides user's skill.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Object} skill Skill to hide.\n * @return {Action}\n */\nfunction hideSkillDone(handle, tokenV3, skill) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.hideSkill(handle, skill.tagId).then(function (res) {\n    return { skills: res.skills, handle: handle, skill: skill };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of adding user's web link.\n * @return {Action}\n */\nfunction addWebLinkInit() {}\n\n/**\n * @static\n * @desc Creates an action that adds user's web link.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} webLink Web link to add.\n * @return {Action}\n */\nfunction addWebLinkDone(handle, tokenV3, webLink) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.addWebLink(handle, webLink).then(function (res) {\n    return { data: res, handle: handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of deleting user's web link.\n * @param {Object} key Web link key to delete.\n * @return {Action}\n */\nfunction deleteWebLinkInit(_ref) {\n  var key = _ref.key;\n\n  return { key: key };\n}\n\n/**\n * @static\n * @desc Creates an action that deletes user's web link.\n * @param {String} handle Topcoder user handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} webLink Web link to delete.\n * @return {Action}\n */\nfunction deleteWebLinkDone(handle, tokenV3, webLink) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.deleteWebLink(handle, webLink.key).then(function (res) {\n    return { data: res, handle: handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of linking external account.\n * @return {Action}\n */\nfunction linkExternalAccountInit() {}\n\n/**\n * @static\n * @desc Creates an action that links external account.\n * @param {Object} profile Topcoder member handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} providerType The external account service provider\n * @param {String} callbackUrl Optional. The callback url\n * @return {Action}\n */\nfunction linkExternalAccountDone(profile, tokenV3, providerType, callbackUrl) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.linkExternalAccount(profile.userId, providerType, callbackUrl).then(function (res) {\n    return { data: res, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of unlinking external account.\n * @param {Object} providerType External account provider type to delete.\n * @return {Action}\n */\nfunction unlinkExternalAccountInit(_ref2) {\n  var providerType = _ref2.providerType;\n\n  return { providerType: providerType };\n}\n\n/**\n * @static\n * @desc Creates an action that unlinks external account.\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} providerType The external account service provider\n * @return {Action}\n */\nfunction unlinkExternalAccountDone(profile, tokenV3, providerType) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.unlinkExternalAccount(profile.userId, providerType).then(function () {\n    return { providerType: providerType, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of saving email preferences.\n * @return {Action}\n */\nfunction saveEmailPreferencesInit() {}\n\n/**\n * @static\n * @desc Creates an action that saves email preferences.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {Object} preferences The email preferences\n * @return {Action}\n */\nfunction saveEmailPreferencesDone(profile, tokenV3, preferences) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.saveEmailPreferences(profile, preferences).then(function (res) {\n    return { data: res, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of updating user password.\n * @return {Action}\n */\nfunction updatePasswordInit() {}\n\n/**\n * @static\n * @desc Creates an action that updates user password.\n *\n * @param {Object} profile Topcoder member profile.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} newPassword The new password\n * @param {String} oldPassword The old password\n * @return {Action}\n */\nfunction updatePasswordDone(profile, tokenV3, newPassword, oldPassword) {\n  var service = (0, _user.getService)(tokenV3);\n  return service.updatePassword(profile.userId, newPassword, oldPassword).then(function (res) {\n    return { data: res, handle: profile.handle };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of verify member new email.\n * @return {Action}\n */\nfunction verifyMemberNewEmailInit() {}\n\n/**\n * @static\n * @desc Creates an action that verify member new email.\n *\n * @param {Object} handle Topcoder member handle.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @param {String} emailVerifyToken The verify token of new email.\n * @return {Action}\n */\nfunction verifyMemberNewEmailDone(handle, tokenV3, emailVerifyToken) {\n  var service = (0, _members.getService)(tokenV3);\n  return service.verifyMemberNewEmail(handle, emailVerifyToken).then(function (res) {\n    return { data: res };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that toggles isEmailConflict state\n * @param {boolean} state\n * @return {Action}\n */\nfunction updateEmailConflict() {\n  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n  return state;\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  PROFILE: {\n    LOAD_PROFILE: loadProfile,\n    CLEAR_PROFILE: _lodash2.default.noop,\n    GET_ACHIEVEMENTS_INIT: getAchievementsInit,\n    GET_ACHIEVEMENTS_DONE: getAchievementsDone,\n    GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done,\n    GET_EXTERNAL_ACCOUNTS_INIT: getExternalAccountsInit,\n    GET_EXTERNAL_ACCOUNTS_DONE: getExternalAccountsDone,\n    GET_EXTERNAL_LINKS_INIT: getExternalLinksInit,\n    GET_EXTERNAL_LINKS_DONE: getExternalLinksDone,\n    GET_INFO_INIT: getInfoInit,\n    GET_INFO_DONE: getInfoDone,\n    GET_SKILLS_INIT: getSkillsInit,\n    GET_SKILLS_DONE: getSkillsDone,\n    GET_STATS_INIT: getStatsInit,\n    GET_STATS_DONE: getStatsDone,\n    GET_LINKED_ACCOUNTS_INIT: getLinkedAccountsInit,\n    GET_LINKED_ACCOUNTS_DONE: getLinkedAccountsDone,\n    GET_EMAIL_PREFERENCES_INIT: getEmailPreferencesInit,\n    GET_EMAIL_PREFERENCES_DONE: getEmailPreferencesDone,\n    GET_CREDENTIAL_INIT: getCredentialInit,\n    GET_CREDENTIAL_DONE: getCredentialDone,\n    UPLOAD_PHOTO_INIT: uploadPhotoInit,\n    UPLOAD_PHOTO_DONE: uploadPhotoDone,\n    DELETE_PHOTO_INIT: deletePhotoInit,\n    DELETE_PHOTO_DONE: updateProfileDone,\n    UPDATE_PROFILE_INIT: updateProfileInit,\n    UPDATE_PROFILE_DONE: updateProfileDone,\n    ADD_SKILL_INIT: addSkillInit,\n    ADD_SKILL_DONE: addSkillDone,\n    HIDE_SKILL_INIT: hideSkillInit,\n    HIDE_SKILL_DONE: hideSkillDone,\n    ADD_WEB_LINK_INIT: addWebLinkInit,\n    ADD_WEB_LINK_DONE: addWebLinkDone,\n    DELETE_WEB_LINK_INIT: deleteWebLinkInit,\n    DELETE_WEB_LINK_DONE: deleteWebLinkDone,\n    LINK_EXTERNAL_ACCOUNT_INIT: linkExternalAccountInit,\n    LINK_EXTERNAL_ACCOUNT_DONE: linkExternalAccountDone,\n    UNLINK_EXTERNAL_ACCOUNT_INIT: unlinkExternalAccountInit,\n    UNLINK_EXTERNAL_ACCOUNT_DONE: unlinkExternalAccountDone,\n    SAVE_EMAIL_PREFERENCES_INIT: saveEmailPreferencesInit,\n    SAVE_EMAIL_PREFERENCES_DONE: saveEmailPreferencesDone,\n    UPDATE_PASSWORD_INIT: updatePasswordInit,\n    UPDATE_PASSWORD_DONE: updatePasswordDone,\n    VERIFY_MEMBER_NEW_EMAIL_INIT: verifyMemberNewEmailInit,\n    VERIFY_MEMBER_NEW_EMAIL_DONE: verifyMemberNewEmailDone,\n    UPDATE_EMAIL_CONFLICT: updateEmailConflict\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(loadProfile, 'loadProfile', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getAchievementsInit, 'getAchievementsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getAchievementsDone, 'getAchievementsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getAchievementsV3Done, 'getAchievementsV3Done', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalAccountsInit, 'getExternalAccountsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalAccountsDone, 'getExternalAccountsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalLinksInit, 'getExternalLinksInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getExternalLinksDone, 'getExternalLinksDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getInfoInit, 'getInfoInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getInfoDone, 'getInfoDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getSkillsInit, 'getSkillsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getSkillsDone, 'getSkillsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getStatsInit, 'getStatsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getStatsDone, 'getStatsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getLinkedAccountsInit, 'getLinkedAccountsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getLinkedAccountsDone, 'getLinkedAccountsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getCredentialInit, 'getCredentialInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getCredentialDone, 'getCredentialDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getEmailPreferencesInit, 'getEmailPreferencesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(getEmailPreferencesDone, 'getEmailPreferencesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(uploadPhotoInit, 'uploadPhotoInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(uploadPhotoDone, 'uploadPhotoDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(deletePhotoInit, 'deletePhotoInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updateProfileInit, 'updateProfileInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updateProfileDone, 'updateProfileDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addSkillInit, 'addSkillInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addSkillDone, 'addSkillDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(hideSkillInit, 'hideSkillInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(hideSkillDone, 'hideSkillDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addWebLinkInit, 'addWebLinkInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(addWebLinkDone, 'addWebLinkDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(deleteWebLinkInit, 'deleteWebLinkInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(deleteWebLinkDone, 'deleteWebLinkDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(linkExternalAccountInit, 'linkExternalAccountInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(linkExternalAccountDone, 'linkExternalAccountDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(unlinkExternalAccountInit, 'unlinkExternalAccountInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(unlinkExternalAccountDone, 'unlinkExternalAccountDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(saveEmailPreferencesInit, 'saveEmailPreferencesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(saveEmailPreferencesDone, 'saveEmailPreferencesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updatePasswordInit, 'updatePasswordInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updatePasswordDone, 'updatePasswordDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(verifyMemberNewEmailInit, 'verifyMemberNewEmailInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(verifyMemberNewEmailDone, 'verifyMemberNewEmailDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(updateEmailConflict, 'updateEmailConflict', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/profile.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/profile.js?");
 
 /***/ }),
 
@@ -544,7 +544,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _reviewOpportunities = __webpack_require__(/*! ../services/reviewOpportunities */ \"./src/services/reviewOpportunities.js\");\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.reviewOpportunity\"\n    * @desc Actions for review opportunity details API.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of review application\n *  cancelation.\n * @return {Action}\n */\nfunction cancelApplicationsInit() {}\n\n/**\n * @static\n * @desc Creates an action that cancels existing applications\n * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n * @param {Array} roleIds Array of roleId Numbers to cancel applications for\n * @param {String} tokenV3 Required. Topcoder auth token v3.\n * @return {Action}\n */\nfunction cancelApplicationsDone(challengeId, roleIds, tokenV3) {\n  return (0, _reviewOpportunities.getReviewOpportunitiesService)(tokenV3).cancelApplications(challengeId, roleIds);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the review\n *  opportunity details.\n * @return {Action}\n */\nfunction getDetailsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets details of a review opportunity for\n *  the specified challenge.\n * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n * @param {String} tokenV3=null Optional. Topcoder auth token v3.\n * @default test\n * @return {Action}\n */\nfunction getDetailsDone(challengeId, tokenV3) {\n  return (0, _reviewOpportunities.getReviewOpportunitiesService)(tokenV3).getDetails(challengeId).catch(function (error) {\n    if (error.status !== 401) {\n      (0, _errors.fireErrorMessage)('Error Getting Review Opportunity Details', error.content || error);\n    }\n    return _promise2.default.reject(error.status);\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of review application process.\n * @return {Action}\n */\nfunction submitAppliationInit() {}\n\n/**\n * @static\n * @desc Creates an action that submits application for a review opportunity.\n * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n * @param {Array} roleIds Array of roleId Numbers to cancel applications for\n * @param {String} tokenV3 Required. Topcoder auth token v3.\n * @return {Action}\n */\nfunction submitApplicationsDone(challengeId, roleIds, tokenV3) {\n  return (0, _reviewOpportunities.getReviewOpportunitiesService)(tokenV3).submitApplications(challengeId, roleIds);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  REVIEW_OPPORTUNITY: {\n    CANCEL_APPLICATIONS_INIT: cancelApplicationsInit,\n    CANCEL_APPLICATIONS_DONE: cancelApplicationsDone,\n    GET_DETAILS_INIT: getDetailsInit,\n    GET_DETAILS_DONE: getDetailsDone,\n    SUBMIT_APPLICATIONS_INIT: submitAppliationInit,\n    SUBMIT_APPLICATIONS_DONE: submitApplicationsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(cancelApplicationsInit, 'cancelApplicationsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(cancelApplicationsDone, 'cancelApplicationsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(getDetailsInit, 'getDetailsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(getDetailsDone, 'getDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(submitAppliationInit, 'submitAppliationInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(submitApplicationsDone, 'submitApplicationsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/reviewOpportunity.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/reviewOpportunity.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _reviewOpportunities = __webpack_require__(/*! ../services/reviewOpportunities */ \"./src/services/reviewOpportunities.js\");\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.reviewOpportunity\"\n    * @desc Actions for review opportunity details API.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of review application\n *  cancelation.\n * @return {Action}\n */\nfunction cancelApplicationsInit() {}\n\n/**\n * @static\n * @desc Creates an action that cancels existing applications\n * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n * @param {Array} roleIds Array of roleId Numbers to cancel applications for\n * @param {String} tokenV3 Required. Topcoder auth token v3.\n * @return {Action}\n */\nfunction cancelApplicationsDone(challengeId, roleIds, tokenV3) {\n  return (0, _reviewOpportunities.getReviewOpportunitiesService)(tokenV3).cancelApplications(challengeId, roleIds);\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of loading the review\n *  opportunity details.\n * @return {Action}\n */\nfunction getDetailsInit() {}\n\n/**\n * @static\n * @desc Creates an action that gets details of a review opportunity for\n *  the specified challenge.\n * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n * @param {String} tokenV3=null Optional. Topcoder auth token v3.\n * @default test\n * @return {Action}\n */\nfunction getDetailsDone(challengeId, tokenV3) {\n  return (0, _reviewOpportunities.getReviewOpportunitiesService)(tokenV3).getDetails(challengeId).catch(function (error) {\n    if (error.status !== 401) {\n      (0, _errors.fireErrorMessage)('Error Getting Review Opportunity Details', error.content || error);\n    }\n    return _promise2.default.reject(error.status);\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of review application process.\n * @return {Action}\n */\nfunction submitAppliationInit() {}\n\n/**\n * @static\n * @desc Creates an action that submits application for a review opportunity.\n * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n * @param {Array} roleIds Array of roleId Numbers to cancel applications for\n * @param {String} tokenV3 Required. Topcoder auth token v3.\n * @return {Action}\n */\nfunction submitApplicationsDone(challengeId, roleIds, tokenV3) {\n  return (0, _reviewOpportunities.getReviewOpportunitiesService)(tokenV3).submitApplications(challengeId, roleIds);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  REVIEW_OPPORTUNITY: {\n    CANCEL_APPLICATIONS_INIT: cancelApplicationsInit,\n    CANCEL_APPLICATIONS_DONE: cancelApplicationsDone,\n    GET_DETAILS_INIT: getDetailsInit,\n    GET_DETAILS_DONE: getDetailsDone,\n    SUBMIT_APPLICATIONS_INIT: submitAppliationInit,\n    SUBMIT_APPLICATIONS_DONE: submitApplicationsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(cancelApplicationsInit, 'cancelApplicationsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(cancelApplicationsDone, 'cancelApplicationsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(getDetailsInit, 'getDetailsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(getDetailsDone, 'getDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(submitAppliationInit, 'submitAppliationInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(submitApplicationsDone, 'submitApplicationsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/reviewOpportunity.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/reviewOpportunity.js?");
 
 /***/ }),
 
@@ -556,7 +556,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads user's all traits.\n * @param {String} handle the topcoder member handle\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\nvar getAllUserTraits = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return (0, _userTraits.getService)(tokenV3).getAllUserTraits(handle);\n\n          case 2:\n            data = _context.sent;\n            return _context.abrupt('return', { data: data, handle: handle });\n\n          case 4:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getAllUserTraits(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that  add trait by trait id.\n * @param {String} handle member's handle.\n * @param {String} traitId trait id.\n * @param {Array} data trait data array.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar addUserTrait = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle, traitId, data, tokenV3) {\n    var result;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return (0, _userTraits.getService)(tokenV3).addUserTrait(handle, traitId, data);\n\n          case 2:\n            result = _context2.sent;\n            return _context2.abrupt('return', { result: result, handle: handle, traitId: traitId });\n\n          case 4:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n\n  return function addUserTrait(_x3, _x4, _x5, _x6) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that update trait by trait id.\n * @param {String} handle member's handle.\n * @param {String} traitId trait id.\n * @param {Array} data trait data array.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar updateUserTrait = function () {\n  var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle, traitId, data, tokenV3) {\n    var result;\n    return _regenerator2.default.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            _context3.next = 2;\n            return (0, _userTraits.getService)(tokenV3).updateUserTrait(handle, traitId, data);\n\n          case 2:\n            result = _context3.sent;\n            return _context3.abrupt('return', { result: result, handle: handle, traitId: traitId });\n\n          case 4:\n          case 'end':\n            return _context3.stop();\n        }\n      }\n    }, _callee3, this);\n  }));\n\n  return function updateUserTrait(_x7, _x8, _x9, _x10) {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that delete trait by trait id.\n * @param {String} handle member's handle.\n * @param {String} traitId trait id.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar deleteUserTrait = function () {\n  var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle, traitId, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee4$(_context4) {\n      while (1) {\n        switch (_context4.prev = _context4.next) {\n          case 0:\n            _context4.next = 2;\n            return (0, _userTraits.getService)(tokenV3).deleteUserTrait(handle, traitId);\n\n          case 2:\n            data = _context4.sent;\n            return _context4.abrupt('return', { data: data, handle: handle, traitId: traitId });\n\n          case 4:\n          case 'end':\n            return _context4.stop();\n        }\n      }\n    }, _callee4, this);\n  }));\n\n  return function deleteUserTrait(_x11, _x12, _x13) {\n    return _ref4.apply(this, arguments);\n  };\n}();\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _userTraits = __webpack_require__(/*! ../services/user-traits */ \"./src/services/user-traits.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.settings\"\n    * @desc Actions related to settings page.\n    */\n\nvar _default = (0, _reduxActions.createActions)({\n  SETTINGS: {\n    GET_ALL_USER_TRAITS: getAllUserTraits,\n    ADD_USER_TRAIT: addUserTrait,\n    DELETE_USER_TRAIT: deleteUserTrait,\n    UPDATE_USER_TRAIT: updateUserTrait,\n    MODIFY_USER_TRAIT_INIT: _lodash2.default.noop\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getAllUserTraits, 'getAllUserTraits', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(addUserTrait, 'addUserTrait', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(updateUserTrait, 'updateUserTrait', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(deleteUserTrait, 'deleteUserTrait', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/settings.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/settings.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Creates an action that loads user's all traits.\n * @param {String} handle the topcoder member handle\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\nvar getAllUserTraits = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return (0, _userTraits.getService)(tokenV3).getAllUserTraits(handle);\n\n          case 2:\n            data = _context.sent;\n            return _context.abrupt('return', { data: data, handle: handle });\n\n          case 4:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getAllUserTraits(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that  add trait by trait id.\n * @param {String} handle member's handle.\n * @param {String} traitId trait id.\n * @param {Array} data trait data array.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar addUserTrait = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle, traitId, data, tokenV3) {\n    var result;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return (0, _userTraits.getService)(tokenV3).addUserTrait(handle, traitId, data);\n\n          case 2:\n            result = _context2.sent;\n            return _context2.abrupt('return', { result: result, handle: handle, traitId: traitId });\n\n          case 4:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n\n  return function addUserTrait(_x3, _x4, _x5, _x6) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that update trait by trait id.\n * @param {String} handle member's handle.\n * @param {String} traitId trait id.\n * @param {Array} data trait data array.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar updateUserTrait = function () {\n  var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle, traitId, data, tokenV3) {\n    var result;\n    return _regenerator2.default.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            _context3.next = 2;\n            return (0, _userTraits.getService)(tokenV3).updateUserTrait(handle, traitId, data);\n\n          case 2:\n            result = _context3.sent;\n            return _context3.abrupt('return', { result: result, handle: handle, traitId: traitId });\n\n          case 4:\n          case 'end':\n            return _context3.stop();\n        }\n      }\n    }, _callee3, this);\n  }));\n\n  return function updateUserTrait(_x7, _x8, _x9, _x10) {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @desc Creates an action that delete trait by trait id.\n * @param {String} handle member's handle.\n * @param {String} traitId trait id.\n * @param {String} tokenV3 v3 auth token.\n * @return {Action}\n */\n\n\nvar deleteUserTrait = function () {\n  var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle, traitId, tokenV3) {\n    var data;\n    return _regenerator2.default.wrap(function _callee4$(_context4) {\n      while (1) {\n        switch (_context4.prev = _context4.next) {\n          case 0:\n            _context4.next = 2;\n            return (0, _userTraits.getService)(tokenV3).deleteUserTrait(handle, traitId);\n\n          case 2:\n            data = _context4.sent;\n            return _context4.abrupt('return', { data: data, handle: handle, traitId: traitId });\n\n          case 4:\n          case 'end':\n            return _context4.stop();\n        }\n      }\n    }, _callee4, this);\n  }));\n\n  return function deleteUserTrait(_x11, _x12, _x13) {\n    return _ref4.apply(this, arguments);\n  };\n}();\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _userTraits = __webpack_require__(/*! ../services/user-traits */ \"./src/services/user-traits.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.settings\"\n    * @desc Actions related to settings page.\n    */\n\nvar _default = (0, _reduxActions.createActions)({\n  SETTINGS: {\n    GET_ALL_USER_TRAITS: getAllUserTraits,\n    ADD_USER_TRAIT: addUserTrait,\n    DELETE_USER_TRAIT: deleteUserTrait,\n    UPDATE_USER_TRAIT: updateUserTrait,\n    MODIFY_USER_TRAIT_INIT: _lodash2.default.noop\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getAllUserTraits, 'getAllUserTraits', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(addUserTrait, 'addUserTrait', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(updateUserTrait, 'updateUserTrait', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(deleteUserTrait, 'deleteUserTrait', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/settings.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/settings.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/settings.js?");
 
 /***/ }),
 
@@ -568,7 +568,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _api = __webpack_require__(/*! ../services/api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.smp\"\n    * @desc Actions related to *My Submissions Management* page.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of submission download.\n * @return {Action}\n */\nfunction deleteSubmissionInit() {}\n\n/**\n * @static\n * @desc Creates an action that deletes user's submission to a challenge.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @param {Number|String} submissionId Submission ID.\n * @return {Action}\n */\nfunction deleteSubmissionDone(tokenV3, submissionId) {\n  return (0, _api.getApi)('V3', tokenV3).delete('/submissions/' + submissionId).then(function () {\n    return submissionId;\n  });\n}\n\n/**\n * @static\n * @todo At this moment we don't need any special JS code to download\n * submissions: we get them from legacy Topcoder Studio API, which is\n * authenticated by cookies, and can be done with a simple <a> link in\n * the component. Soon we'll migrate to use the new TC API instead, and\n * then we'll decide, whether we need operate downloads in JS, or can we\n * just remove this action.\n * @return {Action}\n */\nfunction downloadSubmission(tokens, type, submissionId) {\n  _lodash2.default.noop(tokens, type, submissionId);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  SMP: {\n    DELETE_SUBMISSION_DONE: deleteSubmissionDone,\n    DELETE_SUBMISSION_INIT: deleteSubmissionInit,\n    DOWNLOAD_SUBMISSION: downloadSubmission\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(deleteSubmissionInit, 'deleteSubmissionInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/smp.js');\n  reactHotLoader.register(deleteSubmissionDone, 'deleteSubmissionDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/smp.js');\n  reactHotLoader.register(downloadSubmission, 'downloadSubmission', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/smp.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/smp.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/smp.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _api = __webpack_require__(/*! ../services/api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.smp\"\n    * @desc Actions related to *My Submissions Management* page.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of submission download.\n * @return {Action}\n */\nfunction deleteSubmissionInit() {}\n\n/**\n * @static\n * @desc Creates an action that deletes user's submission to a challenge.\n * @param {String} tokenV3 Topcoder v3 auth token.\n * @param {Number|String} submissionId Submission ID.\n * @return {Action}\n */\nfunction deleteSubmissionDone(tokenV3, submissionId) {\n  return (0, _api.getApi)('V3', tokenV3).delete('/submissions/' + submissionId).then(function () {\n    return submissionId;\n  });\n}\n\n/**\n * @static\n * @todo At this moment we don't need any special JS code to download\n * submissions: we get them from legacy Topcoder Studio API, which is\n * authenticated by cookies, and can be done with a simple <a> link in\n * the component. Soon we'll migrate to use the new TC API instead, and\n * then we'll decide, whether we need operate downloads in JS, or can we\n * just remove this action.\n * @return {Action}\n */\nfunction downloadSubmission(tokens, type, submissionId) {\n  _lodash2.default.noop(tokens, type, submissionId);\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  SMP: {\n    DELETE_SUBMISSION_DONE: deleteSubmissionDone,\n    DELETE_SUBMISSION_INIT: deleteSubmissionInit,\n    DOWNLOAD_SUBMISSION: downloadSubmission\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(deleteSubmissionInit, 'deleteSubmissionInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/smp.js');\n  reactHotLoader.register(deleteSubmissionDone, 'deleteSubmissionDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/smp.js');\n  reactHotLoader.register(downloadSubmission, 'downloadSubmission', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/smp.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/smp.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/smp.js?");
 
 /***/ }),
 
@@ -580,7 +580,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Create an action that gets statistics related to the specified\n * community. Data will be loaded into `stats.communities[communityId]` path of\n * the Redux store.\n * @todo The action should be refactored, see comments in the code.\n * @param {Object} community details of the community.\n * @param {String} uuid Operation UUID\n * @param {Array} challenges challenges from challengeListing to filter and do statistics\n * @param {String} token V3 Topcoder auth token. It is necessary to get data\n *  related to private groups.\n * @return {Action}\n */\n/* TODO: This code should be moved to a dedicated service. */\nvar getCommunityStatsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(community, uuid, challenges, token) {\n    var filtered, filterFunction, totalPrize, groupService, result, groupId;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.prev = 0;\n\n            /* TODO: At the moment, this component loads challenge objects to calculate\n            * the number of challenges and the total prize. Probably in future, we'll\n            * have a special API to get these data. */\n            filtered = challenges.filter(function (x) {\n              return x.status === 'ACTIVE';\n            });\n\n            if (community.challengeFilter) {\n              filterFunction = Filter.getFilterFunction(community.challengeFilter);\n\n              filtered = filtered.filter(filterFunction);\n            }\n            totalPrize = Math.round(filtered.reduce(function (total, challenge) {\n              return total + (challenge.totalPrize || 0);\n            }, 0));\n            groupService = (0, _groups.getService)(token);\n            result = {\n              community: community.communityId,\n              stats: {},\n              uuid: uuid\n            };\n\n            if (filtered.length) result.stats.numChallenges = filtered.length;\n            if (totalPrize) result.stats.openPrizes = '$' + totalPrize.toLocaleString();\n\n            groupId = _lodash2.default.get(community, 'groupIds[0]');\n\n            if (!groupId) {\n              _context.next = 13;\n              break;\n            }\n\n            _context.next = 12;\n            return groupService.getMembersCount(groupId, true);\n\n          case 12:\n            result.stats.numMembers = _context.sent;\n\n          case 13:\n            return _context.abrupt('return', result);\n\n          case 16:\n            _context.prev = 16;\n            _context.t0 = _context['catch'](0);\n            return _context.abrupt('return', {\n              community: community.communityId,\n              stats: {},\n              uuid: uuid\n            });\n\n          case 19:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this, [[0, 16]]);\n  }));\n\n  return function getCommunityStatsDone(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _filter = __webpack_require__(/*! ../utils/challenge/filter */ \"./src/utils/challenge/filter.js\");\n\nvar Filter = _interopRequireWildcard(_filter);\n\nvar _groups = __webpack_require__(/*! ../services/groups */ \"./src/services/groups.js\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.stats\"\n    * @desc Actions related to Topcoder statistics (at the moment, only community\n    *  statistics).\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of the loading community\n *  stats.\n * @param {Object} community Community meta-data object.\n * @param {String} [community.communityId] Community ID.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\nfunction getCommunityStatsInit(community, uuid) {\n  return { community: community.communityId, uuid: uuid };\n}\nvar _default = (0, _reduxActions.createActions)({\n  STATS: {\n    GET_COMMUNITY_STATS_INIT: getCommunityStatsInit,\n    GET_COMMUNITY_STATS_DONE: getCommunityStatsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getCommunityStatsInit, 'getCommunityStatsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/stats.js');\n  reactHotLoader.register(getCommunityStatsDone, 'getCommunityStatsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/stats.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/stats.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/stats.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * @static\n * @desc Create an action that gets statistics related to the specified\n * community. Data will be loaded into `stats.communities[communityId]` path of\n * the Redux store.\n * @todo The action should be refactored, see comments in the code.\n * @param {Object} community details of the community.\n * @param {String} uuid Operation UUID\n * @param {Array} challenges challenges from challengeListing to filter and do statistics\n * @param {String} token V3 Topcoder auth token. It is necessary to get data\n *  related to private groups.\n * @return {Action}\n */\n/* TODO: This code should be moved to a dedicated service. */\nvar getCommunityStatsDone = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(community, uuid, challenges, token) {\n    var filtered, filterFunction, totalPrize, groupService, result, groupId;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.prev = 0;\n\n            /* TODO: At the moment, this component loads challenge objects to calculate\n            * the number of challenges and the total prize. Probably in future, we'll\n            * have a special API to get these data. */\n            filtered = challenges.filter(function (x) {\n              return x.status === 'ACTIVE';\n            });\n\n            if (community.challengeFilter) {\n              filterFunction = Filter.getFilterFunction(community.challengeFilter);\n\n              filtered = filtered.filter(filterFunction);\n            }\n            totalPrize = Math.round(filtered.reduce(function (total, challenge) {\n              return total + (challenge.totalPrize || 0);\n            }, 0));\n            groupService = (0, _groups.getService)(token);\n            result = {\n              community: community.communityId,\n              stats: {},\n              uuid: uuid\n            };\n\n            if (filtered.length) result.stats.numChallenges = filtered.length;\n            if (totalPrize) result.stats.openPrizes = '$' + totalPrize.toLocaleString();\n\n            groupId = _lodash2.default.get(community, 'groupIds[0]');\n\n            if (!groupId) {\n              _context.next = 13;\n              break;\n            }\n\n            _context.next = 12;\n            return groupService.getMembersCount(groupId, true);\n\n          case 12:\n            result.stats.numMembers = _context.sent;\n\n          case 13:\n            return _context.abrupt('return', result);\n\n          case 16:\n            _context.prev = 16;\n            _context.t0 = _context['catch'](0);\n            return _context.abrupt('return', {\n              community: community.communityId,\n              stats: {},\n              uuid: uuid\n            });\n\n          case 19:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this, [[0, 16]]);\n  }));\n\n  return function getCommunityStatsDone(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _filter = __webpack_require__(/*! ../utils/challenge/filter */ \"./src/utils/challenge/filter.js\");\n\nvar Filter = _interopRequireWildcard(_filter);\n\nvar _groups = __webpack_require__(/*! ../services/groups */ \"./src/services/groups.js\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.stats\"\n    * @desc Actions related to Topcoder statistics (at the moment, only community\n    *  statistics).\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of the loading community\n *  stats.\n * @param {Object} community Community meta-data object.\n * @param {String} [community.communityId] Community ID.\n * @param {String} uuid Operation UUID.\n * @return {Action}\n */\nfunction getCommunityStatsInit(community, uuid) {\n  return { community: community.communityId, uuid: uuid };\n}\nvar _default = (0, _reduxActions.createActions)({\n  STATS: {\n    GET_COMMUNITY_STATS_INIT: getCommunityStatsInit,\n    GET_COMMUNITY_STATS_DONE: getCommunityStatsDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getCommunityStatsInit, 'getCommunityStatsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/stats.js');\n  reactHotLoader.register(getCommunityStatsDone, 'getCommunityStatsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/stats.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/stats.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/stats.js?");
 
 /***/ }),
 
@@ -592,7 +592,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _terms = __webpack_require__(/*! ../services/terms */ \"./src/services/terms.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.terms\"\n    * @desc Actions related to Topcoder terms of use.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of fetching terms data.\n * @todo Figure out the exact meaning of the argument.\n * @param {String} arg An argument. The exact meaning to be figured out.\n * @return {Action}\n */\nfunction getTermsInit(arg) {\n  return arg;\n}\n\n/**\n * @static\n * @desc Creates an action that fetches terms of the specified entity.\n * @param {Object}  entity       entity object\n * @param {String}  [entity.type]  entity type: `challenge` or `community`\n * @param {String}  [entity.id]    entity id\n * @param {Object}  tokens       object with tokenV2 and tokenV3 properties\n * @param {Boolean} mockAgreed   if true, then all terms will be mocked as\n *  agreed this only makes effect if MOCK_TERMS_SERVICE is `true` and the only\n *  purpose of this param is testing terms\n * @return {Action}\n */\nfunction getTermsDone(entity, tokens, mockAgreed) {\n  var service = (0, _terms.getService)(tokens.tokenV2);\n  var termsPromise = void 0;\n\n  // if mockAgreed=true passed, then we create an array of 10 true which we pass to the\n  // terms service methods.\n  // when terms service is mocked by setting MOCK_TERMS_SERVICE=true\n  // it will make all terms to have agreed status (actually only first 10 will be agreed,\n  // but we will hardly have even more then 3 terms per entity)\n  var mockAgreedArray = mockAgreed ? Array(10 + 1).join('1').split('').map(function () {\n    return true;\n  }) : [];\n\n  switch (entity.type) {\n    case 'challenge':\n      {\n        termsPromise = service.getChallengeTerms(entity.id, mockAgreedArray);\n        break;\n      }\n    case 'community':\n      {\n        termsPromise = service.getCommunityTerms(entity.id, tokens.tokenV3, mockAgreedArray);\n        break;\n      }\n    case 'reviewOpportunity':\n      {\n        termsPromise = service.getReviewOpportunityTerms(entity.reviewOpportunityTerms);\n        break;\n      }\n    default:\n      throw new Error('Entity type \\'' + entity.type + '\\' is not supported by getTermsDone.');\n  }\n\n  return termsPromise.then(function (res) {\n    return { entity: entity, terms: res.terms };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of terms status check\n *  operation.\n * @return {Action}\n */\nfunction checkStatusInit() {}\n\n/**\n * @static\n * @desc Creates an action thatwill check if all terms of specified entity have been agreed,\n *\n * @todo As in some reason backend does not saves immediately that DocuSign term has been agreed\n * In case not all terms were agreed we try again after some delay.\n * Maximum quantity attempts and delay between attempts are configured in\n * MAX_ATTEMPTS and TIME_OUT\n *\n * @todo: Looks like the bug described above was caused by server caching responses\n * at least for getTermDetails which is used by getCommunityTerms.\n * To fix it I've added nocache random value param in the terms service\n * for getTermDetails and it looks like works so we get results immediately.\n * This still have to be tested for challenges as they use another endpoint\n * in method getChallengeTerms.\n * Also terms which use third part service DocuSign has to be also tested prior\n * to removing multiple checks.\n * In case their agreed status is updated immediately, this code\n * has to simplified and don't make several attempts, only one.\n *\n * @param {Object} entity       entity object\n * @param {String} [entity.type]  entity type `challenge` or `community`.\n * @param {String} [entity.id]    entity id\n * @param {Object} tokens       object with tokenV2 and tokenV3 properties\n *\n * @return {Acion}\n */\nfunction checkStatusDone(entity, tokens) {\n  // timeout between checking status attempts\n  var TIME_OUT = 5000;\n\n  // maximum attempts to check status\n  var MAX_ATTEMPTS = 5;\n\n  // we set this flag for getTermsDone when MOCK_TERMS_SERVICE is true\n  // so that checkStatusDone resolves to all terms agreed when mocking\n  var mockAgreed = _topcoderReactUtils.config.MOCK_TERMS_SERVICE;\n\n  /*\n   * Promisified setTimeout\n   * @param  {Number} timeout timeout in milliseconds\n   * @return {Promise}         resolves after timeout\n   */\n  var delay = function delay(timeout) {\n    return new _promise2.default(function (resolve) {\n      setTimeout(resolve, timeout);\n    });\n  };\n\n  /*\n   * Makes attempt to check status\n   * @param  {Number} maxAttempts maximum number of attempts to perform\n   * @return {Promise}            resolves to the list of term objects\n   */\n  var checkStatus = function checkStatus(maxAttempts) {\n    return getTermsDone(entity, tokens, mockAgreed).then(function (res) {\n      var allAgreed = _lodash2.default.every(res.terms, 'agreed');\n\n      // if not all terms are agreed and we still have some attempts to try\n      if (!allAgreed && maxAttempts > 1) {\n        return delay(TIME_OUT).then(function () {\n          return checkStatus(maxAttempts - 1);\n        });\n      }\n\n      return res.terms;\n    });\n  };\n\n  return checkStatus(MAX_ATTEMPTS);\n}\n\n/**\n * @static\n * @desc Creates an action that marks that we are about to fetch details of the\n *  specified term. If any details for another term are currently being fetched,\n * they will be silently discarded.\n * @param {Number|String} termId\n * @return {Action}\n */\nfunction getTermDetailsInit(termId) {\n  return _lodash2.default.toString(termId);\n}\n\n/**\n * @static\n * @desc Creates an action that fetches details of the specified term.\n * @param {Number|String} termId\n * @param {String} tokenV2\n * @return {Action}\n */\nfunction getTermDetailsDone(termId, tokenV2) {\n  var service = (0, _terms.getService)(tokenV2);\n  return service.getTermDetails(termId).then(function (details) {\n    return { termId: termId, details: details };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting a DocuSign URL.\n * @param  {Number|String} templateId id of document template to sign\n * @return {Action}\n */\nfunction getDocuSignUrlInit(templateId) {\n  return _lodash2.default.toString(templateId);\n}\n\n/**\n * @static\n * @desc Creates an action that generates the url of DoduSign term\n * @param  {Number|String} templateId id of document template to sign\n * @param  {String} returnUrl  callback url after finishing singing\n * @param  {String} tokenV2    auth token\n * @return {Action}\n */\nfunction getDocuSignUrlDone(templateId, returnUrl, tokenV2) {\n  var service = (0, _terms.getService)(tokenV2);\n  return service.getDocuSignUrl(templateId, returnUrl).then(function (resp) {\n    return { templateId: templateId, docuSignUrl: resp.recipientViewUrl };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of terms agreement operation.\n * @param  {Number|String} termId id of term\n * @return {Action}\n */\nfunction agreeTermInit(termId) {\n  return _lodash2.default.toString(termId);\n}\n\n/**\n * @static\n * @desc Creates an action that agrees to a term.\n * @param  {Number|String} termId id of term\n * @param  {String} tokenV2    auth token\n * @return {Action}\n */\nfunction agreeTermDone(termId, tokenV2) {\n  var service = (0, _terms.getService)(tokenV2);\n  return service.agreeTerm(termId).then(function (resp) {\n    return { termId: termId, success: resp.success };\n  });\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  TERMS: {\n    GET_TERMS_INIT: getTermsInit,\n    GET_TERMS_DONE: getTermsDone,\n    GET_TERM_DETAILS_INIT: getTermDetailsInit,\n    GET_TERM_DETAILS_DONE: getTermDetailsDone,\n    GET_DOCU_SIGN_URL_INIT: getDocuSignUrlInit,\n    GET_DOCU_SIGN_URL_DONE: getDocuSignUrlDone,\n    AGREE_TERM_INIT: agreeTermInit,\n    AGREE_TERM_DONE: agreeTermDone,\n    CHECK_STATUS_INIT: checkStatusInit,\n    CHECK_STATUS_DONE: checkStatusDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getTermsInit, 'getTermsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getTermsDone, 'getTermsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(checkStatusInit, 'checkStatusInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(checkStatusDone, 'checkStatusDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getTermDetailsInit, 'getTermDetailsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getTermDetailsDone, 'getTermDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getDocuSignUrlInit, 'getDocuSignUrlInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getDocuSignUrlDone, 'getDocuSignUrlDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(agreeTermInit, 'agreeTermInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(agreeTermDone, 'agreeTermDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/actions/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/terms.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _terms = __webpack_require__(/*! ../services/terms */ \"./src/services/terms.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"actions.terms\"\n    * @desc Actions related to Topcoder terms of use.\n    */\n\n/**\n * @static\n * @desc Creates an action that signals beginning of fetching terms data.\n * @todo Figure out the exact meaning of the argument.\n * @param {String} arg An argument. The exact meaning to be figured out.\n * @return {Action}\n */\nfunction getTermsInit(arg) {\n  return arg;\n}\n\n/**\n * @static\n * @desc Creates an action that fetches terms of the specified entity.\n * @param {Object}  entity       entity object\n * @param {String}  [entity.type]  entity type: `challenge` or `community`\n * @param {String}  [entity.id]    entity id\n * @param {Object}  tokens       object with tokenV2 and tokenV3 properties\n * @param {Boolean} mockAgreed   if true, then all terms will be mocked as\n *  agreed this only makes effect if MOCK_TERMS_SERVICE is `true` and the only\n *  purpose of this param is testing terms\n * @return {Action}\n */\nfunction getTermsDone(entity, tokens, mockAgreed) {\n  var service = (0, _terms.getService)(tokens.tokenV2);\n  var termsPromise = void 0;\n\n  // if mockAgreed=true passed, then we create an array of 10 true which we pass to the\n  // terms service methods.\n  // when terms service is mocked by setting MOCK_TERMS_SERVICE=true\n  // it will make all terms to have agreed status (actually only first 10 will be agreed,\n  // but we will hardly have even more then 3 terms per entity)\n  var mockAgreedArray = mockAgreed ? Array(10 + 1).join('1').split('').map(function () {\n    return true;\n  }) : [];\n\n  switch (entity.type) {\n    case 'challenge':\n      {\n        termsPromise = service.getChallengeTerms(entity.id, mockAgreedArray);\n        break;\n      }\n    case 'community':\n      {\n        termsPromise = service.getCommunityTerms(entity.id, tokens.tokenV3, mockAgreedArray);\n        break;\n      }\n    case 'reviewOpportunity':\n      {\n        termsPromise = service.getReviewOpportunityTerms(entity.reviewOpportunityTerms);\n        break;\n      }\n    default:\n      throw new Error('Entity type \\'' + entity.type + '\\' is not supported by getTermsDone.');\n  }\n\n  return termsPromise.then(function (res) {\n    return { entity: entity, terms: res.terms };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of terms status check\n *  operation.\n * @return {Action}\n */\nfunction checkStatusInit() {}\n\n/**\n * @static\n * @desc Creates an action thatwill check if all terms of specified entity have been agreed,\n *\n * @todo As in some reason backend does not saves immediately that DocuSign term has been agreed\n * In case not all terms were agreed we try again after some delay.\n * Maximum quantity attempts and delay between attempts are configured in\n * MAX_ATTEMPTS and TIME_OUT\n *\n * @todo: Looks like the bug described above was caused by server caching responses\n * at least for getTermDetails which is used by getCommunityTerms.\n * To fix it I've added nocache random value param in the terms service\n * for getTermDetails and it looks like works so we get results immediately.\n * This still have to be tested for challenges as they use another endpoint\n * in method getChallengeTerms.\n * Also terms which use third part service DocuSign has to be also tested prior\n * to removing multiple checks.\n * In case their agreed status is updated immediately, this code\n * has to simplified and don't make several attempts, only one.\n *\n * @param {Object} entity       entity object\n * @param {String} [entity.type]  entity type `challenge` or `community`.\n * @param {String} [entity.id]    entity id\n * @param {Object} tokens       object with tokenV2 and tokenV3 properties\n *\n * @return {Acion}\n */\nfunction checkStatusDone(entity, tokens) {\n  // timeout between checking status attempts\n  var TIME_OUT = 5000;\n\n  // maximum attempts to check status\n  var MAX_ATTEMPTS = 5;\n\n  // we set this flag for getTermsDone when MOCK_TERMS_SERVICE is true\n  // so that checkStatusDone resolves to all terms agreed when mocking\n  var mockAgreed = _topcoderReactUtils.config.MOCK_TERMS_SERVICE;\n\n  /*\n   * Promisified setTimeout\n   * @param  {Number} timeout timeout in milliseconds\n   * @return {Promise}         resolves after timeout\n   */\n  var delay = function delay(timeout) {\n    return new _promise2.default(function (resolve) {\n      setTimeout(resolve, timeout);\n    });\n  };\n\n  /*\n   * Makes attempt to check status\n   * @param  {Number} maxAttempts maximum number of attempts to perform\n   * @return {Promise}            resolves to the list of term objects\n   */\n  var checkStatus = function checkStatus(maxAttempts) {\n    return getTermsDone(entity, tokens, mockAgreed).then(function (res) {\n      var allAgreed = _lodash2.default.every(res.terms, 'agreed');\n\n      // if not all terms are agreed and we still have some attempts to try\n      if (!allAgreed && maxAttempts > 1) {\n        return delay(TIME_OUT).then(function () {\n          return checkStatus(maxAttempts - 1);\n        });\n      }\n\n      return res.terms;\n    });\n  };\n\n  return checkStatus(MAX_ATTEMPTS);\n}\n\n/**\n * @static\n * @desc Creates an action that marks that we are about to fetch details of the\n *  specified term. If any details for another term are currently being fetched,\n * they will be silently discarded.\n * @param {Number|String} termId\n * @return {Action}\n */\nfunction getTermDetailsInit(termId) {\n  return _lodash2.default.toString(termId);\n}\n\n/**\n * @static\n * @desc Creates an action that fetches details of the specified term.\n * @param {Number|String} termId\n * @param {String} tokenV2\n * @return {Action}\n */\nfunction getTermDetailsDone(termId, tokenV2) {\n  var service = (0, _terms.getService)(tokenV2);\n  return service.getTermDetails(termId).then(function (details) {\n    return { termId: termId, details: details };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of getting a DocuSign URL.\n * @param  {Number|String} templateId id of document template to sign\n * @return {Action}\n */\nfunction getDocuSignUrlInit(templateId) {\n  return _lodash2.default.toString(templateId);\n}\n\n/**\n * @static\n * @desc Creates an action that generates the url of DoduSign term\n * @param  {Number|String} templateId id of document template to sign\n * @param  {String} returnUrl  callback url after finishing singing\n * @param  {String} tokenV2    auth token\n * @return {Action}\n */\nfunction getDocuSignUrlDone(templateId, returnUrl, tokenV2) {\n  var service = (0, _terms.getService)(tokenV2);\n  return service.getDocuSignUrl(templateId, returnUrl).then(function (resp) {\n    return { templateId: templateId, docuSignUrl: resp.recipientViewUrl };\n  });\n}\n\n/**\n * @static\n * @desc Creates an action that signals beginning of terms agreement operation.\n * @param  {Number|String} termId id of term\n * @return {Action}\n */\nfunction agreeTermInit(termId) {\n  return _lodash2.default.toString(termId);\n}\n\n/**\n * @static\n * @desc Creates an action that agrees to a term.\n * @param  {Number|String} termId id of term\n * @param  {String} tokenV2    auth token\n * @return {Action}\n */\nfunction agreeTermDone(termId, tokenV2) {\n  var service = (0, _terms.getService)(tokenV2);\n  return service.agreeTerm(termId).then(function (resp) {\n    return { termId: termId, success: resp.success };\n  });\n}\n\nvar _default = (0, _reduxActions.createActions)({\n  TERMS: {\n    GET_TERMS_INIT: getTermsInit,\n    GET_TERMS_DONE: getTermsDone,\n    GET_TERM_DETAILS_INIT: getTermDetailsInit,\n    GET_TERM_DETAILS_DONE: getTermDetailsDone,\n    GET_DOCU_SIGN_URL_INIT: getDocuSignUrlInit,\n    GET_DOCU_SIGN_URL_DONE: getDocuSignUrlDone,\n    AGREE_TERM_INIT: agreeTermInit,\n    AGREE_TERM_DONE: agreeTermDone,\n    CHECK_STATUS_INIT: checkStatusInit,\n    CHECK_STATUS_DONE: checkStatusDone\n  }\n});\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getTermsInit, 'getTermsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getTermsDone, 'getTermsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(checkStatusInit, 'checkStatusInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(checkStatusDone, 'checkStatusDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getTermDetailsInit, 'getTermDetailsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getTermDetailsDone, 'getTermDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getDocuSignUrlInit, 'getDocuSignUrlInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(getDocuSignUrlDone, 'getDocuSignUrlDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(agreeTermInit, 'agreeTermInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(agreeTermDone, 'agreeTermDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/actions/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/actions/terms.js?");
 
 /***/ }),
 
@@ -616,7 +616,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.factory = undefined;\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\n/**\n * Creates a new reducer.\n * @param {Object} options={} Optional. Options for customization of initial\n *  state.\n * @param {String} [options.auth.tokenV2=''] Optional. Topcoder v2 auth token.\n * @param {String} [options.auth.tokenV3=''] Optional. Topcoder v3 auth token.\n * @returns {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nvar factory = exports.factory = function () {\n  var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var state, a;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            state = {\n              tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n              tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n            };\n\n            if (!state.tokenV3) {\n              _context.next = 8;\n              break;\n            }\n\n            state.user = (0, _tcAccounts.decodeToken)(state.tokenV3);\n            a = _auth2.default.auth.loadProfile(state.tokenV3);\n            _context.next = 6;\n            return _topcoderReactUtils.redux.resolveAction(a);\n\n          case 6:\n            a = _context.sent;\n            return _context.abrupt('return', create(onProfileLoaded(state, a)));\n\n          case 8:\n            return _context.abrupt('return', create(state));\n\n          case 9:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function factory() {\n    return _ref6.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _auth = __webpack_require__(/*! ../actions/auth */ \"./src/actions/auth.js\");\n\nvar _auth2 = _interopRequireDefault(_auth);\n\nvar _profile = __webpack_require__(/*! ../actions/profile */ \"./src/actions/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.auth\"\n    * @desc Reducer for {@link module:actions.auth} actions.\n    *\n    * State segment managed by this reducer has the following structure:\n    * @param {Boolean} authenticating=true `true` if authentication is still in\n    *  progress; `false` if it has already completed or failed.\n    * @param {Object} profile=null Topcoder user profile.\n    * @param {String} tokenV2='' Topcoder v2 auth token.\n    * @param {String} tokenV3='' Topcoder v3 auth token.\n    * @param {Object} user=null Topcoder user object (user information stored in\n    *  v3 auth token).\n    */\n\n/**\n * Handles actions.auth.loadProfile action.\n * @param {Object} state\n * @param {Object} action\n */\nfunction onProfileLoaded(state, action) {\n  return (0, _extends3.default)({}, state, {\n    authenticating: false,\n    profile: action.payload\n  });\n}\n\n/**\n * Creates a new Auth reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @param {Object} mergeReducers Optional. Reducers to merge.\n * @return {Function} Auth reducer.\n */\nfunction create(initialState) {\n  var _redux$handleActions;\n\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, _auth2.default.auth.loadProfile, onProfileLoaded), (0, _defineProperty3.default)(_redux$handleActions, _auth2.default.auth.setTcTokenV2, function (state, action) {\n    return (0, _extends3.default)({}, state, {\n      tokenV2: action.payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _auth2.default.auth.setTcTokenV3, function (state, _ref) {\n    var payload = _ref.payload;\n    return (0, _extends3.default)({}, state, {\n      tokenV3: payload,\n      user: payload ? (0, _tcAccounts.decodeToken)(payload) : null\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, 'COMMUNITY_ACTIONS/TC_COMMUNITY/JOIN_DONE', function COMMUNITY_ACTIONSTC_COMMUNITYJOIN_DONE(state, _ref2) {\n    var payload = _ref2.payload;\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, {\n        groups: state.profile.groups.concat({ id: payload.groupId.toString() })\n      })\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _profile2.default.profile.uploadPhotoDone, function (state, _ref3) {\n    var payload = _ref3.payload,\n        error = _ref3.error;\n\n    if (error) {\n      return state;\n    }\n    if (!state.profile || state.profile.handle !== payload.handle) {\n      return state;\n    }\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, {\n        photoURL: payload.photoURL\n      })\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _profile2.default.profile.deletePhotoDone, function (state, _ref4) {\n    var payload = _ref4.payload,\n        error = _ref4.error;\n\n    if (error) {\n      return state;\n    }\n    if (!state.profile || state.profile.handle !== payload.handle) {\n      return state;\n    }\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, {\n        photoURL: null\n      })\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _profile2.default.profile.updateProfileDone, function (state, _ref5) {\n    var payload = _ref5.payload,\n        error = _ref5.error;\n\n    if (error) {\n      return state;\n    }\n    if (!state.profile || state.profile.handle !== payload.handle) {\n      return state;\n    }\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, payload)\n    });\n  }), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    authenticating: true,\n    profile: null,\n    tokenV2: '',\n    tokenV3: '',\n    user: null\n  }));\n}\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onProfileLoaded, 'onProfileLoaded', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/auth.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/auth.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/auth.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/auth.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/auth.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.factory = undefined;\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\n/**\n * Creates a new reducer.\n * @param {Object} options={} Optional. Options for customization of initial\n *  state.\n * @param {String} [options.auth.tokenV2=''] Optional. Topcoder v2 auth token.\n * @param {String} [options.auth.tokenV3=''] Optional. Topcoder v3 auth token.\n * @returns {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nvar factory = exports.factory = function () {\n  var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var state, a;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            state = {\n              tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n              tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n            };\n\n            if (!state.tokenV3) {\n              _context.next = 8;\n              break;\n            }\n\n            state.user = (0, _tcAccounts.decodeToken)(state.tokenV3);\n            a = _auth2.default.auth.loadProfile(state.tokenV3);\n            _context.next = 6;\n            return _topcoderReactUtils.redux.resolveAction(a);\n\n          case 6:\n            a = _context.sent;\n            return _context.abrupt('return', create(onProfileLoaded(state, a)));\n\n          case 8:\n            return _context.abrupt('return', create(state));\n\n          case 9:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function factory() {\n    return _ref6.apply(this, arguments);\n  };\n}();\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _auth = __webpack_require__(/*! ../actions/auth */ \"./src/actions/auth.js\");\n\nvar _auth2 = _interopRequireDefault(_auth);\n\nvar _profile = __webpack_require__(/*! ../actions/profile */ \"./src/actions/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.auth\"\n    * @desc Reducer for {@link module:actions.auth} actions.\n    *\n    * State segment managed by this reducer has the following structure:\n    * @param {Boolean} authenticating=true `true` if authentication is still in\n    *  progress; `false` if it has already completed or failed.\n    * @param {Object} profile=null Topcoder user profile.\n    * @param {String} tokenV2='' Topcoder v2 auth token.\n    * @param {String} tokenV3='' Topcoder v3 auth token.\n    * @param {Object} user=null Topcoder user object (user information stored in\n    *  v3 auth token).\n    */\n\n/**\n * Handles actions.auth.loadProfile action.\n * @param {Object} state\n * @param {Object} action\n */\nfunction onProfileLoaded(state, action) {\n  return (0, _extends3.default)({}, state, {\n    authenticating: false,\n    profile: action.payload\n  });\n}\n\n/**\n * Creates a new Auth reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @param {Object} mergeReducers Optional. Reducers to merge.\n * @return {Function} Auth reducer.\n */\nfunction create(initialState) {\n  var _redux$handleActions;\n\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, _auth2.default.auth.loadProfile, onProfileLoaded), (0, _defineProperty3.default)(_redux$handleActions, _auth2.default.auth.setTcTokenV2, function (state, action) {\n    return (0, _extends3.default)({}, state, {\n      tokenV2: action.payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _auth2.default.auth.setTcTokenV3, function (state, _ref) {\n    var payload = _ref.payload;\n    return (0, _extends3.default)({}, state, {\n      tokenV3: payload,\n      user: payload ? (0, _tcAccounts.decodeToken)(payload) : null\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, 'COMMUNITY_ACTIONS/TC_COMMUNITY/JOIN_DONE', function COMMUNITY_ACTIONSTC_COMMUNITYJOIN_DONE(state, _ref2) {\n    var payload = _ref2.payload;\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, {\n        groups: state.profile.groups.concat({ id: payload.groupId.toString() })\n      })\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _profile2.default.profile.uploadPhotoDone, function (state, _ref3) {\n    var payload = _ref3.payload,\n        error = _ref3.error;\n\n    if (error) {\n      return state;\n    }\n    if (!state.profile || state.profile.handle !== payload.handle) {\n      return state;\n    }\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, {\n        photoURL: payload.photoURL\n      })\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _profile2.default.profile.deletePhotoDone, function (state, _ref4) {\n    var payload = _ref4.payload,\n        error = _ref4.error;\n\n    if (error) {\n      return state;\n    }\n    if (!state.profile || state.profile.handle !== payload.handle) {\n      return state;\n    }\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, {\n        photoURL: null\n      })\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _profile2.default.profile.updateProfileDone, function (state, _ref5) {\n    var payload = _ref5.payload,\n        error = _ref5.error;\n\n    if (error) {\n      return state;\n    }\n    if (!state.profile || state.profile.handle !== payload.handle) {\n      return state;\n    }\n    return (0, _extends3.default)({}, state, {\n      profile: (0, _extends3.default)({}, state.profile, payload)\n    });\n  }), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    authenticating: true,\n    profile: null,\n    tokenV2: '',\n    tokenV3: '',\n    user: null\n  }));\n}\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onProfileLoaded, 'onProfileLoaded', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/auth.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/auth.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/auth.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/auth.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/auth.js?");
 
 /***/ }),
 
@@ -628,7 +628,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _challenge = __webpack_require__(/*! ../actions/challenge */ \"./src/actions/challenge.js\");\n\nvar _challenge2 = _interopRequireDefault(_challenge);\n\nvar _smp = __webpack_require__(/*! ../actions/smp */ \"./src/actions/smp.js\");\n\nvar _smp2 = _interopRequireDefault(_smp);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nvar _mySubmissionsManagement = __webpack_require__(/*! ./my-submissions-management */ \"./src/reducers/my-submissions-management.js\");\n\nvar _mySubmissionsManagement2 = _interopRequireDefault(_mySubmissionsManagement);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.challenge\"\n    * @desc Reducer for {@link module:actions.challenge} actions.\n    *\n    * State segment managed by this reducer has the following strcuture:\n    * @todo Document the structure.\n    */\n\n/**\n * Handles CHALLENGE/GET_DETAILS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state\n */\nfunction onGetDetailsInit(state, action) {\n  var challengeId = action.payload;\n  return state.details && _lodash2.default.toString(state.details.id) !== challengeId ? (0, _extends3.default)({}, state, {\n    fetchChallengeFailure: false,\n    loadingDetailsForChallengeId: challengeId,\n    details: null\n  }) : (0, _extends3.default)({}, state, {\n    fetchChallengeFailure: false,\n    loadingDetailsForChallengeId: challengeId\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_DETAILS_DONE action.\n * Note, that it silently discards received details if the ID of received\n * challenge mismatches the one stored in loadingDetailsForChallengeId field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetDetailsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get challenge details!', action.payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to load the challenge', 'Please, try again a bit later');\n    return (0, _extends3.default)({}, state, {\n      fetchChallengeFailure: action.error,\n      loadingDetailsForChallengeId: ''\n    });\n  }\n\n  var details = action.payload;\n  if (_lodash2.default.toString(details.id) !== state.loadingDetailsForChallengeId) {\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, {\n    details: details,\n    fetchChallengeFailure: false,\n    loadingDetailsForChallengeId: ''\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_SUBMISSION_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubmissionsInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionsForChallengeId: action.payload,\n    mySubmissions: { challengeId: '', v2: null }\n  });\n}\n\n/**\n * Handles challengeActions.fetchSubmissionsDone action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onGetSubmissionsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get user\\'s submissions for the challenge', action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingSubmissionsForChallengeId: '',\n      mySubmissions: { challengeId: '', v2: null }\n    });\n  }\n\n  var _action$payload = action.payload,\n      challengeId = _action$payload.challengeId,\n      submissions = _action$payload.submissions;\n\n  if (challengeId !== state.loadingSubmissionsForChallengeId) return state;\n\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionsForChallengeId: '',\n    mySubmissions: { challengeId: challengeId, v2: submissions }\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_MM_SUBMISSION_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetMMSubmissionsInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    loadingMMSubmissionsForChallengeId: action.payload,\n    mmSubmissions: []\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_MM_SUBMISSION_DONE action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onGetMMSubmissionsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get Marathon Match submissions for the challenge', action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingMMSubmissionsForChallengeId: '',\n      mmSubmissions: []\n    });\n  }\n\n  var _action$payload2 = action.payload,\n      challengeId = _action$payload2.challengeId,\n      submissions = _action$payload2.submissions;\n\n  if (challengeId.toString() !== state.loadingMMSubmissionsForChallengeId) return state;\n  return (0, _extends3.default)({}, state, {\n    loadingMMSubmissionsForChallengeId: '',\n    mmSubmissions: submissions\n  });\n}\n\n/**\n * Handles challengeActions.fetchCheckpointsDone action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onFetchCheckpointsDone(state, action) {\n  if (action.error) {\n    return (0, _extends3.default)({}, state, {\n      loadingCheckpoints: false\n    });\n  }\n  if (state.details && state.details.id === action.payload.challengeId) {\n    return (0, _extends3.default)({}, state, {\n      checkpoints: action.payload.checkpoints,\n      loadingCheckpoints: false\n    });\n  }\n  return state;\n}\n\n/**\n * Handles CHALLENGE/LOAD_RESULTS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onLoadResultsInit(state, _ref) {\n  var payload = _ref.payload;\n\n  return (0, _extends3.default)({}, state, { loadingResultsForChallengeId: payload });\n}\n\n/**\n * Handles CHALLENGE/LOAD_RESULTS_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onLoadResultsDone(state, action) {\n  if (action.payload.challengeId !== state.loadingResultsForChallengeId) {\n    return state;\n  }\n  if (action.error) {\n    _logger2.default.error(action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingResultsForChallengeId: '',\n      results: null,\n      resultsLoadedForChallengeId: ''\n    });\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingResultsForChallengeId: '',\n    results: action.payload.results,\n    resultsLoadedForChallengeId: action.payload.challengeId\n  });\n}\n\n/**\n * Handles CHALLENGE/REGISTER_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onRegisterDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to register for the challenge!', action.payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to register for the challenge!');\n    return (0, _extends3.default)({}, state, { registering: false });\n  }\n  /* As a part of registration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. Thus, we\n   * should also reuse corresponding reducer to generate proper state. */\n  return onGetDetailsDone((0, _extends3.default)({}, state, {\n    registering: false,\n    loadingDetailsForChallengeId: _lodash2.default.toString(state.details.id)\n  }), action);\n}\n\n/**\n * Handles CHALLENGE/UNREGISTER_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onUnregisterDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to register for the challenge!', action.payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to unregister for the challenge!');\n    return (0, _extends3.default)({}, state, { unregistering: false });\n  }\n  /* As a part of unregistration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. Thus, we\n   * should also reuse corresponding reducer to generate proper state. */\n  return onGetDetailsDone((0, _extends3.default)({}, state, {\n    unregistering: false,\n    loadingDetailsForChallengeId: _lodash2.default.toString(state.details.id)\n  }), action);\n}\n\n/**\n * Handles CHALLENGE/UPDATE_CHALLENGE_INIT.\n * @param {Object} state Old state.\n * @param {Object} actions Action.\n * @return {Object} New state.\n */\nfunction onUpdateChallengeInit(state, _ref2) {\n  var payload = _ref2.payload;\n\n  return (0, _extends3.default)({}, state, { updatingChallengeUuid: payload });\n}\n\n/**\n * Handles CHALLENGE/UPDATE_CHALLENGE_DONE.\n * @param {Object} state Old state.\n * @param {Object} actions Action.\n * @return {Object} New state.\n */\nfunction onUpdateChallengeDone(state, _ref3) {\n  var error = _ref3.error,\n      payload = _ref3.payload;\n\n  if (error) {\n    (0, _errors.fireErrorMessage)('Failed to save the challenge!', '');\n    _logger2.default.error('Failed to save the challenge', payload);\n    return state;\n  }\n  if (payload.uuid !== state.updatingChallengeUuid) return state;\n\n  /* Due to the normalization of challenge APIs responses done when a challenge\n   * is loaded, many pieces of our code expect different information in a format\n   * different from API v3 response, thus if we just save entire payload.res\n   * into the Redux state segment, it will break our app. As a rapid fix, let's\n   * just save only the data which are really supposed to be updated in the\n   * current use case (editing of challenge specs). */\n  var res = _lodash2.default.pick(payload.res, ['detailedRequirements', 'introduction', 'round1Introduction', 'round2Introduction', 'submissionGuidelines']);\n\n  return (0, _extends3.default)({}, state, {\n    details: (0, _extends3.default)({}, state.details, res),\n    updatingChallengeUuid: ''\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_ACTIVE_CHALLENGES_COUNT_DONE action.\n * @param {Object} state Old state.\n * @param {Object} action Action payload/error\n * @return {Object} New state\n */\nfunction onGetActiveChallengesCountDone(state, _ref4) {\n  var payload = _ref4.payload,\n      error = _ref4.error;\n\n  if (error) {\n    (0, _errors.fireErrorMessage)('Failed to get active challenges count!', '');\n    _logger2.default.error('Failed to get active challenges count', payload);\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, { activeChallengesCount: payload });\n}\n\n/**\n * Handles CHALLENGE/GET_SUBMISSION_INFORMATION_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubmissionInformationInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionInformationForSubmissionId: action.payload,\n    submissionInformation: null\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_SUBMISSION_INFORMATION_DONE action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onGetSubmissionInformationDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get submission information', action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingSubmissionInformationForSubmissionId: '',\n      submissionInformation: null\n    });\n  }\n\n  var _action$payload3 = action.payload,\n      submissionId = _action$payload3.submissionId,\n      submission = _action$payload3.submission;\n\n  if (submissionId !== state.loadingSubmissionInformationForSubmissionId) return state;\n\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionInformationForSubmissionId: '',\n    submissionInformation: submission\n  });\n}\n\n/**\n * Creates a new Challenge reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Challenge reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _challenge2.default.challenge;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.dropCheckpoints, function (state) {\n    return (0, _extends3.default)({}, state, { checkpoints: null });\n  }), (0, _defineProperty3.default)(_handleActions, a.dropResults, function (state) {\n    return (0, _extends3.default)({}, state, { results: null });\n  }), (0, _defineProperty3.default)(_handleActions, a.getDetailsInit, onGetDetailsInit), (0, _defineProperty3.default)(_handleActions, a.getDetailsDone, onGetDetailsDone), (0, _defineProperty3.default)(_handleActions, a.getSubmissionsInit, onGetSubmissionsInit), (0, _defineProperty3.default)(_handleActions, a.getSubmissionsDone, onGetSubmissionsDone), (0, _defineProperty3.default)(_handleActions, a.getMmSubmissionsInit, onGetMMSubmissionsInit), (0, _defineProperty3.default)(_handleActions, a.getMmSubmissionsDone, onGetMMSubmissionsDone), (0, _defineProperty3.default)(_handleActions, _smp2.default.smp.deleteSubmissionDone, function (state, _ref5) {\n    var payload = _ref5.payload;\n    return (0, _extends3.default)({}, state, {\n      mySubmissions: (0, _extends3.default)({}, state.mySubmissions, {\n        v2: state.mySubmissions.v2.filter(function (subm) {\n          return subm.submissionId !== payload;\n        })\n      })\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.registerInit, function (state) {\n    return (0, _extends3.default)({}, state, { registering: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.registerDone, onRegisterDone), (0, _defineProperty3.default)(_handleActions, a.unregisterInit, function (state) {\n    return (0, _extends3.default)({}, state, { unregistering: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.unregisterDone, onUnregisterDone), (0, _defineProperty3.default)(_handleActions, a.loadResultsInit, onLoadResultsInit), (0, _defineProperty3.default)(_handleActions, a.loadResultsDone, onLoadResultsDone), (0, _defineProperty3.default)(_handleActions, a.fetchCheckpointsInit, function (state) {\n    return (0, _extends3.default)({}, state, {\n      checkpoints: null,\n      loadingCheckpoints: true\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.fetchCheckpointsDone, onFetchCheckpointsDone), (0, _defineProperty3.default)(_handleActions, a.updateChallengeInit, onUpdateChallengeInit), (0, _defineProperty3.default)(_handleActions, a.updateChallengeDone, onUpdateChallengeDone), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesCountInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesCountDone, onGetActiveChallengesCountDone), (0, _defineProperty3.default)(_handleActions, a.getSubmissionInformationInit, onGetSubmissionInformationInit), (0, _defineProperty3.default)(_handleActions, a.getSubmissionInformationDone, onGetSubmissionInformationDone), _handleActions), _lodash2.default.defaults(initialState, {\n    details: null,\n    loadingCheckpoints: false,\n    loadingDetailsForChallengeId: '',\n    loadingResultsForChallengeId: '',\n    loadingMMSubmissionsForChallengeId: '',\n    loadingSubmissionInformationForSubmissionId: '',\n    mySubmissions: {},\n    checkpoints: null,\n    registering: false,\n    results: null,\n    resultsLoadedForChallengeId: '',\n    unregistering: false,\n    updatingChallengeUuid: '',\n    mmSubmissions: [],\n    submissionInformation: null\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n *\n * @param {Object} options={} Optional. Factory options.\n * @param {String} [options.auth.tokenV2=''] Optional. Topcoder v2 auth token.\n * @param {String} [options.auth.tokenV3=''] Optional. Topcoder v3 auth token.\n * @param {String} [options.challenge.challengeDetails.id=''] Optional. ID of\n *  the challenge to load details for.\n * @param {Boolean} [options.challenge.challengeDetails.mySubmission=false]\n *  Optional. The flag indicates whether load my submission.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  /* Server-side rendering of Submission Management Page. */\n\n  /* TODO: This shares some common logic with the next \"if\" block, which\n   * should be re-used there. */\n  /* TODO: For completely server-side rendering it is also necessary to load\n   * terms, etc. */\n\n  var tokens = {\n    tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n    tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n  };\n\n  var state = {};\n  var challengeId = _lodash2.default.get(options, 'challenge.challengeDetails.id');\n  var mySubmission = _lodash2.default.get(options, 'challenge.challengeDetails.mySubmission');\n\n  if (challengeId && !mySubmission) {\n    return _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.getDetailsDone(challengeId, tokens.tokenV3, tokens.tokenV2)).then(function (details) {\n      var track = _lodash2.default.get(details, 'payload.track', '').toLowerCase();\n      var checkpointsPromise = track === 'design' ? _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.fetchCheckpointsDone(tokens.tokenV2, challengeId)) : null;\n      var resultsPromise = _lodash2.default.get(details, 'payload.status', '') === 'COMPLETED' ? _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.loadResultsDone(tokens, challengeId, track)) : null;\n      return _promise2.default.all([details, checkpointsPromise, resultsPromise]);\n    }).then(function (_ref6) {\n      var _ref7 = (0, _slicedToArray3.default)(_ref6, 3),\n          details = _ref7[0],\n          checkpoints = _ref7[1],\n          results = _ref7[2];\n\n      state = (0, _extends3.default)({}, state, {\n        loadingCheckpoints: true,\n        loadingDetailsForChallengeId: challengeId,\n        loadingResultsForChallengeId: challengeId\n      });\n      state = onGetDetailsDone(state, details);\n      if (checkpoints) state = onFetchCheckpointsDone(state, checkpoints);\n      if (results) state = onLoadResultsDone(state, results);\n      return state;\n    }).then(function (res) {\n      return _topcoderReactUtils.redux.combineReducers(create(res), { mySubmissionsManagement: _mySubmissionsManagement2.default });\n    });\n  }\n\n  if (challengeId && mySubmission) {\n    return _promise2.default.all([_topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.getDetailsDone(challengeId, tokens.tokenV3, tokens.tokenV2)), _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.getSubmissionsDone(challengeId, tokens.tokenV2))]).then(function (_ref8) {\n      var _ref9 = (0, _slicedToArray3.default)(_ref8, 2),\n          challenge = _ref9[0],\n          submissions = _ref9[1];\n\n      state = (0, _extends3.default)({}, state, {\n        loadingSubmissionsForChallengeId: challengeId,\n        loadingDetailsForChallengeId: challengeId\n      });\n      state = onGetDetailsDone(state, challenge);\n      return onGetSubmissionsDone(state, submissions);\n    }).then(function (res) {\n      return _topcoderReactUtils.redux.combineReducers(create(res), { mySubmissionsManagement: _mySubmissionsManagement2.default });\n    });\n  }\n\n  /* Otherwise this part of Redux state is initialized empty. */\n  return _promise2.default.resolve(_topcoderReactUtils.redux.combineReducers(create(state), { mySubmissionsManagement: _mySubmissionsManagement2.default }));\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default intial state.\n */\n\nvar _default = _topcoderReactUtils.redux.combineReducers(create(), { mySubmissionsManagement: _mySubmissionsManagement2.default });\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetDetailsInit, 'onGetDetailsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetDetailsDone, 'onGetDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionsInit, 'onGetSubmissionsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionsDone, 'onGetSubmissionsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetMMSubmissionsInit, 'onGetMMSubmissionsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetMMSubmissionsDone, 'onGetMMSubmissionsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onFetchCheckpointsDone, 'onFetchCheckpointsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onLoadResultsInit, 'onLoadResultsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onLoadResultsDone, 'onLoadResultsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onRegisterDone, 'onRegisterDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onUnregisterDone, 'onUnregisterDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onUpdateChallengeInit, 'onUpdateChallengeInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onUpdateChallengeDone, 'onUpdateChallengeDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetActiveChallengesCountDone, 'onGetActiveChallengesCountDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionInformationInit, 'onGetSubmissionInformationInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionInformationDone, 'onGetSubmissionInformationDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/challenge.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/challenge.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _challenge = __webpack_require__(/*! ../actions/challenge */ \"./src/actions/challenge.js\");\n\nvar _challenge2 = _interopRequireDefault(_challenge);\n\nvar _smp = __webpack_require__(/*! ../actions/smp */ \"./src/actions/smp.js\");\n\nvar _smp2 = _interopRequireDefault(_smp);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nvar _mySubmissionsManagement = __webpack_require__(/*! ./my-submissions-management */ \"./src/reducers/my-submissions-management.js\");\n\nvar _mySubmissionsManagement2 = _interopRequireDefault(_mySubmissionsManagement);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.challenge\"\n    * @desc Reducer for {@link module:actions.challenge} actions.\n    *\n    * State segment managed by this reducer has the following strcuture:\n    * @todo Document the structure.\n    */\n\n/**\n * Handles CHALLENGE/GET_DETAILS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state\n */\nfunction onGetDetailsInit(state, action) {\n  var challengeId = action.payload;\n  return state.details && _lodash2.default.toString(state.details.id) !== challengeId ? (0, _extends3.default)({}, state, {\n    fetchChallengeFailure: false,\n    loadingDetailsForChallengeId: challengeId,\n    details: null\n  }) : (0, _extends3.default)({}, state, {\n    fetchChallengeFailure: false,\n    loadingDetailsForChallengeId: challengeId\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_DETAILS_DONE action.\n * Note, that it silently discards received details if the ID of received\n * challenge mismatches the one stored in loadingDetailsForChallengeId field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetDetailsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get challenge details!', action.payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to load the challenge', 'Please, try again a bit later');\n    return (0, _extends3.default)({}, state, {\n      fetchChallengeFailure: action.error,\n      loadingDetailsForChallengeId: ''\n    });\n  }\n\n  var details = action.payload;\n  if (_lodash2.default.toString(details.id) !== state.loadingDetailsForChallengeId) {\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, {\n    details: details,\n    fetchChallengeFailure: false,\n    loadingDetailsForChallengeId: ''\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_SUBMISSION_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubmissionsInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionsForChallengeId: action.payload,\n    mySubmissions: { challengeId: '', v2: null }\n  });\n}\n\n/**\n * Handles challengeActions.fetchSubmissionsDone action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onGetSubmissionsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get user\\'s submissions for the challenge', action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingSubmissionsForChallengeId: '',\n      mySubmissions: { challengeId: '', v2: null }\n    });\n  }\n\n  var _action$payload = action.payload,\n      challengeId = _action$payload.challengeId,\n      submissions = _action$payload.submissions;\n\n  if (challengeId !== state.loadingSubmissionsForChallengeId) return state;\n\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionsForChallengeId: '',\n    mySubmissions: { challengeId: challengeId, v2: submissions }\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_MM_SUBMISSION_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetMMSubmissionsInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    loadingMMSubmissionsForChallengeId: action.payload,\n    mmSubmissions: []\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_MM_SUBMISSION_DONE action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onGetMMSubmissionsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get Marathon Match submissions for the challenge', action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingMMSubmissionsForChallengeId: '',\n      mmSubmissions: []\n    });\n  }\n\n  var _action$payload2 = action.payload,\n      challengeId = _action$payload2.challengeId,\n      submissions = _action$payload2.submissions;\n\n  if (challengeId.toString() !== state.loadingMMSubmissionsForChallengeId) return state;\n  return (0, _extends3.default)({}, state, {\n    loadingMMSubmissionsForChallengeId: '',\n    mmSubmissions: submissions\n  });\n}\n\n/**\n * Handles challengeActions.fetchCheckpointsDone action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onFetchCheckpointsDone(state, action) {\n  if (action.error) {\n    return (0, _extends3.default)({}, state, {\n      loadingCheckpoints: false\n    });\n  }\n  if (state.details && state.details.id === action.payload.challengeId) {\n    return (0, _extends3.default)({}, state, {\n      checkpoints: action.payload.checkpoints,\n      loadingCheckpoints: false\n    });\n  }\n  return state;\n}\n\n/**\n * Handles CHALLENGE/LOAD_RESULTS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onLoadResultsInit(state, _ref) {\n  var payload = _ref.payload;\n\n  return (0, _extends3.default)({}, state, { loadingResultsForChallengeId: payload });\n}\n\n/**\n * Handles CHALLENGE/LOAD_RESULTS_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onLoadResultsDone(state, action) {\n  if (action.payload.challengeId !== state.loadingResultsForChallengeId) {\n    return state;\n  }\n  if (action.error) {\n    _logger2.default.error(action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingResultsForChallengeId: '',\n      results: null,\n      resultsLoadedForChallengeId: ''\n    });\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingResultsForChallengeId: '',\n    results: action.payload.results,\n    resultsLoadedForChallengeId: action.payload.challengeId\n  });\n}\n\n/**\n * Handles CHALLENGE/REGISTER_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onRegisterDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to register for the challenge!', action.payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to register for the challenge!');\n    return (0, _extends3.default)({}, state, { registering: false });\n  }\n  /* As a part of registration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. Thus, we\n   * should also reuse corresponding reducer to generate proper state. */\n  return onGetDetailsDone((0, _extends3.default)({}, state, {\n    registering: false,\n    loadingDetailsForChallengeId: _lodash2.default.toString(state.details.id)\n  }), action);\n}\n\n/**\n * Handles CHALLENGE/UNREGISTER_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object}\n */\nfunction onUnregisterDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to register for the challenge!', action.payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to unregister for the challenge!');\n    return (0, _extends3.default)({}, state, { unregistering: false });\n  }\n  /* As a part of unregistration flow we silently update challenge details,\n   * reusing for this purpose the corresponding action handler. Thus, we\n   * should also reuse corresponding reducer to generate proper state. */\n  return onGetDetailsDone((0, _extends3.default)({}, state, {\n    unregistering: false,\n    loadingDetailsForChallengeId: _lodash2.default.toString(state.details.id)\n  }), action);\n}\n\n/**\n * Handles CHALLENGE/UPDATE_CHALLENGE_INIT.\n * @param {Object} state Old state.\n * @param {Object} actions Action.\n * @return {Object} New state.\n */\nfunction onUpdateChallengeInit(state, _ref2) {\n  var payload = _ref2.payload;\n\n  return (0, _extends3.default)({}, state, { updatingChallengeUuid: payload });\n}\n\n/**\n * Handles CHALLENGE/UPDATE_CHALLENGE_DONE.\n * @param {Object} state Old state.\n * @param {Object} actions Action.\n * @return {Object} New state.\n */\nfunction onUpdateChallengeDone(state, _ref3) {\n  var error = _ref3.error,\n      payload = _ref3.payload;\n\n  if (error) {\n    (0, _errors.fireErrorMessage)('Failed to save the challenge!', '');\n    _logger2.default.error('Failed to save the challenge', payload);\n    return state;\n  }\n  if (payload.uuid !== state.updatingChallengeUuid) return state;\n\n  /* Due to the normalization of challenge APIs responses done when a challenge\n   * is loaded, many pieces of our code expect different information in a format\n   * different from API v3 response, thus if we just save entire payload.res\n   * into the Redux state segment, it will break our app. As a rapid fix, let's\n   * just save only the data which are really supposed to be updated in the\n   * current use case (editing of challenge specs). */\n  var res = _lodash2.default.pick(payload.res, ['detailedRequirements', 'introduction', 'round1Introduction', 'round2Introduction', 'submissionGuidelines']);\n\n  return (0, _extends3.default)({}, state, {\n    details: (0, _extends3.default)({}, state.details, res),\n    updatingChallengeUuid: ''\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_ACTIVE_CHALLENGES_COUNT_DONE action.\n * @param {Object} state Old state.\n * @param {Object} action Action payload/error\n * @return {Object} New state\n */\nfunction onGetActiveChallengesCountDone(state, _ref4) {\n  var payload = _ref4.payload,\n      error = _ref4.error;\n\n  if (error) {\n    (0, _errors.fireErrorMessage)('Failed to get active challenges count!', '');\n    _logger2.default.error('Failed to get active challenges count', payload);\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, { activeChallengesCount: payload });\n}\n\n/**\n * Handles CHALLENGE/GET_SUBMISSION_INFORMATION_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubmissionInformationInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionInformationForChallengeId: action.payload.challengeId,\n    loadingSubmissionInformationForSubmissionId: action.payload.submissionId,\n    submissionInformation: null\n  });\n}\n\n/**\n * Handles CHALLENGE/GET_SUBMISSION_INFORMATION_DONE action.\n * @param {Object} state Previous state.\n * @param {Object} action Action.\n */\nfunction onGetSubmissionInformationDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get submission information', action.payload);\n    return (0, _extends3.default)({}, state, {\n      loadingSubmissionInformationForSubmissionId: '',\n      submissionInformation: null\n    });\n  }\n\n  var _action$payload3 = action.payload,\n      submissionId = _action$payload3.submissionId,\n      submission = _action$payload3.submission;\n\n  if (submissionId !== state.loadingSubmissionInformationForSubmissionId) return state;\n\n  return (0, _extends3.default)({}, state, {\n    loadingSubmissionInformationForSubmissionId: '',\n    submissionInformation: submission\n  });\n}\n\n/**\n * Creates a new Challenge reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Challenge reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _challenge2.default.challenge;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.dropCheckpoints, function (state) {\n    return (0, _extends3.default)({}, state, { checkpoints: null });\n  }), (0, _defineProperty3.default)(_handleActions, a.dropResults, function (state) {\n    return (0, _extends3.default)({}, state, { results: null });\n  }), (0, _defineProperty3.default)(_handleActions, a.getDetailsInit, onGetDetailsInit), (0, _defineProperty3.default)(_handleActions, a.getDetailsDone, onGetDetailsDone), (0, _defineProperty3.default)(_handleActions, a.getSubmissionsInit, onGetSubmissionsInit), (0, _defineProperty3.default)(_handleActions, a.getSubmissionsDone, onGetSubmissionsDone), (0, _defineProperty3.default)(_handleActions, a.getMmSubmissionsInit, onGetMMSubmissionsInit), (0, _defineProperty3.default)(_handleActions, a.getMmSubmissionsDone, onGetMMSubmissionsDone), (0, _defineProperty3.default)(_handleActions, _smp2.default.smp.deleteSubmissionDone, function (state, _ref5) {\n    var payload = _ref5.payload;\n    return (0, _extends3.default)({}, state, {\n      mySubmissions: (0, _extends3.default)({}, state.mySubmissions, {\n        v2: state.mySubmissions.v2.filter(function (subm) {\n          return subm.submissionId !== payload;\n        })\n      })\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.registerInit, function (state) {\n    return (0, _extends3.default)({}, state, { registering: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.registerDone, onRegisterDone), (0, _defineProperty3.default)(_handleActions, a.unregisterInit, function (state) {\n    return (0, _extends3.default)({}, state, { unregistering: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.unregisterDone, onUnregisterDone), (0, _defineProperty3.default)(_handleActions, a.loadResultsInit, onLoadResultsInit), (0, _defineProperty3.default)(_handleActions, a.loadResultsDone, onLoadResultsDone), (0, _defineProperty3.default)(_handleActions, a.fetchCheckpointsInit, function (state) {\n    return (0, _extends3.default)({}, state, {\n      checkpoints: null,\n      loadingCheckpoints: true\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.fetchCheckpointsDone, onFetchCheckpointsDone), (0, _defineProperty3.default)(_handleActions, a.updateChallengeInit, onUpdateChallengeInit), (0, _defineProperty3.default)(_handleActions, a.updateChallengeDone, onUpdateChallengeDone), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesCountInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesCountDone, onGetActiveChallengesCountDone), (0, _defineProperty3.default)(_handleActions, a.getSubmissionInformationInit, onGetSubmissionInformationInit), (0, _defineProperty3.default)(_handleActions, a.getSubmissionInformationDone, onGetSubmissionInformationDone), _handleActions), _lodash2.default.defaults(initialState, {\n    details: null,\n    loadingCheckpoints: false,\n    loadingDetailsForChallengeId: '',\n    loadingResultsForChallengeId: '',\n    loadingMMSubmissionsForChallengeId: '',\n    loadingSubmissionInformationForSubmissionId: '',\n    mySubmissions: {},\n    checkpoints: null,\n    registering: false,\n    results: null,\n    resultsLoadedForChallengeId: '',\n    unregistering: false,\n    updatingChallengeUuid: '',\n    mmSubmissions: [],\n    submissionInformation: null\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n *\n * @param {Object} options={} Optional. Factory options.\n * @param {String} [options.auth.tokenV2=''] Optional. Topcoder v2 auth token.\n * @param {String} [options.auth.tokenV3=''] Optional. Topcoder v3 auth token.\n * @param {String} [options.challenge.challengeDetails.id=''] Optional. ID of\n *  the challenge to load details for.\n * @param {Boolean} [options.challenge.challengeDetails.mySubmission=false]\n *  Optional. The flag indicates whether load my submission.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  /* Server-side rendering of Submission Management Page. */\n\n  /* TODO: This shares some common logic with the next \"if\" block, which\n   * should be re-used there. */\n  /* TODO: For completely server-side rendering it is also necessary to load\n   * terms, etc. */\n\n  var tokens = {\n    tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n    tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n  };\n\n  var state = {};\n  var challengeId = _lodash2.default.get(options, 'challenge.challengeDetails.id');\n  var mySubmission = _lodash2.default.get(options, 'challenge.challengeDetails.mySubmission');\n\n  if (challengeId && !mySubmission) {\n    return _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.getDetailsDone(challengeId, tokens.tokenV3, tokens.tokenV2)).then(function (details) {\n      var track = _lodash2.default.get(details, 'payload.track', '').toLowerCase();\n      var checkpointsPromise = track === 'design' ? _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.fetchCheckpointsDone(tokens.tokenV2, challengeId)) : null;\n      var resultsPromise = _lodash2.default.get(details, 'payload.status', '') === 'COMPLETED' ? _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.loadResultsDone(tokens, challengeId, track)) : null;\n      return _promise2.default.all([details, checkpointsPromise, resultsPromise]);\n    }).then(function (_ref6) {\n      var _ref7 = (0, _slicedToArray3.default)(_ref6, 3),\n          details = _ref7[0],\n          checkpoints = _ref7[1],\n          results = _ref7[2];\n\n      state = (0, _extends3.default)({}, state, {\n        loadingCheckpoints: true,\n        loadingDetailsForChallengeId: challengeId,\n        loadingResultsForChallengeId: challengeId\n      });\n      state = onGetDetailsDone(state, details);\n      if (checkpoints) state = onFetchCheckpointsDone(state, checkpoints);\n      if (results) state = onLoadResultsDone(state, results);\n      return state;\n    }).then(function (res) {\n      return _topcoderReactUtils.redux.combineReducers(create(res), { mySubmissionsManagement: _mySubmissionsManagement2.default });\n    });\n  }\n\n  if (challengeId && mySubmission) {\n    return _promise2.default.all([_topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.getDetailsDone(challengeId, tokens.tokenV3, tokens.tokenV2)), _topcoderReactUtils.redux.resolveAction(_challenge2.default.challenge.getSubmissionsDone(challengeId, tokens.tokenV2))]).then(function (_ref8) {\n      var _ref9 = (0, _slicedToArray3.default)(_ref8, 2),\n          challenge = _ref9[0],\n          submissions = _ref9[1];\n\n      state = (0, _extends3.default)({}, state, {\n        loadingSubmissionsForChallengeId: challengeId,\n        loadingDetailsForChallengeId: challengeId\n      });\n      state = onGetDetailsDone(state, challenge);\n      return onGetSubmissionsDone(state, submissions);\n    }).then(function (res) {\n      return _topcoderReactUtils.redux.combineReducers(create(res), { mySubmissionsManagement: _mySubmissionsManagement2.default });\n    });\n  }\n\n  /* Otherwise this part of Redux state is initialized empty. */\n  return _promise2.default.resolve(_topcoderReactUtils.redux.combineReducers(create(state), { mySubmissionsManagement: _mySubmissionsManagement2.default }));\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default intial state.\n */\n\nvar _default = _topcoderReactUtils.redux.combineReducers(create(), { mySubmissionsManagement: _mySubmissionsManagement2.default });\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetDetailsInit, 'onGetDetailsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetDetailsDone, 'onGetDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionsInit, 'onGetSubmissionsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionsDone, 'onGetSubmissionsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetMMSubmissionsInit, 'onGetMMSubmissionsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetMMSubmissionsDone, 'onGetMMSubmissionsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onFetchCheckpointsDone, 'onFetchCheckpointsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onLoadResultsInit, 'onLoadResultsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onLoadResultsDone, 'onLoadResultsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onRegisterDone, 'onRegisterDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onUnregisterDone, 'onUnregisterDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onUpdateChallengeInit, 'onUpdateChallengeInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onUpdateChallengeDone, 'onUpdateChallengeDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetActiveChallengesCountDone, 'onGetActiveChallengesCountDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionInformationInit, 'onGetSubmissionInformationInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(onGetSubmissionInformationDone, 'onGetSubmissionInformationDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/challenge.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/challenge.js?");
 
 /***/ }),
 
@@ -640,7 +640,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _direct = __webpack_require__(/*! ../actions/direct */ \"./src/actions/direct.js\");\n\nvar _direct2 = _interopRequireDefault(_direct);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.direct\"\n    * @desc Reducer for handling the results of Direct-related actions.\n    * @todo Document state segment structure.\n    */\n\nvar ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN = 'Cannot get user projects without auth token';\n\n/**\n * Drops out all data and cancels any ongoing data loading related to this\n * reducer.\n * @param {Object} state\n * @return {Object} New state.\n */\nfunction onDropAll(state) {\n  return (0, _extends3.default)({}, state, {\n    loadingProjectDetailsForId: 0,\n    loadingProjectsForUsername: '',\n    projectDetails: {},\n    projects: []\n  });\n}\n\n/**\n * Inits loading of the specified project, cancelling the ongoing loading of\n * project details, if any.\n * @param {Object} state\n * @param {Object} action Its payload is the projectId.\n * @return {Object} New state.\n */\nfunction onGetProjectDetailsInit(state, _ref) {\n  var payload = _ref.payload;\n\n  return (0, _extends3.default)({}, state, {\n    loadingProjectDetailsForId: payload\n  });\n}\n\n/**\n * Stores loaded project details to the state.\n * @param {Object} state\n * @param {Object} action Its payload is the project details object.\n * @return {Object} New state.\n */\nfunction onGetProjectDetailsDone(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to load project details', payload);\n    throw payload;\n  }\n  if (payload.project.projectId !== state.loadingProjectDetailsForId) {\n    return state;\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingProjectDetailsForId: 0,\n    projectDetails: payload\n  });\n}\n\n/**\n * Handler for the GET_PROJECT_PERMISSIONS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetProjectPermissionsInit(state, _ref3) {\n  var payload = _ref3.payload;\n\n  var projectPermissions = (0, _extends3.default)({}, state.projectPermissions, {\n    loadingForProjectId: payload\n  });\n  return (0, _extends3.default)({}, state, { projectPermissions: projectPermissions });\n}\n\n/**\n * Handler for the GET_PROJECT_PERMISSIONS_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetProjectPermissionsDone(state, _ref4) {\n  var error = _ref4.error,\n      payload = _ref4.payload;\n\n  if (error) {\n    (0, _errors.fireErrorMessage)('Failed to load project permissions', '');\n    _logger2.default.error('Failed to load project permissions', payload);\n  }\n  var permissions = payload.permissions,\n      projectId = payload.projectId;\n\n  if (projectId !== state.projectPermissions.loadingForProjectId) return state;\n  var projectPermissions = {\n    loadingForProjectId: 0,\n    permissions: permissions,\n    projectId: projectId,\n    timestamp: Date.now()\n  };\n  return (0, _extends3.default)({}, state, { projectPermissions: projectPermissions });\n}\n\n/**\n * Handles initialization of projects loading.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserProjectsInit(state, _ref5) {\n  var tokenV3 = _ref5.payload;\n\n  if (!tokenV3) {\n    _logger2.default.error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n    throw new Error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingProjectsForUsername: (0, _tcAccounts.decodeToken)(tokenV3).handle\n  });\n}\n\n/**\n * Handles the result of projects loading.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserProjectsDone(state, _ref6) {\n  var error = _ref6.error,\n      payload = _ref6.payload;\n\n  if (error) {\n    _logger2.default.error(payload);\n    throw payload;\n  }\n  var projects = payload.projects,\n      tokenV3 = payload.tokenV3;\n\n  if (!tokenV3) {\n    _logger2.default.error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n    throw new Error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n  }\n  if ((0, _tcAccounts.decodeToken)(tokenV3).handle !== state.loadingProjectsForUsername) {\n    return state;\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingProjectsForUsername: '',\n    projects: projects.sort(function (a, b) {\n      return a.name.localeCompare(b.name);\n    })\n  });\n}\n\n/**\n * Creates a new Direct reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @param {Object} mergeReducers Optional. Reducers to merge.\n * @return {Function} Direct reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _direct2.default.direct;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.dropAll, onDropAll), (0, _defineProperty3.default)(_handleActions, a.getProjectDetailsInit, onGetProjectDetailsInit), (0, _defineProperty3.default)(_handleActions, a.getProjectDetailsDone, onGetProjectDetailsDone), (0, _defineProperty3.default)(_handleActions, a.getProjectPermissionsInit, onGetProjectPermissionsInit), (0, _defineProperty3.default)(_handleActions, a.getProjectPermissionsDone, onGetProjectPermissionsDone), (0, _defineProperty3.default)(_handleActions, a.getUserProjectsInit, onGetUserProjectsInit), (0, _defineProperty3.default)(_handleActions, a.getUserProjectsDone, onGetUserProjectsDone), _handleActions), _lodash2.default.defaults(initialState, {\n    /* If we are loading details of some project, this field holds the project\n     * ID; zero otherwise. */\n    loadingProjectDetailsForId: 0,\n\n    /* Holds username of the user which projects are being loaded; empty\n     * string if nothing is being loaded at the moment. */\n    loadingProjectsForUsername: '',\n\n    /* Holds details of some project, or an empty object. */\n    projectDetails: {},\n\n    projectPermissions: {\n      loadingForProjectId: 0,\n      permissions: [],\n      projectId: 0,\n      timestamp: 0\n    },\n\n    /* Holds the array of loaded projects. */\n    projects: []\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN, 'ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onDropAll, 'onDropAll', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectDetailsInit, 'onGetProjectDetailsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectDetailsDone, 'onGetProjectDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectPermissionsInit, 'onGetProjectPermissionsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectPermissionsDone, 'onGetProjectPermissionsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetUserProjectsInit, 'onGetUserProjectsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetUserProjectsDone, 'onGetUserProjectsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/direct.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/direct.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _direct = __webpack_require__(/*! ../actions/direct */ \"./src/actions/direct.js\");\n\nvar _direct2 = _interopRequireDefault(_direct);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.direct\"\n    * @desc Reducer for handling the results of Direct-related actions.\n    * @todo Document state segment structure.\n    */\n\nvar ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN = 'Cannot get user projects without auth token';\n\n/**\n * Drops out all data and cancels any ongoing data loading related to this\n * reducer.\n * @param {Object} state\n * @return {Object} New state.\n */\nfunction onDropAll(state) {\n  return (0, _extends3.default)({}, state, {\n    loadingProjectDetailsForId: 0,\n    loadingProjectsForUsername: '',\n    projectDetails: {},\n    projects: []\n  });\n}\n\n/**\n * Inits loading of the specified project, cancelling the ongoing loading of\n * project details, if any.\n * @param {Object} state\n * @param {Object} action Its payload is the projectId.\n * @return {Object} New state.\n */\nfunction onGetProjectDetailsInit(state, _ref) {\n  var payload = _ref.payload;\n\n  return (0, _extends3.default)({}, state, {\n    loadingProjectDetailsForId: payload\n  });\n}\n\n/**\n * Stores loaded project details to the state.\n * @param {Object} state\n * @param {Object} action Its payload is the project details object.\n * @return {Object} New state.\n */\nfunction onGetProjectDetailsDone(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to load project details', payload);\n    throw payload;\n  }\n  if (payload.project.projectId !== state.loadingProjectDetailsForId) {\n    return state;\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingProjectDetailsForId: 0,\n    projectDetails: payload\n  });\n}\n\n/**\n * Handler for the GET_PROJECT_PERMISSIONS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetProjectPermissionsInit(state, _ref3) {\n  var payload = _ref3.payload;\n\n  var projectPermissions = (0, _extends3.default)({}, state.projectPermissions, {\n    loadingForProjectId: payload\n  });\n  return (0, _extends3.default)({}, state, { projectPermissions: projectPermissions });\n}\n\n/**\n * Handler for the GET_PROJECT_PERMISSIONS_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetProjectPermissionsDone(state, _ref4) {\n  var error = _ref4.error,\n      payload = _ref4.payload;\n\n  if (error) {\n    (0, _errors.fireErrorMessage)('Failed to load project permissions', '');\n    _logger2.default.error('Failed to load project permissions', payload);\n  }\n  var permissions = payload.permissions,\n      projectId = payload.projectId;\n\n  if (projectId !== state.projectPermissions.loadingForProjectId) return state;\n  var projectPermissions = {\n    loadingForProjectId: 0,\n    permissions: permissions,\n    projectId: projectId,\n    timestamp: Date.now()\n  };\n  return (0, _extends3.default)({}, state, { projectPermissions: projectPermissions });\n}\n\n/**\n * Handles initialization of projects loading.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserProjectsInit(state, _ref5) {\n  var tokenV3 = _ref5.payload;\n\n  if (!tokenV3) {\n    _logger2.default.error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n    throw new Error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingProjectsForUsername: (0, _tcAccounts.decodeToken)(tokenV3).handle\n  });\n}\n\n/**\n * Handles the result of projects loading.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserProjectsDone(state, _ref6) {\n  var error = _ref6.error,\n      payload = _ref6.payload;\n\n  if (error) {\n    _logger2.default.error(payload);\n    throw payload;\n  }\n  var projects = payload.projects,\n      tokenV3 = payload.tokenV3;\n\n  if (!tokenV3) {\n    _logger2.default.error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n    throw new Error(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN);\n  }\n  if ((0, _tcAccounts.decodeToken)(tokenV3).handle !== state.loadingProjectsForUsername) {\n    return state;\n  }\n  return (0, _extends3.default)({}, state, {\n    loadingProjectsForUsername: '',\n    projects: projects.sort(function (a, b) {\n      return a.name.localeCompare(b.name);\n    })\n  });\n}\n\n/**\n * Creates a new Direct reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @param {Object} mergeReducers Optional. Reducers to merge.\n * @return {Function} Direct reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _direct2.default.direct;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.dropAll, onDropAll), (0, _defineProperty3.default)(_handleActions, a.getProjectDetailsInit, onGetProjectDetailsInit), (0, _defineProperty3.default)(_handleActions, a.getProjectDetailsDone, onGetProjectDetailsDone), (0, _defineProperty3.default)(_handleActions, a.getProjectPermissionsInit, onGetProjectPermissionsInit), (0, _defineProperty3.default)(_handleActions, a.getProjectPermissionsDone, onGetProjectPermissionsDone), (0, _defineProperty3.default)(_handleActions, a.getUserProjectsInit, onGetUserProjectsInit), (0, _defineProperty3.default)(_handleActions, a.getUserProjectsDone, onGetUserProjectsDone), _handleActions), _lodash2.default.defaults(initialState, {\n    /* If we are loading details of some project, this field holds the project\n     * ID; zero otherwise. */\n    loadingProjectDetailsForId: 0,\n\n    /* Holds username of the user which projects are being loaded; empty\n     * string if nothing is being loaded at the moment. */\n    loadingProjectsForUsername: '',\n\n    /* Holds details of some project, or an empty object. */\n    projectDetails: {},\n\n    projectPermissions: {\n      loadingForProjectId: 0,\n      permissions: [],\n      projectId: 0,\n      timestamp: 0\n    },\n\n    /* Holds the array of loaded projects. */\n    projects: []\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN, 'ERROR_MSG_GET_USER_PROJECTS_WITHOUT_AUTH_TOKEN', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onDropAll, 'onDropAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectDetailsInit, 'onGetProjectDetailsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectDetailsDone, 'onGetProjectDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectPermissionsInit, 'onGetProjectPermissionsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetProjectPermissionsDone, 'onGetProjectPermissionsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetUserProjectsInit, 'onGetUserProjectsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(onGetUserProjectsDone, 'onGetUserProjectsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/direct.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/direct.js?");
 
 /***/ }),
 
@@ -652,7 +652,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _extends4 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends5 = _interopRequireDefault(_extends4);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _initialErrorIconStat;\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _errors = __webpack_require__(/*! ../actions/errors */ \"./src/actions/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nvar _errors3 = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.errors\"\n    * @desc Redux Reducer for application-wide error handling.\n    *\n    * Description:\n    *   Implements state reducers for application-wide error handling.\n    * @todo Document state segment structure.\n    */\n\n\nvar initialErrorIconState = (_initialErrorIconStat = {}, (0, _defineProperty3.default)(_initialErrorIconStat, _errors3.ERROR_ICON_TYPES.NETWORK, []), (0, _defineProperty3.default)(_initialErrorIconStat, _errors3.ERROR_ICON_TYPES.API, []), _initialErrorIconStat);\n\n/**\n * Creates a new Errors reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @param {Object} mergeReducers Optional. Reducers to merge.\n * @return {Function} Errors reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _errors2.default.errors;\n\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.clearError, function (state) {\n    return (0, _extends5.default)({}, state, { alerts: state.alerts.slice(1) });\n  }), (0, _defineProperty3.default)(_handleActions, a.newError, function (state, _ref) {\n    var payload = _ref.payload;\n    return (0, _extends5.default)({}, state, {\n      alerts: [].concat((0, _toConsumableArray3.default)(state.alerts), [{ title: payload.title, details: payload.details }])\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.clearAllErrorIcons, function (state) {\n    return (0, _extends5.default)({}, state, {\n      icons: initialErrorIconState\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.setErrorIcon, function (state, _ref2) {\n    var _ref2$payload = _ref2.payload,\n        id = _ref2$payload.id,\n        title = _ref2$payload.title,\n        message = _ref2$payload.message;\n    return (0, _extends5.default)({}, state, {\n      icons: (0, _extends5.default)({}, state.icons, (0, _defineProperty3.default)({}, id, [].concat((0, _toConsumableArray3.default)(state.icons[id]), [{ title: title, message: message }])))\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.clearErrorIcon, function (state, _ref3) {\n    var id = _ref3.payload.id;\n    return (0, _extends5.default)({}, state, {\n      icons: (0, _extends5.default)({}, state.icons, (0, _defineProperty3.default)({}, id, []))\n    });\n  }), _handleActions), _lodash2.default.defaults(initialState, { alerts: [], icons: initialErrorIconState }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(initialErrorIconState, 'initialErrorIconState', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/errors.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/errors.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/errors.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/errors.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/errors.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _extends4 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends5 = _interopRequireDefault(_extends4);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _initialErrorIconStat;\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _errors = __webpack_require__(/*! ../actions/errors */ \"./src/actions/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nvar _errors3 = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.errors\"\n    * @desc Redux Reducer for application-wide error handling.\n    *\n    * Description:\n    *   Implements state reducers for application-wide error handling.\n    * @todo Document state segment structure.\n    */\n\n\nvar initialErrorIconState = (_initialErrorIconStat = {}, (0, _defineProperty3.default)(_initialErrorIconStat, _errors3.ERROR_ICON_TYPES.NETWORK, []), (0, _defineProperty3.default)(_initialErrorIconStat, _errors3.ERROR_ICON_TYPES.API, []), _initialErrorIconStat);\n\n/**\n * Creates a new Errors reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @param {Object} mergeReducers Optional. Reducers to merge.\n * @return {Function} Errors reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _errors2.default.errors;\n\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.clearError, function (state) {\n    return (0, _extends5.default)({}, state, { alerts: state.alerts.slice(1) });\n  }), (0, _defineProperty3.default)(_handleActions, a.newError, function (state, _ref) {\n    var payload = _ref.payload;\n    return (0, _extends5.default)({}, state, {\n      alerts: [].concat((0, _toConsumableArray3.default)(state.alerts), [{ title: payload.title, details: payload.details }])\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.clearAllErrorIcons, function (state) {\n    return (0, _extends5.default)({}, state, {\n      icons: initialErrorIconState\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.setErrorIcon, function (state, _ref2) {\n    var _ref2$payload = _ref2.payload,\n        id = _ref2$payload.id,\n        title = _ref2$payload.title,\n        message = _ref2$payload.message;\n    return (0, _extends5.default)({}, state, {\n      icons: (0, _extends5.default)({}, state.icons, (0, _defineProperty3.default)({}, id, [].concat((0, _toConsumableArray3.default)(state.icons[id]), [{ title: title, message: message }])))\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.clearErrorIcon, function (state, _ref3) {\n    var id = _ref3.payload.id;\n    return (0, _extends5.default)({}, state, {\n      icons: (0, _extends5.default)({}, state.icons, (0, _defineProperty3.default)({}, id, []))\n    });\n  }), _handleActions), _lodash2.default.defaults(initialState, { alerts: [], icons: initialErrorIconState }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(initialErrorIconState, 'initialErrorIconState', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/errors.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/errors.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/errors.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/errors.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/errors.js?");
 
 /***/ }),
 
@@ -664,7 +664,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _values = __webpack_require__(/*! babel-runtime/core-js/object/values */ \"babel-runtime/core-js/object/values\");\n\nvar _values2 = _interopRequireDefault(_values);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _groups = __webpack_require__(/*! ../actions/groups */ \"./src/actions/groups.js\");\n\nvar _groups2 = _interopRequireDefault(_groups);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.groups\"\n    * @desc\n    * This reducer handles information related to user-groups.\n    *\n    * Corresponding segment of the Redux state is designed to have the following\n    * fields:\n    *\n    * groups {Object} - Holds loaded information about user groups. Keys of this\n    * object are group IDs, and the values are group data object. To keep the state\n    * flat, and our code efficient; for any group that has sub-groups, subGroups\n    * field is removed, while subGroupsIds {String[]} field is added, and each\n    * sub group data object is added to the groups object.\n    *\n    * loading {Object} - Holds IDs of the groups being loaded. Removing ID from\n    * this object will result in silent discard of the data loaded by the\n    * corresponding GROUPS/GET_DONE action; though such functionality does\n    * not look really necessary at the moment, thus we do not provide an\n    * action to really cancel group loading.\n    * @todo Document state segment structure better.\n    */\n\n/**\n * Private. Given two user group maps, it adds to \"dst\" the root group from\n * \"src\" (specified by \"rootId\"), and all its descendant groups. Any groups\n * in \"src\" not related to the sub-tree of the root group descendants are\n * not added to \"dst\".\n * This function mutates \"dst\"!\n * @param {Object} dst\n * @param {Object} src\n * @param {String} rootId\n */\nfunction mergeGroupTree(dst, src, rootId) {\n  var root = src[rootId];\n  dst[rootId] = root; // eslint-disable-line no-param-reassign\n  if (root.subGroupIds) {\n    root.subGroupIds.forEach(function (id) {\n      return mergeGroupTree(dst, src, id);\n    });\n  }\n}\n\n/**\n * Removes from the state all loaded user groups, and cancels any on-going\n * loading of user groups.\n * @param {Object} state\n * @return {Object} New state.\n */\nfunction onDropGroups(state) {\n  return (0, _extends3.default)({}, state, { groups: {}, loading: {} });\n}\n\n/**\n * Initiates the loading of data on the specified groups.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetGroupsInit(state, _ref) {\n  var payload = _ref.payload;\n\n  var groupIds = _lodash2.default.isArray(payload) ? payload : [payload];\n  var loading = _lodash2.default.clone(state.loading);\n  groupIds.forEach(function (id) {\n    loading[id] = true;\n  });\n  return (0, _extends3.default)({}, state, { loading: loading });\n}\n\n/**\n * Finalizes the loading of data on the specified groups.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetGroupsDone(state, action) {\n  var groups = _lodash2.default.clone(state.groups);\n  var loading = _lodash2.default.clone(state.loading);\n  var loaded = action.payload;\n  (0, _values2.default)(loaded).forEach(function (_ref2) {\n    var id = _ref2.id;\n\n    if (loading[id]) {\n      mergeGroupTree(groups, loaded, id);\n      delete loading[id];\n    }\n  });\n  return (0, _extends3.default)({}, state, { groups: groups, loading: loading });\n}\n\n/**\n * Creates a new Groups reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Groups reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _groups2.default.groups;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.dropGroups, onDropGroups), (0, _defineProperty3.default)(_handleActions, a.getGroupsInit, onGetGroupsInit), (0, _defineProperty3.default)(_handleActions, a.getGroupsDone, onGetGroupsDone), _handleActions), _lodash2.default.defaults(initialState ? _lodash2.default.clone(initialState) : {}, {\n    groups: {},\n    loading: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(mergeGroupTree, 'mergeGroupTree', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(onDropGroups, 'onDropGroups', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(onGetGroupsInit, 'onGetGroupsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(onGetGroupsDone, 'onGetGroupsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/groups.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/groups.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _values = __webpack_require__(/*! babel-runtime/core-js/object/values */ \"babel-runtime/core-js/object/values\");\n\nvar _values2 = _interopRequireDefault(_values);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _groups = __webpack_require__(/*! ../actions/groups */ \"./src/actions/groups.js\");\n\nvar _groups2 = _interopRequireDefault(_groups);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.groups\"\n    * @desc\n    * This reducer handles information related to user-groups.\n    *\n    * Corresponding segment of the Redux state is designed to have the following\n    * fields:\n    *\n    * groups {Object} - Holds loaded information about user groups. Keys of this\n    * object are group IDs, and the values are group data object. To keep the state\n    * flat, and our code efficient; for any group that has sub-groups, subGroups\n    * field is removed, while subGroupsIds {String[]} field is added, and each\n    * sub group data object is added to the groups object.\n    *\n    * loading {Object} - Holds IDs of the groups being loaded. Removing ID from\n    * this object will result in silent discard of the data loaded by the\n    * corresponding GROUPS/GET_DONE action; though such functionality does\n    * not look really necessary at the moment, thus we do not provide an\n    * action to really cancel group loading.\n    * @todo Document state segment structure better.\n    */\n\n/**\n * Private. Given two user group maps, it adds to \"dst\" the root group from\n * \"src\" (specified by \"rootId\"), and all its descendant groups. Any groups\n * in \"src\" not related to the sub-tree of the root group descendants are\n * not added to \"dst\".\n * This function mutates \"dst\"!\n * @param {Object} dst\n * @param {Object} src\n * @param {String} rootId\n */\nfunction mergeGroupTree(dst, src, rootId) {\n  var root = src[rootId];\n  dst[rootId] = root; // eslint-disable-line no-param-reassign\n  if (root.subGroupIds) {\n    root.subGroupIds.forEach(function (id) {\n      return mergeGroupTree(dst, src, id);\n    });\n  }\n}\n\n/**\n * Removes from the state all loaded user groups, and cancels any on-going\n * loading of user groups.\n * @param {Object} state\n * @return {Object} New state.\n */\nfunction onDropGroups(state) {\n  return (0, _extends3.default)({}, state, { groups: {}, loading: {} });\n}\n\n/**\n * Initiates the loading of data on the specified groups.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetGroupsInit(state, _ref) {\n  var payload = _ref.payload;\n\n  var groupIds = _lodash2.default.isArray(payload) ? payload : [payload];\n  var loading = _lodash2.default.clone(state.loading);\n  groupIds.forEach(function (id) {\n    loading[id] = true;\n  });\n  return (0, _extends3.default)({}, state, { loading: loading });\n}\n\n/**\n * Finalizes the loading of data on the specified groups.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetGroupsDone(state, action) {\n  var groups = _lodash2.default.clone(state.groups);\n  var loading = _lodash2.default.clone(state.loading);\n  var loaded = action.payload;\n  (0, _values2.default)(loaded).forEach(function (_ref2) {\n    var id = _ref2.id;\n\n    if (loading[id]) {\n      mergeGroupTree(groups, loaded, id);\n      delete loading[id];\n    }\n  });\n  return (0, _extends3.default)({}, state, { groups: groups, loading: loading });\n}\n\n/**\n * Creates a new Groups reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Groups reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _groups2.default.groups;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.dropGroups, onDropGroups), (0, _defineProperty3.default)(_handleActions, a.getGroupsInit, onGetGroupsInit), (0, _defineProperty3.default)(_handleActions, a.getGroupsDone, onGetGroupsDone), _handleActions), _lodash2.default.defaults(initialState ? _lodash2.default.clone(initialState) : {}, {\n    groups: {},\n    loading: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(mergeGroupTree, 'mergeGroupTree', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(onDropGroups, 'onDropGroups', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(onGetGroupsInit, 'onGetGroupsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(onGetGroupsDone, 'onGetGroupsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/groups.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/groups.js?");
 
 /***/ }),
 
@@ -676,7 +676,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.factory = factory;\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _auth = __webpack_require__(/*! ./auth */ \"./src/reducers/auth.js\");\n\nvar _auth2 = _interopRequireDefault(_auth);\n\nvar _stats = __webpack_require__(/*! ./stats */ \"./src/reducers/stats.js\");\n\nvar _stats2 = _interopRequireDefault(_stats);\n\nvar _terms = __webpack_require__(/*! ./terms */ \"./src/reducers/terms.js\");\n\nvar _terms2 = _interopRequireDefault(_terms);\n\nvar _direct = __webpack_require__(/*! ./direct */ \"./src/reducers/direct.js\");\n\nvar _direct2 = _interopRequireDefault(_direct);\n\nvar _groups = __webpack_require__(/*! ./groups */ \"./src/reducers/groups.js\");\n\nvar _groups2 = _interopRequireDefault(_groups);\n\nvar _errors = __webpack_require__(/*! ./errors */ \"./src/reducers/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nvar _challenge = __webpack_require__(/*! ./challenge */ \"./src/reducers/challenge.js\");\n\nvar _challenge2 = _interopRequireDefault(_challenge);\n\nvar _profile = __webpack_require__(/*! ./profile */ \"./src/reducers/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/reducers/members.js\");\n\nvar _members2 = _interopRequireDefault(_members);\n\nvar _lookup = __webpack_require__(/*! ./lookup */ \"./src/reducers/lookup.js\");\n\nvar _lookup2 = _interopRequireDefault(_lookup);\n\nvar _memberTasks = __webpack_require__(/*! ./member-tasks */ \"./src/reducers/member-tasks.js\");\n\nvar _memberTasks2 = _interopRequireDefault(_memberTasks);\n\nvar _reviewOpportunity = __webpack_require__(/*! ./reviewOpportunity */ \"./src/reducers/reviewOpportunity.js\");\n\nvar _reviewOpportunity2 = _interopRequireDefault(_reviewOpportunity);\n\nvar _mySubmissionsManagement = __webpack_require__(/*! ./my-submissions-management */ \"./src/reducers/my-submissions-management.js\");\n\nvar _mySubmissionsManagement2 = _interopRequireDefault(_mySubmissionsManagement);\n\nvar _settings = __webpack_require__(/*! ./settings */ \"./src/reducers/settings.js\");\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _looker = __webpack_require__(/*! ./looker */ \"./src/reducers/looker.js\");\n\nvar _looker2 = _interopRequireDefault(_looker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Export reducers.\n    */\n\n\nfunction factory(options) {\n  return _topcoderReactUtils.redux.resolveReducers({\n    auth: (0, _auth.factory)(options),\n    stats: (0, _stats.factory)(options),\n    terms: (0, _terms.factory)(options),\n    direct: (0, _direct.factory)(options),\n    groups: (0, _groups.factory)(options),\n    errors: (0, _errors.factory)(options),\n    challenge: (0, _challenge.factory)(options),\n    profile: (0, _profile.factory)(options),\n    lookup: (0, _lookup.factory)(options),\n    members: (0, _members.factory)(options),\n    memberTasks: (0, _memberTasks.factory)(options),\n    reviewOpportunity: (0, _reviewOpportunity.factory)(options),\n    mySubmissionsManagement: (0, _mySubmissionsManagement.factory)(options),\n    settings: (0, _settings.factory)(options),\n    looker: (0, _looker.factory)(options)\n  });\n}\n\nvar _default = {\n  auth: _auth2.default,\n  stats: _stats2.default,\n  terms: _terms2.default,\n  direct: _direct2.default,\n  groups: _groups2.default,\n  errors: _errors2.default,\n  challenge: _challenge2.default,\n  profile: _profile2.default,\n  lookup: _lookup2.default,\n  members: _members2.default,\n  memberTasks: _memberTasks2.default,\n  reviewOpportunity: _reviewOpportunity2.default,\n  mySubmissionsManagement: _mySubmissionsManagement2.default,\n  settings: _settings2.default,\n  looker: _looker2.default\n};\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/index.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/index.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.factory = factory;\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _auth = __webpack_require__(/*! ./auth */ \"./src/reducers/auth.js\");\n\nvar _auth2 = _interopRequireDefault(_auth);\n\nvar _stats = __webpack_require__(/*! ./stats */ \"./src/reducers/stats.js\");\n\nvar _stats2 = _interopRequireDefault(_stats);\n\nvar _terms = __webpack_require__(/*! ./terms */ \"./src/reducers/terms.js\");\n\nvar _terms2 = _interopRequireDefault(_terms);\n\nvar _direct = __webpack_require__(/*! ./direct */ \"./src/reducers/direct.js\");\n\nvar _direct2 = _interopRequireDefault(_direct);\n\nvar _groups = __webpack_require__(/*! ./groups */ \"./src/reducers/groups.js\");\n\nvar _groups2 = _interopRequireDefault(_groups);\n\nvar _errors = __webpack_require__(/*! ./errors */ \"./src/reducers/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nvar _challenge = __webpack_require__(/*! ./challenge */ \"./src/reducers/challenge.js\");\n\nvar _challenge2 = _interopRequireDefault(_challenge);\n\nvar _profile = __webpack_require__(/*! ./profile */ \"./src/reducers/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/reducers/members.js\");\n\nvar _members2 = _interopRequireDefault(_members);\n\nvar _lookup = __webpack_require__(/*! ./lookup */ \"./src/reducers/lookup.js\");\n\nvar _lookup2 = _interopRequireDefault(_lookup);\n\nvar _memberTasks = __webpack_require__(/*! ./member-tasks */ \"./src/reducers/member-tasks.js\");\n\nvar _memberTasks2 = _interopRequireDefault(_memberTasks);\n\nvar _reviewOpportunity = __webpack_require__(/*! ./reviewOpportunity */ \"./src/reducers/reviewOpportunity.js\");\n\nvar _reviewOpportunity2 = _interopRequireDefault(_reviewOpportunity);\n\nvar _mySubmissionsManagement = __webpack_require__(/*! ./my-submissions-management */ \"./src/reducers/my-submissions-management.js\");\n\nvar _mySubmissionsManagement2 = _interopRequireDefault(_mySubmissionsManagement);\n\nvar _settings = __webpack_require__(/*! ./settings */ \"./src/reducers/settings.js\");\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _looker = __webpack_require__(/*! ./looker */ \"./src/reducers/looker.js\");\n\nvar _looker2 = _interopRequireDefault(_looker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Export reducers.\n    */\n\n\nfunction factory(options) {\n  return _topcoderReactUtils.redux.resolveReducers({\n    auth: (0, _auth.factory)(options),\n    stats: (0, _stats.factory)(options),\n    terms: (0, _terms.factory)(options),\n    direct: (0, _direct.factory)(options),\n    groups: (0, _groups.factory)(options),\n    errors: (0, _errors.factory)(options),\n    challenge: (0, _challenge.factory)(options),\n    profile: (0, _profile.factory)(options),\n    lookup: (0, _lookup.factory)(options),\n    members: (0, _members.factory)(options),\n    memberTasks: (0, _memberTasks.factory)(options),\n    reviewOpportunity: (0, _reviewOpportunity.factory)(options),\n    mySubmissionsManagement: (0, _mySubmissionsManagement.factory)(options),\n    settings: (0, _settings.factory)(options),\n    looker: (0, _looker.factory)(options)\n  });\n}\n\nvar _default = {\n  auth: _auth2.default,\n  stats: _stats2.default,\n  terms: _terms2.default,\n  direct: _direct2.default,\n  groups: _groups2.default,\n  errors: _errors2.default,\n  challenge: _challenge2.default,\n  profile: _profile2.default,\n  lookup: _lookup2.default,\n  members: _members2.default,\n  memberTasks: _memberTasks2.default,\n  reviewOpportunity: _reviewOpportunity2.default,\n  mySubmissionsManagement: _mySubmissionsManagement2.default,\n  settings: _settings2.default,\n  looker: _looker2.default\n};\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/index.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/index.js?");
 
 /***/ }),
 
@@ -688,7 +688,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _looker = __webpack_require__(/*! ../actions/looker */ \"./src/actions/looker.js\");\n\nvar _looker2 = _interopRequireDefault(_looker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.looker\"\n    * @desc Reducer for {@link module:actions.looker} actions.\n    *\n    * State segment managed by this reducer has the following structure:\n    * @param {Object} dataSet={}, index by lookerId.\n    */\n\n\n/**\n * Handles LOOKER/GET_LOOKER_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetLookerDone(state, _ref) {\n  var payload = _ref.payload;\n  var _payload$data = payload.data,\n      res = _payload$data.res,\n      error = _payload$data.error,\n      lookerId = payload.lookerId;\n\n\n  var newDataSet = (0, _extends3.default)({}, state.dataSet);\n  newDataSet[lookerId] = {\n    lookerData: res,\n    error: error,\n    msg: res.message\n  };\n  return (0, _extends3.default)({}, state, {\n    dataSet: newDataSet\n  });\n}\n\n/**\n * Creates a new Looker reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Looker reducer.\n */\nfunction create() {\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _looker2.default.looker;\n  return (0, _reduxActions.handleActions)((0, _defineProperty3.default)({}, a.getLookerDone, onGetLookerDone), _lodash2.default.defaults(initialState, {\n    dataSet: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetLookerDone, 'onGetLookerDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/looker.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/looker.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/looker.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/looker.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/looker.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _looker = __webpack_require__(/*! ../actions/looker */ \"./src/actions/looker.js\");\n\nvar _looker2 = _interopRequireDefault(_looker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.looker\"\n    * @desc Reducer for {@link module:actions.looker} actions.\n    *\n    * State segment managed by this reducer has the following structure:\n    * @param {Object} dataSet={}, index by lookerId.\n    */\n\n\n/**\n * Handles LOOKER/GET_LOOKER_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetLookerDone(state, _ref) {\n  var payload = _ref.payload;\n  var _payload$data = payload.data,\n      res = _payload$data.res,\n      error = _payload$data.error,\n      lookerId = payload.lookerId;\n\n\n  var newDataSet = (0, _extends3.default)({}, state.dataSet);\n  newDataSet[lookerId] = {\n    lookerData: res,\n    error: error,\n    msg: res.message\n  };\n  return (0, _extends3.default)({}, state, {\n    dataSet: newDataSet\n  });\n}\n\n/**\n * Creates a new Looker reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Looker reducer.\n */\nfunction create() {\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _looker2.default.looker;\n  return (0, _reduxActions.handleActions)((0, _defineProperty3.default)({}, a.getLookerDone, onGetLookerDone), _lodash2.default.defaults(initialState, {\n    dataSet: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetLookerDone, 'onGetLookerDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/looker.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/looker.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/looker.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/looker.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/looker.js?");
 
 /***/ }),
 
@@ -700,7 +700,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _lookup = __webpack_require__(/*! ../actions/lookup */ \"./src/actions/lookup.js\");\n\nvar _lookup2 = _interopRequireDefault(_lookup);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.lookup\"\n    * @desc Reducer for {@link module:actions.lookup} actions.\n    *\n    * State segment managed by this reducer has the following structure:\n    * @param {Array} skillTags='' skill tags.\n    */\n\n\n/**\n * Handles LOOKUP/GET_SKILL_TAGS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetSkillTagsDone(state, _ref) {\n  var payload = _ref.payload,\n      error = _ref.error;\n\n  if (error) {\n    _logger2.default.error('Failed to get skill tags', payload);\n    return (0, _extends3.default)({}, state, { loadingSkillTagsError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    loadingSkillTagsError: false,\n    skillTags: payload\n  });\n}\n\n/**\n * Handles LOOKUP/GET_COUNTRIES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetCountriesDone(state, _ref2) {\n  var payload = _ref2.payload,\n      error = _ref2.error;\n\n  if (error) {\n    _logger2.default.error('Failed to get countries', payload);\n    return (0, _extends3.default)({}, state, { loadingCountriesError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    loadingCountriesError: false,\n    countries: payload\n  });\n}\n\n/**\n * Creates a new Lookup reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Lookup reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _lookup2.default.lookup;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.getSkillTagsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getSkillTagsDone, onGetSkillTagsDone), (0, _defineProperty3.default)(_handleActions, a.getCountriesInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getCountriesDone, onGetCountriesDone), _handleActions), _lodash2.default.defaults(initialState, {\n    skillTags: [],\n    countries: []\n  }));\n}\n\n/**\n * Factory which creates a new reducer.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetSkillTagsDone, 'onGetSkillTagsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(onGetCountriesDone, 'onGetCountriesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/lookup.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/lookup.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _lookup = __webpack_require__(/*! ../actions/lookup */ \"./src/actions/lookup.js\");\n\nvar _lookup2 = _interopRequireDefault(_lookup);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.lookup\"\n    * @desc Reducer for {@link module:actions.lookup} actions.\n    *\n    * State segment managed by this reducer has the following structure:\n    * @param {Array} skillTags='' skill tags.\n    */\n\n\n/**\n * Handles LOOKUP/GET_SKILL_TAGS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetSkillTagsDone(state, _ref) {\n  var payload = _ref.payload,\n      error = _ref.error;\n\n  if (error) {\n    _logger2.default.error('Failed to get skill tags', payload);\n    return (0, _extends3.default)({}, state, { loadingSkillTagsError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    loadingSkillTagsError: false,\n    skillTags: payload\n  });\n}\n\n/**\n * Handles LOOKUP/GET_COUNTRIES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetCountriesDone(state, _ref2) {\n  var payload = _ref2.payload,\n      error = _ref2.error;\n\n  if (error) {\n    _logger2.default.error('Failed to get countries', payload);\n    return (0, _extends3.default)({}, state, { loadingCountriesError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    loadingCountriesError: false,\n    countries: payload\n  });\n}\n\n/**\n * Handles LOOKUP/GET_ALL_COUNTRIES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetAllCountriesDone(state, _ref3) {\n  var payload = _ref3.payload,\n      error = _ref3.error;\n\n  if (error) {\n    _logger2.default.error('Failed to get all countries', payload);\n    return (0, _extends3.default)({}, state, { loadingAllCountriesError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    loadingAllCountriesError: false,\n    allCountries: payload\n  });\n}\n\n/**\n * Creates a new Lookup reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Lookup reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _lookup2.default.lookup;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.getSkillTagsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getSkillTagsDone, onGetSkillTagsDone), (0, _defineProperty3.default)(_handleActions, a.getCountriesInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getCountriesDone, onGetCountriesDone), (0, _defineProperty3.default)(_handleActions, a.getAllCountriesInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getAllCountriesDone, onGetAllCountriesDone), _handleActions), _lodash2.default.defaults(initialState, {\n    skillTags: [],\n    countries: [],\n    allCountries: []\n  }));\n}\n\n/**\n * Factory which creates a new reducer.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetSkillTagsDone, 'onGetSkillTagsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(onGetCountriesDone, 'onGetCountriesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(onGetAllCountriesDone, 'onGetAllCountriesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/lookup.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/lookup.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/lookup.js?");
 
 /***/ }),
 
@@ -712,7 +712,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _memberTasks = __webpack_require__(/*! ../actions/member-tasks */ \"./src/actions/member-tasks.js\");\n\nvar _memberTasks2 = _interopRequireDefault(_memberTasks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reduces.member-tasks\"\n    * @desc Member tasks reducer.\n    * @todo Document state segment structure.\n    */\n/* global alert */\n\n/**\n * Drops all tasks and cancels the ongoing loading operation, if it is pending.\n * @param {Object} state\n * @return {Object} New state.\n */\nfunction onDropAll(state) {\n  return (0, _extends3.default)({}, state, {\n    allLoaded: false,\n    lastRequestedPageNum: -1,\n    loadingUuid: '',\n    tasks: [],\n    timestamp: 0\n  });\n}\n\n/**\n * Stores into the state meta data about the initiated loading operation.\n * This will effectively cancel the already pending loading operation, if any.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetInit(state, _ref) {\n  var payload = _ref.payload;\n\n  return (0, _extends3.default)({}, state, {\n    lastRequestedPageNum: payload.pageNum,\n    loadingUuid: payload.uuid\n  });\n}\n\n/**\n * Handles the actual result of the loading operation.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetDone(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  /* Bails out in case of error. */\n  if (error) {\n    _logger2.default.error(payload);\n    /* NOTE: For now, using alert to inform about failures is kind of fine. */\n    /* eslint-disable no-alert */\n    if (_topcoderReactUtils.isomorphy.isClientSide()) alert('Failed to load member tasks');\n    /* eslint-enable no-alert */\n    return state;\n  }\n\n  /* Silently ignores the action, if it has unexpected UUID. */\n  var projectId = payload.projectId,\n      tasks = payload.tasks,\n      uuid = payload.uuid;\n\n  if (uuid !== state.loadingUuid) return state;\n\n  /* Generates the map of old tasks, and the count of old tasks related to\n   * the specified project. */\n  var taskMap = {};\n  state.tasks.forEach(function (task) {\n    taskMap[task.id] = task;\n  });\n\n  /* Merges newly loaded tasks into the map of old ones. */\n  tasks.forEach(function (task) {\n    taskMap[task.id] = task;\n  });\n\n  /* If the first page of tasks has been loaded, updates its timestamp. */\n  var timestamps = state.timestamps;\n\n  if (!state.lastRequestedPageNum) {\n    timestamps = _lodash2.default.clone(timestamps);\n    timestamps[projectId] = Date.now();\n  }\n\n  return (0, _extends3.default)({}, state, {\n    allLoaded: tasks.length < _memberTasks.PAGE_SIZE,\n    loadingUuid: '',\n    tasks: _lodash2.default.values(taskMap),\n    timestamps: timestamps\n  });\n}\n\n/**\n * Creates a new Member tasks reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Member tasks reducer.\n */\nfunction create() {\n  var _redux$handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _memberTasks2.default.memberTasks;\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, a.dropAll, onDropAll), (0, _defineProperty3.default)(_redux$handleActions, a.getInit, onGetInit), (0, _defineProperty3.default)(_redux$handleActions, a.getDone, onGetDone), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    /* It is set true when a request to load tasks loads less tasks than a full\n     * task page size. It is reset to false each time the page number 0 starts\n     * to load. If you load task pages sequentially from the very first page,\n     * with the same projectId and user specified by auth token, this flag\n     * signals you when there is no more tasks to load. */\n    allLoaded: false,\n\n    /* Holds the number of the last requested task page. */\n    lastRequestedPageNum: -1,\n\n    /* Equals to the loading operation UUID when the result is pending; equals\n     * empty string when nothing is being loaded. */\n    loadingUuid: '',\n\n    /* The list of tasks loaded so far. For better performance and user\n     * experience it may contain tasks related to projects queried before;\n     * be sure to filter it according to your needs. */\n    tasks: [],\n\n    /* Keys of this object are projectIds, and values keep the timestamps\n     * corresponding to latest updates of the first page of tasks related\n     * to those projects. */\n    timestamps: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onDropAll, 'onDropAll', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(onGetInit, 'onGetInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(onGetDone, 'onGetDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/member-tasks.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/member-tasks.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _memberTasks = __webpack_require__(/*! ../actions/member-tasks */ \"./src/actions/member-tasks.js\");\n\nvar _memberTasks2 = _interopRequireDefault(_memberTasks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reduces.member-tasks\"\n    * @desc Member tasks reducer.\n    * @todo Document state segment structure.\n    */\n/* global alert */\n\n/**\n * Drops all tasks and cancels the ongoing loading operation, if it is pending.\n * @param {Object} state\n * @return {Object} New state.\n */\nfunction onDropAll(state) {\n  return (0, _extends3.default)({}, state, {\n    allLoaded: false,\n    lastRequestedPageNum: -1,\n    loadingUuid: '',\n    tasks: [],\n    timestamp: 0\n  });\n}\n\n/**\n * Stores into the state meta data about the initiated loading operation.\n * This will effectively cancel the already pending loading operation, if any.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetInit(state, _ref) {\n  var payload = _ref.payload;\n\n  return (0, _extends3.default)({}, state, {\n    lastRequestedPageNum: payload.pageNum,\n    loadingUuid: payload.uuid\n  });\n}\n\n/**\n * Handles the actual result of the loading operation.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetDone(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  /* Bails out in case of error. */\n  if (error) {\n    _logger2.default.error(payload);\n    /* NOTE: For now, using alert to inform about failures is kind of fine. */\n    /* eslint-disable no-alert */\n    if (_topcoderReactUtils.isomorphy.isClientSide()) alert('Failed to load member tasks');\n    /* eslint-enable no-alert */\n    return state;\n  }\n\n  /* Silently ignores the action, if it has unexpected UUID. */\n  var projectId = payload.projectId,\n      tasks = payload.tasks,\n      uuid = payload.uuid;\n\n  if (uuid !== state.loadingUuid) return state;\n\n  /* Generates the map of old tasks, and the count of old tasks related to\n   * the specified project. */\n  var taskMap = {};\n  state.tasks.forEach(function (task) {\n    taskMap[task.id] = task;\n  });\n\n  /* Merges newly loaded tasks into the map of old ones. */\n  tasks.forEach(function (task) {\n    taskMap[task.id] = task;\n  });\n\n  /* If the first page of tasks has been loaded, updates its timestamp. */\n  var timestamps = state.timestamps;\n\n  if (!state.lastRequestedPageNum) {\n    timestamps = _lodash2.default.clone(timestamps);\n    timestamps[projectId] = Date.now();\n  }\n\n  return (0, _extends3.default)({}, state, {\n    allLoaded: tasks.length < _memberTasks.PAGE_SIZE,\n    loadingUuid: '',\n    tasks: _lodash2.default.values(taskMap),\n    timestamps: timestamps\n  });\n}\n\n/**\n * Creates a new Member tasks reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Member tasks reducer.\n */\nfunction create() {\n  var _redux$handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _memberTasks2.default.memberTasks;\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, a.dropAll, onDropAll), (0, _defineProperty3.default)(_redux$handleActions, a.getInit, onGetInit), (0, _defineProperty3.default)(_redux$handleActions, a.getDone, onGetDone), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    /* It is set true when a request to load tasks loads less tasks than a full\n     * task page size. It is reset to false each time the page number 0 starts\n     * to load. If you load task pages sequentially from the very first page,\n     * with the same projectId and user specified by auth token, this flag\n     * signals you when there is no more tasks to load. */\n    allLoaded: false,\n\n    /* Holds the number of the last requested task page. */\n    lastRequestedPageNum: -1,\n\n    /* Equals to the loading operation UUID when the result is pending; equals\n     * empty string when nothing is being loaded. */\n    loadingUuid: '',\n\n    /* The list of tasks loaded so far. For better performance and user\n     * experience it may contain tasks related to projects queried before;\n     * be sure to filter it according to your needs. */\n    tasks: [],\n\n    /* Keys of this object are projectIds, and values keep the timestamps\n     * corresponding to latest updates of the first page of tasks related\n     * to those projects. */\n    timestamps: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onDropAll, 'onDropAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(onGetInit, 'onGetInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(onGetDone, 'onGetDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/member-tasks.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/member-tasks.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/member-tasks.js?");
 
 /***/ }),
 
@@ -724,7 +724,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends20 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends21 = _interopRequireDefault(_extends20);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _members = __webpack_require__(/*! ../actions/members */ \"./src/actions/members.js\");\n\nvar _members2 = _interopRequireDefault(_members);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.members\"\n    * @desc Reducer for the Redux store segment that holds members data.\n    * @todo Document state segment structure.\n    */\n\n/**\n * Drops information about a member.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onDrop(state, _ref) {\n  var payload = _ref.payload;\n\n  if (!state[payload]) return state;\n  return _lodash2.default.omit(state, payload);\n}\n\n/**\n * Drops all loaded information on members.\n * @return {Object} New state.\n */\nfunction onDropAll() {\n  return {};\n}\n\n/**\n * Inits the loading of member achievements.\n * @param {Object} state\n * @param {String} action.handle\n * @param {String} action.uuid\n * @return {Object} New state.\n */\nfunction onGetAchievementsInit(state, action) {\n  var _action$payload = action.payload,\n      handle = _action$payload.handle,\n      uuid = _action$payload.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.achievements = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member achievements.\n * @param {Object} state\n * @param {Object} error\n * @param {Array} payload.data\n * @param {String} payload.handle\n * @param {String} payload.uuid\n * @return {Object} New state.\n */\nfunction onGetAchievementsDone(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to load member achievements', payload);\n    (0, _errors.fireErrorMessage)('Failed to load member achievements');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'achievements.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    achievements: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Initializes the loading of member financial information.\n * @param {Object} state\n * @param {String} action.payload.handle\n * @param {String} action.payload.uuid\n * @return {Object} New state.\n */\nfunction onGetFinancesInit(state, action) {\n  var _action$payload2 = action.payload,\n      handle = _action$payload2.handle,\n      uuid = _action$payload2.uuid;\n\n  var envelop = (0, _extends21.default)({}, state[handle] || {}, {\n    finances: {\n      loadingUuid: uuid,\n      timestamp: 0\n    }\n  });\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, envelop));\n}\n\n/**\n * Finalizes a pending loading of member financial information.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetFinancesDone(state, _ref3) {\n  var error = _ref3.error,\n      payload = _ref3.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get user financial info', payload);\n    (0, _errors.fireErrorMessage)('Failed to get user financial info', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'finances.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    finances: {\n      data: data,\n      loadingUuid: '',\n      timestamp: Date.now()\n    }\n  })));\n}\n\n/**\n * Inits the loading of member stats.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsInit(state, action) {\n  var _action$payload3 = action.payload,\n      handle = _action$payload3.handle,\n      uuid = _action$payload3.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.stats = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member stats.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsDone(state, _ref4) {\n  var error = _ref4.error,\n      payload = _ref4.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member stats', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member stats', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'stats.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    stats: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Inits the loading of member stats history.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsHistoryInit(state, action) {\n  var _action$payload4 = action.payload,\n      handle = _action$payload4.handle,\n      uuid = _action$payload4.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.statsHistory = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member stats history.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsHistoryDone(state, _ref5) {\n  var error = _ref5.error,\n      payload = _ref5.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member statsHistory', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member statsHistory', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'statsHistory.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    statsHistory: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Inits the loading of member stats distribution.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsDistributionInit(state, action) {\n  var _action$payload5 = action.payload,\n      handle = _action$payload5.handle,\n      uuid = _action$payload5.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.statsDistribution = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member stats distribution.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsDistributionDone(state, _ref6) {\n  var error = _ref6.error,\n      payload = _ref6.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member statsDistribution', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member statsDistribution', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'statsDistribution.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    statsDistribution: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Inits the loading of member active challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetActiveChallengesInit(state, action) {\n  var handle = action.payload.handle;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { activeChallengesCount: null })));\n}\n\n/**\n * Finalizes the loading of member active challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetActiveChallengesDone(state, _ref7) {\n  var error = _ref7.error,\n      payload = _ref7.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member active challenges', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member active challenges', '');\n    return state;\n  }\n\n  var handle = payload.handle,\n      challenges = payload.challenges;\n\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    activeChallengesCount: challenges.length\n  })));\n}\n\n/**\n * Inits the loading of member subtrack challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubtrackChallengesInit(state, _ref8) {\n  var payload = _ref8.payload;\n  var handle = payload.handle,\n      uuid = payload.uuid;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { loadingSubTrackChallengesUUID: uuid })));\n}\n\n/**\n * Finalizes the loading of member subtrack challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubtrackChallengesDone(state, _ref9) {\n  var error = _ref9.error,\n      payload = _ref9.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member subtrack challenges', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member subtrack challenges', '');\n    return state;\n  }\n\n  var uuid = payload.uuid,\n      challenges = payload.challenges,\n      refresh = payload.refresh,\n      handle = payload.handle;\n\n  if (uuid !== state[handle].loadingSubTrackChallengesUUID) return state;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    subtrackChallenges: state[handle].subtrackChallenges && !refresh ? [].concat((0, _toConsumableArray3.default)(state[handle].subtrackChallenges), (0, _toConsumableArray3.default)(challenges)) : challenges,\n    // if current query returns 0 item, mark it completed\n    subtrackChallengesHasMore: challenges && challenges.length > 0,\n    loadingSubTrackChallengesUUID: ''\n  })));\n}\n\n/**\n * Inits the loading of member SRMs.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserSRMInit(state, _ref10) {\n  var payload = _ref10.payload;\n  var handle = payload.handle,\n      uuid = payload.uuid;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { loadingSRMUUID: uuid })));\n}\n\n/**\n * Finalizes the loading of member SRMs.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserSRMDone(state, _ref11) {\n  var error = _ref11.error,\n      payload = _ref11.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member SRMs', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member SRMs', '');\n    return state;\n  }\n\n  var uuid = payload.uuid,\n      srms = payload.srms,\n      refresh = payload.refresh,\n      handle = payload.handle;\n\n  if (uuid !== state[handle].loadingSRMUUID) return state;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    userSRMs: state[handle].userSRMs && !refresh ? [].concat((0, _toConsumableArray3.default)(state[handle].userSRMs), (0, _toConsumableArray3.default)(srms)) : srms,\n    userSRMHasMore: srms && srms.length > 0, // if current query returns 0 item, mark it completed\n    loadingSRMUUID: ''\n  })));\n}\n\n/**\n * Inits the loading of member marathons.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserMarathonInit(state, _ref12) {\n  var payload = _ref12.payload;\n  var handle = payload.handle,\n      uuid = payload.uuid;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { loadingMarathonUUID: uuid })));\n}\n\n/**\n * Finalizes the loading of member marathons.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserMarathonDone(state, _ref13) {\n  var error = _ref13.error,\n      payload = _ref13.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member marathons', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member marathons', '');\n    return state;\n  }\n\n  var uuid = payload.uuid,\n      marathons = payload.marathons,\n      refresh = payload.refresh,\n      handle = payload.handle;\n\n  if (uuid !== state[handle].loadingMarathonUUID) return state;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    userMarathons: state[handle].userMarathons && !refresh ? [].concat((0, _toConsumableArray3.default)(state[handle].userMarathons), (0, _toConsumableArray3.default)(marathons.challenges)) : marathons.challenges,\n    // if current query returns 0 item, mark it completed\n    userMarathonHasMore: marathons && marathons.challenges && marathons.challenges.length > 0,\n    loadingMarathonUUID: ''\n  })));\n}\n\n/**\n * Creates a new Members reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Members reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _members2.default.members;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.drop, onDrop), (0, _defineProperty3.default)(_handleActions, a.dropAll, onDropAll), (0, _defineProperty3.default)(_handleActions, a.getAchievementsInit, onGetAchievementsInit), (0, _defineProperty3.default)(_handleActions, a.getAchievementsDone, onGetAchievementsDone), (0, _defineProperty3.default)(_handleActions, a.getAchievementsV3Done, onGetAchievementsDone), (0, _defineProperty3.default)(_handleActions, a.getFinancesInit, onGetFinancesInit), (0, _defineProperty3.default)(_handleActions, a.getFinancesDone, onGetFinancesDone), (0, _defineProperty3.default)(_handleActions, a.getStatsInit, onGetStatsInit), (0, _defineProperty3.default)(_handleActions, a.getStatsDone, onGetStatsDone), (0, _defineProperty3.default)(_handleActions, a.getStatsHistoryInit, onGetStatsHistoryInit), (0, _defineProperty3.default)(_handleActions, a.getStatsHistoryDone, onGetStatsHistoryDone), (0, _defineProperty3.default)(_handleActions, a.getStatsDistributionInit, onGetStatsDistributionInit), (0, _defineProperty3.default)(_handleActions, a.getStatsDistributionDone, onGetStatsDistributionDone), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesInit, onGetActiveChallengesInit), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesDone, onGetActiveChallengesDone), (0, _defineProperty3.default)(_handleActions, a.getSubtrackChallengesInit, onGetSubtrackChallengesInit), (0, _defineProperty3.default)(_handleActions, a.getSubtrackChallengesDone, onGetSubtrackChallengesDone), (0, _defineProperty3.default)(_handleActions, a.getUserSrmInit, onGetUserSRMInit), (0, _defineProperty3.default)(_handleActions, a.getUserSrmDone, onGetUserSRMDone), (0, _defineProperty3.default)(_handleActions, a.getUserMarathonInit, onGetUserMarathonInit), (0, _defineProperty3.default)(_handleActions, a.getUserMarathonDone, onGetUserMarathonDone), _handleActions), initialState);\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onDrop, 'onDrop', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onDropAll, 'onDropAll', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetAchievementsInit, 'onGetAchievementsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetAchievementsDone, 'onGetAchievementsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetFinancesInit, 'onGetFinancesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetFinancesDone, 'onGetFinancesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsInit, 'onGetStatsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsDone, 'onGetStatsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsHistoryInit, 'onGetStatsHistoryInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsHistoryDone, 'onGetStatsHistoryDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsDistributionInit, 'onGetStatsDistributionInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsDistributionDone, 'onGetStatsDistributionDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetActiveChallengesInit, 'onGetActiveChallengesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetActiveChallengesDone, 'onGetActiveChallengesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetSubtrackChallengesInit, 'onGetSubtrackChallengesInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetSubtrackChallengesDone, 'onGetSubtrackChallengesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserSRMInit, 'onGetUserSRMInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserSRMDone, 'onGetUserSRMDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserMarathonInit, 'onGetUserMarathonInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserMarathonDone, 'onGetUserMarathonDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/members.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/members.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends20 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends21 = _interopRequireDefault(_extends20);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _members = __webpack_require__(/*! ../actions/members */ \"./src/actions/members.js\");\n\nvar _members2 = _interopRequireDefault(_members);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.members\"\n    * @desc Reducer for the Redux store segment that holds members data.\n    * @todo Document state segment structure.\n    */\n\n/**\n * Drops information about a member.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onDrop(state, _ref) {\n  var payload = _ref.payload;\n\n  if (!state[payload]) return state;\n  return _lodash2.default.omit(state, payload);\n}\n\n/**\n * Drops all loaded information on members.\n * @return {Object} New state.\n */\nfunction onDropAll() {\n  return {};\n}\n\n/**\n * Inits the loading of member achievements.\n * @param {Object} state\n * @param {String} action.handle\n * @param {String} action.uuid\n * @return {Object} New state.\n */\nfunction onGetAchievementsInit(state, action) {\n  var _action$payload = action.payload,\n      handle = _action$payload.handle,\n      uuid = _action$payload.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.achievements = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member achievements.\n * @param {Object} state\n * @param {Object} error\n * @param {Array} payload.data\n * @param {String} payload.handle\n * @param {String} payload.uuid\n * @return {Object} New state.\n */\nfunction onGetAchievementsDone(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to load member achievements', payload);\n    (0, _errors.fireErrorMessage)('Failed to load member achievements');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'achievements.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    achievements: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Initializes the loading of member financial information.\n * @param {Object} state\n * @param {String} action.payload.handle\n * @param {String} action.payload.uuid\n * @return {Object} New state.\n */\nfunction onGetFinancesInit(state, action) {\n  var _action$payload2 = action.payload,\n      handle = _action$payload2.handle,\n      uuid = _action$payload2.uuid;\n\n  var envelop = (0, _extends21.default)({}, state[handle] || {}, {\n    finances: {\n      loadingUuid: uuid,\n      timestamp: 0\n    }\n  });\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, envelop));\n}\n\n/**\n * Finalizes a pending loading of member financial information.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetFinancesDone(state, _ref3) {\n  var error = _ref3.error,\n      payload = _ref3.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get user financial info', payload);\n    (0, _errors.fireErrorMessage)('Failed to get user financial info', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'finances.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    finances: {\n      data: data,\n      loadingUuid: '',\n      timestamp: Date.now()\n    }\n  })));\n}\n\n/**\n * Inits the loading of member stats.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsInit(state, action) {\n  var _action$payload3 = action.payload,\n      handle = _action$payload3.handle,\n      uuid = _action$payload3.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.stats = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member stats.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsDone(state, _ref4) {\n  var error = _ref4.error,\n      payload = _ref4.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member stats', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member stats', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'stats.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    stats: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Inits the loading of member stats history.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsHistoryInit(state, action) {\n  var _action$payload4 = action.payload,\n      handle = _action$payload4.handle,\n      uuid = _action$payload4.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.statsHistory = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member stats history.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsHistoryDone(state, _ref5) {\n  var error = _ref5.error,\n      payload = _ref5.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member statsHistory', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member statsHistory', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'statsHistory.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    statsHistory: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Inits the loading of member stats distribution.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsDistributionInit(state, action) {\n  var _action$payload5 = action.payload,\n      handle = _action$payload5.handle,\n      uuid = _action$payload5.uuid;\n\n  var res = state[handle];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.statsDistribution = { loadingUuid: uuid };\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, res));\n}\n\n/**\n * Finalizes the loading of member stats distribution.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetStatsDistributionDone(state, _ref6) {\n  var error = _ref6.error,\n      payload = _ref6.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member statsDistribution', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member statsDistribution', '');\n    return state;\n  }\n\n  var data = payload.data,\n      handle = payload.handle,\n      uuid = payload.uuid;\n\n  if (uuid !== _lodash2.default.get(state[handle], 'statsDistribution.loadingUuid')) return state;\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    statsDistribution: { data: data, timestamp: Date.now() }\n  })));\n}\n\n/**\n * Inits the loading of member active challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetActiveChallengesInit(state, action) {\n  var handle = action.payload.handle;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { activeChallengesCount: null })));\n}\n\n/**\n * Finalizes the loading of member active challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetActiveChallengesDone(state, _ref7) {\n  var error = _ref7.error,\n      payload = _ref7.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member active challenges', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member active challenges', '');\n    return state;\n  }\n\n  var handle = payload.handle,\n      challenges = payload.challenges;\n\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    activeChallengesCount: challenges.length\n  })));\n}\n\n/**\n * Inits the loading of member subtrack challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubtrackChallengesInit(state, _ref8) {\n  var payload = _ref8.payload;\n  var handle = payload.handle,\n      uuid = payload.uuid;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { loadingSubTrackChallengesUUID: uuid })));\n}\n\n/**\n * Finalizes the loading of member subtrack challenges.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetSubtrackChallengesDone(state, _ref9) {\n  var error = _ref9.error,\n      payload = _ref9.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member subtrack challenges', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member subtrack challenges', '');\n    return state;\n  }\n\n  var uuid = payload.uuid,\n      challenges = payload.challenges,\n      refresh = payload.refresh,\n      handle = payload.handle;\n\n  if (uuid !== state[handle].loadingSubTrackChallengesUUID) return state;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    subtrackChallenges: state[handle].subtrackChallenges && !refresh ? [].concat((0, _toConsumableArray3.default)(state[handle].subtrackChallenges), (0, _toConsumableArray3.default)(challenges)) : challenges,\n    // if current query returns 0 item, mark it completed\n    subtrackChallengesHasMore: challenges && challenges.length > 0,\n    loadingSubTrackChallengesUUID: ''\n  })));\n}\n\n/**\n * Inits the loading of member SRMs.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserSRMInit(state, _ref10) {\n  var payload = _ref10.payload;\n  var handle = payload.handle,\n      uuid = payload.uuid;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { loadingSRMUUID: uuid })));\n}\n\n/**\n * Finalizes the loading of member SRMs.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserSRMDone(state, _ref11) {\n  var error = _ref11.error,\n      payload = _ref11.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member SRMs', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member SRMs', '');\n    return state;\n  }\n\n  var uuid = payload.uuid,\n      srms = payload.srms,\n      refresh = payload.refresh,\n      handle = payload.handle;\n\n  if (uuid !== state[handle].loadingSRMUUID) return state;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    userSRMs: state[handle].userSRMs && !refresh ? [].concat((0, _toConsumableArray3.default)(state[handle].userSRMs), (0, _toConsumableArray3.default)(srms)) : srms,\n    userSRMHasMore: srms && srms.length > 0, // if current query returns 0 item, mark it completed\n    loadingSRMUUID: ''\n  })));\n}\n\n/**\n * Inits the loading of member marathons.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserMarathonInit(state, _ref12) {\n  var payload = _ref12.payload;\n  var handle = payload.handle,\n      uuid = payload.uuid;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], { loadingMarathonUUID: uuid })));\n}\n\n/**\n * Finalizes the loading of member marathons.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetUserMarathonDone(state, _ref13) {\n  var error = _ref13.error,\n      payload = _ref13.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get member marathons', payload);\n    (0, _errors.fireErrorMessage)('Failed to get member marathons', '');\n    return state;\n  }\n\n  var uuid = payload.uuid,\n      marathons = payload.marathons,\n      refresh = payload.refresh,\n      handle = payload.handle;\n\n  if (uuid !== state[handle].loadingMarathonUUID) return state;\n\n  return (0, _extends21.default)({}, state, (0, _defineProperty3.default)({}, handle, (0, _extends21.default)({}, state[handle], {\n    userMarathons: state[handle].userMarathons && !refresh ? [].concat((0, _toConsumableArray3.default)(state[handle].userMarathons), (0, _toConsumableArray3.default)(marathons.challenges)) : marathons.challenges,\n    // if current query returns 0 item, mark it completed\n    userMarathonHasMore: marathons && marathons.challenges && marathons.challenges.length > 0,\n    loadingMarathonUUID: ''\n  })));\n}\n\n/**\n * Creates a new Members reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Members reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _members2.default.members;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.drop, onDrop), (0, _defineProperty3.default)(_handleActions, a.dropAll, onDropAll), (0, _defineProperty3.default)(_handleActions, a.getAchievementsInit, onGetAchievementsInit), (0, _defineProperty3.default)(_handleActions, a.getAchievementsDone, onGetAchievementsDone), (0, _defineProperty3.default)(_handleActions, a.getAchievementsV3Done, onGetAchievementsDone), (0, _defineProperty3.default)(_handleActions, a.getFinancesInit, onGetFinancesInit), (0, _defineProperty3.default)(_handleActions, a.getFinancesDone, onGetFinancesDone), (0, _defineProperty3.default)(_handleActions, a.getStatsInit, onGetStatsInit), (0, _defineProperty3.default)(_handleActions, a.getStatsDone, onGetStatsDone), (0, _defineProperty3.default)(_handleActions, a.getStatsHistoryInit, onGetStatsHistoryInit), (0, _defineProperty3.default)(_handleActions, a.getStatsHistoryDone, onGetStatsHistoryDone), (0, _defineProperty3.default)(_handleActions, a.getStatsDistributionInit, onGetStatsDistributionInit), (0, _defineProperty3.default)(_handleActions, a.getStatsDistributionDone, onGetStatsDistributionDone), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesInit, onGetActiveChallengesInit), (0, _defineProperty3.default)(_handleActions, a.getActiveChallengesDone, onGetActiveChallengesDone), (0, _defineProperty3.default)(_handleActions, a.getSubtrackChallengesInit, onGetSubtrackChallengesInit), (0, _defineProperty3.default)(_handleActions, a.getSubtrackChallengesDone, onGetSubtrackChallengesDone), (0, _defineProperty3.default)(_handleActions, a.getUserSrmInit, onGetUserSRMInit), (0, _defineProperty3.default)(_handleActions, a.getUserSrmDone, onGetUserSRMDone), (0, _defineProperty3.default)(_handleActions, a.getUserMarathonInit, onGetUserMarathonInit), (0, _defineProperty3.default)(_handleActions, a.getUserMarathonDone, onGetUserMarathonDone), _handleActions), initialState);\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onDrop, 'onDrop', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onDropAll, 'onDropAll', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetAchievementsInit, 'onGetAchievementsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetAchievementsDone, 'onGetAchievementsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetFinancesInit, 'onGetFinancesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetFinancesDone, 'onGetFinancesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsInit, 'onGetStatsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsDone, 'onGetStatsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsHistoryInit, 'onGetStatsHistoryInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsHistoryDone, 'onGetStatsHistoryDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsDistributionInit, 'onGetStatsDistributionInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetStatsDistributionDone, 'onGetStatsDistributionDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetActiveChallengesInit, 'onGetActiveChallengesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetActiveChallengesDone, 'onGetActiveChallengesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetSubtrackChallengesInit, 'onGetSubtrackChallengesInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetSubtrackChallengesDone, 'onGetSubtrackChallengesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserSRMInit, 'onGetUserSRMInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserSRMDone, 'onGetUserSRMDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserMarathonInit, 'onGetUserMarathonInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(onGetUserMarathonDone, 'onGetUserMarathonDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/members.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/members.js?");
 
 /***/ }),
 
@@ -736,7 +736,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _smp = __webpack_require__(/*! ../actions/smp */ \"./src/actions/smp.js\");\n\nvar _smp2 = _interopRequireDefault(_smp);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.my-submissions-management\"\n    * @desc  This reducer and corresponding actions control the logic for\n    *  submission management.\n    * @todo Document state segment structure.\n    */\n\n\n/**\n * Creates a new Submission management reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Submission management reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, _smp2.default.smp.deleteSubmissionDone, function (state) {\n    return (0, _extends3.default)({}, state, {\n      deletingSubmission: false\n    });\n  }), (0, _defineProperty3.default)(_handleActions, _smp2.default.smp.deleteSubmissionInit, function (state) {\n    return (0, _extends3.default)({}, state, {\n      deletingSubmission: true\n    });\n  }), _handleActions), _lodash2.default.defaults(initialState, {}));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/my-submissions-management.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/my-submissions-management.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/my-submissions-management.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/my-submissions-management.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _smp = __webpack_require__(/*! ../actions/smp */ \"./src/actions/smp.js\");\n\nvar _smp2 = _interopRequireDefault(_smp);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.my-submissions-management\"\n    * @desc  This reducer and corresponding actions control the logic for\n    *  submission management.\n    * @todo Document state segment structure.\n    */\n\n\n/**\n * Creates a new Submission management reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Submission management reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, _smp2.default.smp.deleteSubmissionDone, function (state) {\n    return (0, _extends3.default)({}, state, {\n      deletingSubmission: false\n    });\n  }), (0, _defineProperty3.default)(_handleActions, _smp2.default.smp.deleteSubmissionInit, function (state) {\n    return (0, _extends3.default)({}, state, {\n      deletingSubmission: true\n    });\n  }), _handleActions), _lodash2.default.defaults(initialState, {}));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/my-submissions-management.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/my-submissions-management.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/my-submissions-management.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/my-submissions-management.js?");
 
 /***/ }),
 
@@ -748,7 +748,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _profile = __webpack_require__(/*! ../actions/profile */ \"./src/actions/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.profile\"\n    * @desc Reducer for Profile API data\n    * @todo Document reducer state structure.\n    */\n\n\n/**\n * Handles PROFILE/GET_ACHIEVEMENTS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetAchievementsDone(state, _ref) {\n  var payload = _ref.payload,\n      error = _ref.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    achievements: payload.Achievements,\n    copilot: payload.copilot,\n    country: payload.country,\n    loadingError: false\n  });\n}\n\n/**\n * Handles PROFILE/GET_ACHIEVEMENTS_V3_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetAchievementsV3Done(state, _ref2) {\n  var payload = _ref2.payload,\n      error = _ref2.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    achievements: payload.achievements || [],\n    copilot: payload.copilot,\n    country: payload.country,\n    loadingError: false\n  });\n}\n\n/**\n * Handles PROFILE/GET_EXTERNAL_ACCOUNTS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetExternalAccountsDone(state, _ref3) {\n  var payload = _ref3.payload,\n      error = _ref3.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    externalAccounts: payload\n  });\n}\n\n/**\n * Handles PROFILE/GET_EXTERNAL_LINKS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetExternalLinksDone(state, _ref4) {\n  var payload = _ref4.payload,\n      error = _ref4.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    externalLinks: payload\n  });\n}\n\n/**\n * Handles PROFILE/GET_INFO_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetInfoDone(state, _ref5) {\n  var payload = _ref5.payload,\n      error = _ref5.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { info: payload, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_SKILLS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetSkillsDone(state, _ref6) {\n  var payload = _ref6.payload,\n      error = _ref6.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { skills: payload.skills, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_STATS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetStatsDone(state, _ref7) {\n  var payload = _ref7.payload,\n      error = _ref7.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { stats: payload, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_LINKED_ACCOUNTS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetLinkedAccountsDone(state, _ref8) {\n  var payload = _ref8.payload,\n      error = _ref8.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { linkedAccounts: payload.profiles, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_CREDENTIAL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetCredentialDone(state, _ref9) {\n  var payload = _ref9.payload,\n      error = _ref9.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { credential: payload.credential, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_EMAIL_PREFERENCES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetEmailPreferencesDone(state, _ref10) {\n  var payload = _ref10.payload,\n      error = _ref10.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { emailPreferences: payload.subscriptions, loadingError: false });\n}\n\n/**\n * Handles PROFILE/UPLOAD_PHOTO_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUploadPhotoDone(state, _ref11) {\n  var payload = _ref11.payload,\n      error = _ref11.error;\n\n  var newState = (0, _extends3.default)({}, state, { uploadingPhoto: false });\n\n  if (error) {\n    _logger2.default.error('Failed to upload user photo', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to upload photo!');\n    return newState;\n  }\n\n  if (!newState.info || newState.info.handle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    info: (0, _extends3.default)({}, newState.info, {\n      photoURL: payload.photoURL\n    })\n  });\n}\n\n/**\n * Handles PROFILE/DELETE_PHOTO_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onDeletePhotoDone(state, _ref12) {\n  var payload = _ref12.payload,\n      error = _ref12.error;\n\n  var newState = (0, _extends3.default)({}, state, { deletingPhoto: false });\n\n  if (error) {\n    _logger2.default.error('Failed to delete user photo', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to delete photo!');\n    return newState;\n  }\n\n  if (!newState.info || newState.info.handle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    info: (0, _extends3.default)({}, newState.info, {\n      photoURL: null\n    })\n  });\n}\n\n/**\n * Handles PROFILE/UPDATE_PROFILE_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUpdateProfileDone(state, _ref13) {\n  var payload = _ref13.payload,\n      error = _ref13.error;\n\n  var newState = (0, _extends3.default)({}, state, { updatingProfile: false });\n\n  if (payload.isEmailConflict) {\n    return (0, _extends3.default)({}, newState, {\n      isEmailConflict: true,\n      updateProfileSuccess: false\n    });\n  }\n\n  if (error) {\n    _logger2.default.error('Failed to update user profile', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to update user profile!');\n    return (0, _extends3.default)({}, newState, {\n      updateProfileSuccess: false\n    });\n  }\n\n  if (!newState.info || newState.info.handle !== payload.handle) {\n    return (0, _extends3.default)({}, newState, {\n      updateProfileSuccess: true\n    });\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    info: (0, _extends3.default)({}, newState.info, payload),\n    updateProfileSuccess: true\n  });\n}\n\n/**\n * Handles PROFILE/ADD_SKILL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onAddSkillDone(state, _ref14) {\n  var payload = _ref14.payload,\n      error = _ref14.error;\n\n  var newState = (0, _extends3.default)({}, state, { addingSkill: false });\n\n  if (error) {\n    _logger2.default.error('Failed to add user skill', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to add user skill!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    skills: payload.skills\n  });\n}\n\n/**\n * Handles PROFILE/HIDE_SKILL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onHideSkillDone(state, _ref15) {\n  var payload = _ref15.payload,\n      error = _ref15.error;\n\n  var newState = (0, _extends3.default)({}, state, { hidingSkill: false });\n\n  if (error) {\n    _logger2.default.error('Failed to remove user skill', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to remove user skill!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    skills: payload.skills\n  });\n}\n\n/**\n * Handles PROFILE/ADD_WEB_LINK_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onAddWebLinkDone(state, _ref16) {\n  var payload = _ref16.payload,\n      error = _ref16.error;\n\n  var newState = (0, _extends3.default)({}, state, { addingWebLink: false });\n\n  if (error) {\n    _logger2.default.error('Failed to add web link', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to add web link!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    externalLinks: [].concat((0, _toConsumableArray3.default)(newState.externalLinks), [payload.data])\n  });\n}\n\n/**\n * Handles PROFILE/DELETE_WEB_LINK_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onDeleteWebLinkDone(state, _ref17) {\n  var payload = _ref17.payload,\n      error = _ref17.error;\n\n  var newState = (0, _extends3.default)({}, state, { deletingWebLink: false });\n\n  if (error) {\n    _logger2.default.error('Failed to delete web link', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to delete web link!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    externalLinks: _lodash2.default.filter(newState.externalLinks, function (el) {\n      return el.key !== payload.data.key;\n    })\n  });\n}\n\n/**\n * Handles PROFILE/LINK_EXTERNAL_ACCOUNT_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onLinkExternalAccountDone(state, _ref18) {\n  var payload = _ref18.payload,\n      error = _ref18.error;\n\n  var newState = (0, _extends3.default)({}, state, { linkingExternalAccount: false });\n\n  if (error) {\n    _logger2.default.error('Failed to link external account', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to link external account!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    linkedAccounts: [].concat((0, _toConsumableArray3.default)(newState.linkedAccounts), [payload.data])\n  });\n}\n\n/**\n * Handles PROFILE/UNLINK_EXTERNAL_ACCOUNT_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUnlinkExternalAccountDone(state, _ref19) {\n  var payload = _ref19.payload,\n      error = _ref19.error;\n\n  var newState = (0, _extends3.default)({}, state, { unlinkingExternalAccount: false });\n\n  if (error) {\n    _logger2.default.error('Failed to unlink external account', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to unlink external account!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    linkedAccounts: _lodash2.default.filter(newState.linkedAccounts, function (el) {\n      return el.providerType !== payload.providerType;\n    })\n  });\n}\n\n/**\n * Handles PROFILE/SAVE_EMAIL_PREFERENCES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onSaveEmailPreferencesDone(state, _ref20) {\n  var payload = _ref20.payload,\n      error = _ref20.error;\n\n  var newState = (0, _extends3.default)({}, state, { savingEmailPreferences: false });\n\n  if (error) {\n    _logger2.default.error('Failed to save email preferences', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to save email preferences!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    emailPreferences: payload.data.subscriptions\n  });\n}\n\n/**\n * Handles PROFILE/UPDATE_PASSWORD_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUpdatePasswordDone(state, _ref21) {\n  var payload = _ref21.payload,\n      error = _ref21.error;\n\n  var newState = (0, _extends3.default)({}, state, { updatingPassword: false });\n\n  if (error) {\n    _logger2.default.error('Failed to update password', payload);\n    (0, _errors.fireErrorMessage)('The old password is invalid');\n  }\n  return newState;\n}\n\n/**\n * Handles PROFILE/VERIFY_MEMBER_NEW_EMAIL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onVerifyMemberNewEmailDone(state, _ref22) {\n  var payload = _ref22.payload,\n      error = _ref22.error;\n\n  var newState = (0, _extends3.default)({}, state, { verifyingEmail: false });\n\n  if (error) {\n    _logger2.default.error('Failed to verify member new email', payload);\n    return (0, _extends3.default)({}, newState, {\n      verifyError: true\n    });\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    verifyError: false,\n    emailChangeResult: payload.data\n  });\n}\n\n/**\n * Handles UPDATE_EMAIL_CONFLICT action\n * @param {Object} state\n * @param {Object} action Payload will be a boolean value\n * @return {Object} New state\n */\nfunction onUpdateEmailConflict(state, _ref23) {\n  var payload = _ref23.payload;\n\n  return (0, _extends3.default)({}, state, {\n    isEmailConflict: payload\n  });\n}\n\n/**\n * Creates a new Profile reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Profile reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _profile2.default.profile;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.clearProfile, function (state) {\n    return (0, _extends3.default)({}, state, { achievements: null, country: '', info: null, skills: null, stats: null\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.loadProfile, function (state, action) {\n    return (0, _extends3.default)({}, state, { profileForHandle: action.payload });\n  }), (0, _defineProperty3.default)(_handleActions, a.getAchievementsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getAchievementsDone, onGetAchievementsDone), (0, _defineProperty3.default)(_handleActions, a.getAchievementsV3Done, onGetAchievementsV3Done), (0, _defineProperty3.default)(_handleActions, a.getExternalAccountsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getExternalAccountsDone, onGetExternalAccountsDone), (0, _defineProperty3.default)(_handleActions, a.getExternalLinksInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getExternalLinksDone, onGetExternalLinksDone), (0, _defineProperty3.default)(_handleActions, a.getInfoInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getInfoDone, onGetInfoDone), (0, _defineProperty3.default)(_handleActions, a.getSkillsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getSkillsDone, onGetSkillsDone), (0, _defineProperty3.default)(_handleActions, a.getStatsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getStatsDone, onGetStatsDone), (0, _defineProperty3.default)(_handleActions, a.getLinkedAccountsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getLinkedAccountsDone, onGetLinkedAccountsDone), (0, _defineProperty3.default)(_handleActions, a.uploadPhotoInit, function (state) {\n    return (0, _extends3.default)({}, state, { uploadingPhoto: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.uploadPhotoDone, onUploadPhotoDone), (0, _defineProperty3.default)(_handleActions, a.deletePhotoInit, function (state) {\n    return (0, _extends3.default)({}, state, { deletingPhoto: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.deletePhotoDone, onDeletePhotoDone), (0, _defineProperty3.default)(_handleActions, a.updateProfileInit, function (state) {\n    return (0, _extends3.default)({}, state, { updatingProfile: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.updateProfileDone, onUpdateProfileDone), (0, _defineProperty3.default)(_handleActions, a.addSkillInit, function (state) {\n    return (0, _extends3.default)({}, state, { addingSkill: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.addSkillDone, onAddSkillDone), (0, _defineProperty3.default)(_handleActions, a.hideSkillInit, function (state) {\n    return (0, _extends3.default)({}, state, { hidingSkill: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.hideSkillDone, onHideSkillDone), (0, _defineProperty3.default)(_handleActions, a.addWebLinkInit, function (state) {\n    return (0, _extends3.default)({}, state, { addingWebLink: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.addWebLinkDone, onAddWebLinkDone), (0, _defineProperty3.default)(_handleActions, a.deleteWebLinkInit, function (state) {\n    return (0, _extends3.default)({}, state, { deletingWebLink: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.deleteWebLinkDone, onDeleteWebLinkDone), (0, _defineProperty3.default)(_handleActions, a.linkExternalAccountInit, function (state) {\n    return (0, _extends3.default)({}, state, { linkingExternalAccount: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.linkExternalAccountDone, onLinkExternalAccountDone), (0, _defineProperty3.default)(_handleActions, a.unlinkExternalAccountInit, function (state) {\n    return (0, _extends3.default)({}, state, { unlinkingExternalAccount: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.unlinkExternalAccountDone, onUnlinkExternalAccountDone), (0, _defineProperty3.default)(_handleActions, a.getCredentialInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getCredentialDone, onGetCredentialDone), (0, _defineProperty3.default)(_handleActions, a.getEmailPreferencesInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getEmailPreferencesDone, onGetEmailPreferencesDone), (0, _defineProperty3.default)(_handleActions, a.saveEmailPreferencesInit, function (state) {\n    return (0, _extends3.default)({}, state, { savingEmailPreferences: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.saveEmailPreferencesDone, onSaveEmailPreferencesDone), (0, _defineProperty3.default)(_handleActions, a.updatePasswordInit, function (state) {\n    return (0, _extends3.default)({}, state, { updatingPassword: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.updatePasswordDone, onUpdatePasswordDone), (0, _defineProperty3.default)(_handleActions, a.verifyMemberNewEmailInit, function (state) {\n    return (0, _extends3.default)({}, state, { verifyingEmail: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.verifyMemberNewEmailDone, onVerifyMemberNewEmailDone), (0, _defineProperty3.default)(_handleActions, a.updateEmailConflict, onUpdateEmailConflict), _handleActions), _lodash2.default.defaults(initialState, {\n    achievements: null,\n    copilot: false,\n    country: '',\n    info: null,\n    loadingError: false,\n    skills: null,\n    stats: null,\n    verifyError: null,\n    updateProfileSuccess: null\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @returns {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/* Reducer with the default initial state. */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetAchievementsDone, 'onGetAchievementsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetAchievementsV3Done, 'onGetAchievementsV3Done', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetExternalAccountsDone, 'onGetExternalAccountsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetExternalLinksDone, 'onGetExternalLinksDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetInfoDone, 'onGetInfoDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetSkillsDone, 'onGetSkillsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetStatsDone, 'onGetStatsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetLinkedAccountsDone, 'onGetLinkedAccountsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetCredentialDone, 'onGetCredentialDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetEmailPreferencesDone, 'onGetEmailPreferencesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUploadPhotoDone, 'onUploadPhotoDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onDeletePhotoDone, 'onDeletePhotoDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUpdateProfileDone, 'onUpdateProfileDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onAddSkillDone, 'onAddSkillDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onHideSkillDone, 'onHideSkillDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onAddWebLinkDone, 'onAddWebLinkDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onDeleteWebLinkDone, 'onDeleteWebLinkDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onLinkExternalAccountDone, 'onLinkExternalAccountDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUnlinkExternalAccountDone, 'onUnlinkExternalAccountDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onSaveEmailPreferencesDone, 'onSaveEmailPreferencesDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUpdatePasswordDone, 'onUpdatePasswordDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onVerifyMemberNewEmailDone, 'onVerifyMemberNewEmailDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUpdateEmailConflict, 'onUpdateEmailConflict', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/profile.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/profile.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _profile = __webpack_require__(/*! ../actions/profile */ \"./src/actions/profile.js\");\n\nvar _profile2 = _interopRequireDefault(_profile);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.profile\"\n    * @desc Reducer for Profile API data\n    * @todo Document reducer state structure.\n    */\n\n\n/**\n * Handles PROFILE/GET_ACHIEVEMENTS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetAchievementsDone(state, _ref) {\n  var payload = _ref.payload,\n      error = _ref.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    achievements: payload.Achievements,\n    copilot: payload.copilot,\n    country: payload.country,\n    loadingError: false\n  });\n}\n\n/**\n * Handles PROFILE/GET_ACHIEVEMENTS_V3_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetAchievementsV3Done(state, _ref2) {\n  var payload = _ref2.payload,\n      error = _ref2.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    achievements: payload.achievements || [],\n    copilot: payload.copilot,\n    country: payload.country,\n    loadingError: false\n  });\n}\n\n/**\n * Handles PROFILE/GET_EXTERNAL_ACCOUNTS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetExternalAccountsDone(state, _ref3) {\n  var payload = _ref3.payload,\n      error = _ref3.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    externalAccounts: payload\n  });\n}\n\n/**\n * Handles PROFILE/GET_EXTERNAL_LINKS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetExternalLinksDone(state, _ref4) {\n  var payload = _ref4.payload,\n      error = _ref4.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    externalLinks: payload\n  });\n}\n\n/**\n * Handles PROFILE/GET_INFO_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetInfoDone(state, _ref5) {\n  var payload = _ref5.payload,\n      error = _ref5.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { info: payload, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_SKILLS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetSkillsDone(state, _ref6) {\n  var payload = _ref6.payload,\n      error = _ref6.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { skills: payload.skills, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_STATS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetStatsDone(state, _ref7) {\n  var payload = _ref7.payload,\n      error = _ref7.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { stats: payload, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_LINKED_ACCOUNTS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetLinkedAccountsDone(state, _ref8) {\n  var payload = _ref8.payload,\n      error = _ref8.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { linkedAccounts: payload.profiles, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_CREDENTIAL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetCredentialDone(state, _ref9) {\n  var payload = _ref9.payload,\n      error = _ref9.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { credential: payload.credential, loadingError: false });\n}\n\n/**\n * Handles PROFILE/GET_EMAIL_PREFERENCES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetEmailPreferencesDone(state, _ref10) {\n  var payload = _ref10.payload,\n      error = _ref10.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, { loadingError: true });\n  }\n\n  return (0, _extends3.default)({}, state, { emailPreferences: payload.subscriptions, loadingError: false });\n}\n\n/**\n * Handles PROFILE/UPLOAD_PHOTO_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUploadPhotoDone(state, _ref11) {\n  var payload = _ref11.payload,\n      error = _ref11.error;\n\n  var newState = (0, _extends3.default)({}, state, { uploadingPhoto: false });\n\n  if (error) {\n    _logger2.default.error('Failed to upload user photo', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to upload photo!');\n    return newState;\n  }\n\n  if (!newState.info || newState.info.handle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    info: (0, _extends3.default)({}, newState.info, {\n      photoURL: payload.photoURL\n    })\n  });\n}\n\n/**\n * Handles PROFILE/DELETE_PHOTO_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onDeletePhotoDone(state, _ref12) {\n  var payload = _ref12.payload,\n      error = _ref12.error;\n\n  var newState = (0, _extends3.default)({}, state, { deletingPhoto: false });\n\n  if (error) {\n    _logger2.default.error('Failed to delete user photo', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to delete photo!');\n    return newState;\n  }\n\n  if (!newState.info || newState.info.handle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    info: (0, _extends3.default)({}, newState.info, {\n      photoURL: null\n    })\n  });\n}\n\n/**\n * Handles PROFILE/UPDATE_PROFILE_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUpdateProfileDone(state, _ref13) {\n  var payload = _ref13.payload,\n      error = _ref13.error;\n\n  var newState = (0, _extends3.default)({}, state, { updatingProfile: false });\n\n  if (payload.isEmailConflict) {\n    return (0, _extends3.default)({}, newState, {\n      isEmailConflict: true,\n      updateProfileSuccess: false\n    });\n  }\n\n  if (error) {\n    _logger2.default.error('Failed to update user profile', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to update user profile!');\n    return (0, _extends3.default)({}, newState, {\n      updateProfileSuccess: false\n    });\n  }\n\n  if (!newState.info || newState.info.handle !== payload.handle) {\n    return (0, _extends3.default)({}, newState, {\n      updateProfileSuccess: true\n    });\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    info: (0, _extends3.default)({}, newState.info, payload),\n    updateProfileSuccess: true\n  });\n}\n\n/**\n * Handles PROFILE/ADD_SKILL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onAddSkillDone(state, _ref14) {\n  var payload = _ref14.payload,\n      error = _ref14.error;\n\n  var newState = (0, _extends3.default)({}, state, { addingSkill: false });\n\n  if (error) {\n    _logger2.default.error('Failed to add user skill', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to add user skill!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    skills: payload.skills\n  });\n}\n\n/**\n * Handles PROFILE/HIDE_SKILL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onHideSkillDone(state, _ref15) {\n  var payload = _ref15.payload,\n      error = _ref15.error;\n\n  var newState = (0, _extends3.default)({}, state, { hidingSkill: false });\n\n  if (error) {\n    _logger2.default.error('Failed to remove user skill', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to remove user skill!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    skills: payload.skills\n  });\n}\n\n/**\n * Handles PROFILE/ADD_WEB_LINK_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onAddWebLinkDone(state, _ref16) {\n  var payload = _ref16.payload,\n      error = _ref16.error;\n\n  var newState = (0, _extends3.default)({}, state, { addingWebLink: false });\n\n  if (error) {\n    _logger2.default.error('Failed to add web link', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to add web link!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    externalLinks: [].concat((0, _toConsumableArray3.default)(newState.externalLinks), [payload.data])\n  });\n}\n\n/**\n * Handles PROFILE/DELETE_WEB_LINK_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onDeleteWebLinkDone(state, _ref17) {\n  var payload = _ref17.payload,\n      error = _ref17.error;\n\n  var newState = (0, _extends3.default)({}, state, { deletingWebLink: false });\n\n  if (error) {\n    _logger2.default.error('Failed to delete web link', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to delete web link!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    externalLinks: _lodash2.default.filter(newState.externalLinks, function (el) {\n      return el.key !== payload.data.key;\n    })\n  });\n}\n\n/**\n * Handles PROFILE/LINK_EXTERNAL_ACCOUNT_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onLinkExternalAccountDone(state, _ref18) {\n  var payload = _ref18.payload,\n      error = _ref18.error;\n\n  var newState = (0, _extends3.default)({}, state, { linkingExternalAccount: false });\n\n  if (error) {\n    _logger2.default.error('Failed to link external account', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to link external account!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    linkedAccounts: [].concat((0, _toConsumableArray3.default)(newState.linkedAccounts), [payload.data])\n  });\n}\n\n/**\n * Handles PROFILE/UNLINK_EXTERNAL_ACCOUNT_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUnlinkExternalAccountDone(state, _ref19) {\n  var payload = _ref19.payload,\n      error = _ref19.error;\n\n  var newState = (0, _extends3.default)({}, state, { unlinkingExternalAccount: false });\n\n  if (error) {\n    _logger2.default.error('Failed to unlink external account', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to unlink external account!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    linkedAccounts: _lodash2.default.filter(newState.linkedAccounts, function (el) {\n      return el.providerType !== payload.providerType;\n    })\n  });\n}\n\n/**\n * Handles PROFILE/SAVE_EMAIL_PREFERENCES_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onSaveEmailPreferencesDone(state, _ref20) {\n  var payload = _ref20.payload,\n      error = _ref20.error;\n\n  var newState = (0, _extends3.default)({}, state, { savingEmailPreferences: false });\n\n  if (error) {\n    _logger2.default.error('Failed to save email preferences', payload);\n    (0, _errors.fireErrorMessage)('ERROR: Failed to save email preferences!');\n    return newState;\n  }\n\n  if (newState.profileForHandle !== payload.handle || !payload.data) {\n    return newState;\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    emailPreferences: payload.data.subscriptions\n  });\n}\n\n/**\n * Handles PROFILE/UPDATE_PASSWORD_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onUpdatePasswordDone(state, _ref21) {\n  var payload = _ref21.payload,\n      error = _ref21.error;\n\n  var newState = (0, _extends3.default)({}, state, { updatingPassword: false });\n\n  if (error) {\n    _logger2.default.error('Failed to update password', payload);\n    (0, _errors.fireErrorMessage)('The old password is invalid');\n  }\n  return newState;\n}\n\n/**\n * Handles PROFILE/VERIFY_MEMBER_NEW_EMAIL_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onVerifyMemberNewEmailDone(state, _ref22) {\n  var payload = _ref22.payload,\n      error = _ref22.error;\n\n  var newState = (0, _extends3.default)({}, state, { verifyingEmail: false });\n\n  if (error) {\n    _logger2.default.error('Failed to verify member new email', payload);\n    return (0, _extends3.default)({}, newState, {\n      verifyError: true\n    });\n  }\n\n  return (0, _extends3.default)({}, newState, {\n    verifyError: false,\n    emailChangeResult: payload.data\n  });\n}\n\n/**\n * Handles UPDATE_EMAIL_CONFLICT action\n * @param {Object} state\n * @param {Object} action Payload will be a boolean value\n * @return {Object} New state\n */\nfunction onUpdateEmailConflict(state, _ref23) {\n  var payload = _ref23.payload;\n\n  return (0, _extends3.default)({}, state, {\n    isEmailConflict: payload\n  });\n}\n\n/**\n * Creates a new Profile reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Profile reducer.\n */\nfunction create(initialState) {\n  var _handleActions;\n\n  var a = _profile2.default.profile;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.clearProfile, function (state) {\n    return (0, _extends3.default)({}, state, { achievements: null, country: '', info: null, skills: null, stats: null\n    });\n  }), (0, _defineProperty3.default)(_handleActions, a.loadProfile, function (state, action) {\n    return (0, _extends3.default)({}, state, { profileForHandle: action.payload });\n  }), (0, _defineProperty3.default)(_handleActions, a.getAchievementsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getAchievementsDone, onGetAchievementsDone), (0, _defineProperty3.default)(_handleActions, a.getAchievementsV3Done, onGetAchievementsV3Done), (0, _defineProperty3.default)(_handleActions, a.getExternalAccountsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getExternalAccountsDone, onGetExternalAccountsDone), (0, _defineProperty3.default)(_handleActions, a.getExternalLinksInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getExternalLinksDone, onGetExternalLinksDone), (0, _defineProperty3.default)(_handleActions, a.getInfoInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getInfoDone, onGetInfoDone), (0, _defineProperty3.default)(_handleActions, a.getSkillsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getSkillsDone, onGetSkillsDone), (0, _defineProperty3.default)(_handleActions, a.getStatsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getStatsDone, onGetStatsDone), (0, _defineProperty3.default)(_handleActions, a.getLinkedAccountsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getLinkedAccountsDone, onGetLinkedAccountsDone), (0, _defineProperty3.default)(_handleActions, a.uploadPhotoInit, function (state) {\n    return (0, _extends3.default)({}, state, { uploadingPhoto: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.uploadPhotoDone, onUploadPhotoDone), (0, _defineProperty3.default)(_handleActions, a.deletePhotoInit, function (state) {\n    return (0, _extends3.default)({}, state, { deletingPhoto: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.deletePhotoDone, onDeletePhotoDone), (0, _defineProperty3.default)(_handleActions, a.updateProfileInit, function (state) {\n    return (0, _extends3.default)({}, state, { updatingProfile: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.updateProfileDone, onUpdateProfileDone), (0, _defineProperty3.default)(_handleActions, a.addSkillInit, function (state) {\n    return (0, _extends3.default)({}, state, { addingSkill: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.addSkillDone, onAddSkillDone), (0, _defineProperty3.default)(_handleActions, a.hideSkillInit, function (state) {\n    return (0, _extends3.default)({}, state, { hidingSkill: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.hideSkillDone, onHideSkillDone), (0, _defineProperty3.default)(_handleActions, a.addWebLinkInit, function (state) {\n    return (0, _extends3.default)({}, state, { addingWebLink: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.addWebLinkDone, onAddWebLinkDone), (0, _defineProperty3.default)(_handleActions, a.deleteWebLinkInit, function (state) {\n    return (0, _extends3.default)({}, state, { deletingWebLink: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.deleteWebLinkDone, onDeleteWebLinkDone), (0, _defineProperty3.default)(_handleActions, a.linkExternalAccountInit, function (state) {\n    return (0, _extends3.default)({}, state, { linkingExternalAccount: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.linkExternalAccountDone, onLinkExternalAccountDone), (0, _defineProperty3.default)(_handleActions, a.unlinkExternalAccountInit, function (state) {\n    return (0, _extends3.default)({}, state, { unlinkingExternalAccount: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.unlinkExternalAccountDone, onUnlinkExternalAccountDone), (0, _defineProperty3.default)(_handleActions, a.getCredentialInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getCredentialDone, onGetCredentialDone), (0, _defineProperty3.default)(_handleActions, a.getEmailPreferencesInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_handleActions, a.getEmailPreferencesDone, onGetEmailPreferencesDone), (0, _defineProperty3.default)(_handleActions, a.saveEmailPreferencesInit, function (state) {\n    return (0, _extends3.default)({}, state, { savingEmailPreferences: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.saveEmailPreferencesDone, onSaveEmailPreferencesDone), (0, _defineProperty3.default)(_handleActions, a.updatePasswordInit, function (state) {\n    return (0, _extends3.default)({}, state, { updatingPassword: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.updatePasswordDone, onUpdatePasswordDone), (0, _defineProperty3.default)(_handleActions, a.verifyMemberNewEmailInit, function (state) {\n    return (0, _extends3.default)({}, state, { verifyingEmail: true });\n  }), (0, _defineProperty3.default)(_handleActions, a.verifyMemberNewEmailDone, onVerifyMemberNewEmailDone), (0, _defineProperty3.default)(_handleActions, a.updateEmailConflict, onUpdateEmailConflict), _handleActions), _lodash2.default.defaults(initialState, {\n    achievements: null,\n    copilot: false,\n    country: '',\n    info: null,\n    loadingError: false,\n    skills: null,\n    stats: null,\n    verifyError: null,\n    updateProfileSuccess: null\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @returns {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/* Reducer with the default initial state. */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetAchievementsDone, 'onGetAchievementsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetAchievementsV3Done, 'onGetAchievementsV3Done', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetExternalAccountsDone, 'onGetExternalAccountsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetExternalLinksDone, 'onGetExternalLinksDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetInfoDone, 'onGetInfoDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetSkillsDone, 'onGetSkillsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetStatsDone, 'onGetStatsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetLinkedAccountsDone, 'onGetLinkedAccountsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetCredentialDone, 'onGetCredentialDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onGetEmailPreferencesDone, 'onGetEmailPreferencesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUploadPhotoDone, 'onUploadPhotoDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onDeletePhotoDone, 'onDeletePhotoDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUpdateProfileDone, 'onUpdateProfileDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onAddSkillDone, 'onAddSkillDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onHideSkillDone, 'onHideSkillDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onAddWebLinkDone, 'onAddWebLinkDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onDeleteWebLinkDone, 'onDeleteWebLinkDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onLinkExternalAccountDone, 'onLinkExternalAccountDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUnlinkExternalAccountDone, 'onUnlinkExternalAccountDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onSaveEmailPreferencesDone, 'onSaveEmailPreferencesDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUpdatePasswordDone, 'onUpdatePasswordDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onVerifyMemberNewEmailDone, 'onVerifyMemberNewEmailDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(onUpdateEmailConflict, 'onUpdateEmailConflict', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/profile.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/profile.js?");
 
 /***/ }),
 
@@ -760,7 +760,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _reviewOpportunity = __webpack_require__(/*! ../actions/reviewOpportunity */ \"./src/actions/reviewOpportunity.js\");\n\nvar _reviewOpportunity2 = _interopRequireDefault(_reviewOpportunity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.reviewOpportunity\"\n    * @desc Reducer for state.reviewOpportunity\n    * @todo Document state structure.\n    */\n\n/**\n * Generates a list of unique terms ids required for the open review roles\n * with an agreed field\n *\n * @param {Object} details Review Opportuny details from API\n * @return {Array} List of unique terms\n */\nfunction buildRequiredTermsList(details) {\n  var roles = details.payments.map(function (payment) {\n    return payment.role;\n  });\n\n  var requiredTerms = _lodash2.default.uniqBy(details.challenge.terms\n  // Sometimes roles such as Primary Reviewer have no directly equal\n  // terms entry.  Include the plain Reviewer terms when present as a back-up.\n  .filter(function (term) {\n    return term.role === 'Reviewer' || _lodash2.default.includes(roles, term.role);\n  }).map(function (term) {\n    return _lodash2.default.pick(term, ['termsOfUseId', 'agreed', 'title']);\n  }), function (term) {\n    return term.termsOfUseId;\n  });\n\n  return requiredTerms || [];\n}\n\n/**\n * Handles REVIEW_OPPORTUNITY/GET__DETAILS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetDetailsDone(state, _ref) {\n  var payload = _ref.payload,\n      error = _ref.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, {\n      authError: true,\n      isLoadingDetails: false\n    });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    details: payload,\n    isLoadingDetails: false,\n    requiredTerms: buildRequiredTermsList(payload)\n  });\n}\n\n/**\n * Creates a new Review opportunity reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Review opportunity reducer.\n */\nfunction create(initialState) {\n  var _redux$handleActions;\n\n  var a = _reviewOpportunity2.default.reviewOpportunity;\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, a.cancelApplicationsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.cancelApplicationsDone, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.getDetailsInit, function (state) {\n    return (0, _extends3.default)({}, state, { isLoadingDetails: true });\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.getDetailsDone, onGetDetailsDone), (0, _defineProperty3.default)(_redux$handleActions, a.submitApplicationsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.submitApplicationsDone, function (state) {\n    return state;\n  }), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    authError: false,\n    details: null,\n    isLoadingDetails: false,\n    requiredTerms: []\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @param {Object} options={} Optional. Options object for initial state.\n * @param {String} [options.auth.tokenV2=''] The V2 auth token\n * @param {String} [options.auth.tokenV3=''] The V3 auth token\n * @param {String} [options.reviewOpportunity.challenge.id=''] The challenge id.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var challengeId = _lodash2.default.get(options, 'reviewOpportunity.challenge.id');\n\n  if (challengeId) {\n    var tokens = {\n      tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n      tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n    };\n\n    var a = _reviewOpportunity2.default.reviewOpportunity;\n    return _topcoderReactUtils.redux.resolveAction(a.getDetailsDone(challengeId, tokens.tokenV3)).then(function (_ref2) {\n      var error = _ref2.error,\n          payload = _ref2.payload;\n\n      var initialState = {};\n      initialState.details = error ? null : payload;\n      initialState.requiredTerms = error ? [] : buildRequiredTermsList(payload);\n      create(initialState);\n    });\n  }\n\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(buildRequiredTermsList, 'buildRequiredTermsList', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(onGetDetailsDone, 'onGetDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/reviewOpportunity.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _reviewOpportunity = __webpack_require__(/*! ../actions/reviewOpportunity */ \"./src/actions/reviewOpportunity.js\");\n\nvar _reviewOpportunity2 = _interopRequireDefault(_reviewOpportunity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.reviewOpportunity\"\n    * @desc Reducer for state.reviewOpportunity\n    * @todo Document state structure.\n    */\n\n/**\n * Generates a list of unique terms ids required for the open review roles\n * with an agreed field\n *\n * @param {Object} details Review Opportuny details from API\n * @return {Array} List of unique terms\n */\nfunction buildRequiredTermsList(details) {\n  var roles = details.payments.map(function (payment) {\n    return payment.role;\n  });\n\n  var requiredTerms = _lodash2.default.uniqBy(details.challenge.terms\n  // Sometimes roles such as Primary Reviewer have no directly equal\n  // terms entry.  Include the plain Reviewer terms when present as a back-up.\n  .filter(function (term) {\n    return term.role === 'Reviewer' || _lodash2.default.includes(roles, term.role);\n  }).map(function (term) {\n    return _lodash2.default.pick(term, ['termsOfUseId', 'agreed', 'title']);\n  }), function (term) {\n    return term.termsOfUseId;\n  });\n\n  return requiredTerms || [];\n}\n\n/**\n * Handles REVIEW_OPPORTUNITY/GET__DETAILS_DONE action.\n * @param {Object} state\n * @param {Object} action Payload will be JSON from api call\n * @return {Object} New state\n */\nfunction onGetDetailsDone(state, _ref) {\n  var payload = _ref.payload,\n      error = _ref.error;\n\n  if (error) {\n    return (0, _extends3.default)({}, state, {\n      authError: true,\n      isLoadingDetails: false\n    });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    details: payload,\n    isLoadingDetails: false,\n    requiredTerms: buildRequiredTermsList(payload)\n  });\n}\n\n/**\n * Creates a new Review opportunity reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Review opportunity reducer.\n */\nfunction create(initialState) {\n  var _redux$handleActions;\n\n  var a = _reviewOpportunity2.default.reviewOpportunity;\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, a.cancelApplicationsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.cancelApplicationsDone, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.getDetailsInit, function (state) {\n    return (0, _extends3.default)({}, state, { isLoadingDetails: true });\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.getDetailsDone, onGetDetailsDone), (0, _defineProperty3.default)(_redux$handleActions, a.submitApplicationsInit, function (state) {\n    return state;\n  }), (0, _defineProperty3.default)(_redux$handleActions, a.submitApplicationsDone, function (state) {\n    return state;\n  }), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    authError: false,\n    details: null,\n    isLoadingDetails: false,\n    requiredTerms: []\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @param {Object} options={} Optional. Options object for initial state.\n * @param {String} [options.auth.tokenV2=''] The V2 auth token\n * @param {String} [options.auth.tokenV3=''] The V3 auth token\n * @param {String} [options.reviewOpportunity.challenge.id=''] The challenge id.\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var challengeId = _lodash2.default.get(options, 'reviewOpportunity.challenge.id');\n\n  if (challengeId) {\n    var tokens = {\n      tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n      tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n    };\n\n    var a = _reviewOpportunity2.default.reviewOpportunity;\n    return _topcoderReactUtils.redux.resolveAction(a.getDetailsDone(challengeId, tokens.tokenV3)).then(function (_ref2) {\n      var error = _ref2.error,\n          payload = _ref2.payload;\n\n      var initialState = {};\n      initialState.details = error ? null : payload;\n      initialState.requiredTerms = error ? [] : buildRequiredTermsList(payload);\n      create(initialState);\n    });\n  }\n\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(buildRequiredTermsList, 'buildRequiredTermsList', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(onGetDetailsDone, 'onGetDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/reviewOpportunity.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/reviewOpportunity.js?");
 
 /***/ }),
 
@@ -772,7 +772,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _settings = __webpack_require__(/*! ../actions/settings */ \"./src/actions/settings.js\");\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.settings\"\n    * @desc Reducer for the Redux store segment that holds traits data.\n    */\n\n/**\n * Handles SETTINGS/GET_ALL_USER_TRAITS action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetAllUserTraits(state, _ref) {\n  var error = _ref.error,\n      payload = _ref.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get all user traits', payload);\n    return (0, _extends3.default)({}, state, {\n      userTraits: []\n    });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    userTraits: payload.data\n  });\n}\n\n/**\n * Handles SETTINGS/MODIFY_USER_TRAIT_INIT action.\n * @param {Object} state *\n * @return {Object} New state.\n */\nfunction onModifyUserTraitInit(state) {\n  return (0, _extends3.default)({}, state, {\n    traitRequestCount: state.traitRequestCount + 1\n  });\n}\n\n/**\n * Handles SETTINGS/ADD_USER_TRAIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onAddUserTrait(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to add user trait', payload);\n    (0, _errors.fireErrorMessage)('Failed to add user trait', '');\n    return (0, _extends3.default)({}, state, {\n      traitRequestCount: state.traitRequestCount - 1\n    });\n  }\n  var newData = payload.result[0];\n  return (0, _extends3.default)({}, state, {\n    userTraits: [].concat((0, _toConsumableArray3.default)(state.userTraits), [newData]),\n    traitRequestCount: state.traitRequestCount - 1\n  });\n}\n\n/**\n * Handles SETTINGS/UPDATE_USER_TRAIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onUpdateUserTrait(state, _ref3) {\n  var error = _ref3.error,\n      payload = _ref3.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to update user trait', payload);\n    (0, _errors.fireErrorMessage)('Failed to update user trait', '');\n    return (0, _extends3.default)({}, state, {\n      traitRequestCount: state.traitRequestCount - 1\n    });\n  }\n  var newData = payload.result[0];\n  var newUserTraits = state.userTraits.filter(function (trait) {\n    return trait.traitId !== payload.traitId;\n  });\n  newUserTraits.push(newData);\n\n  return (0, _extends3.default)({}, state, {\n    userTraits: newUserTraits,\n    traitRequestCount: state.traitRequestCount - 1\n  });\n}\n\n/**\n * Handles SETTINGS/DELETE_USER_TRAIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onDeleteUserTrait(state, _ref4) {\n  var error = _ref4.error,\n      payload = _ref4.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to delete user trait', payload);\n    (0, _errors.fireErrorMessage)('Failed to delete user trait', '');\n    return (0, _extends3.default)({}, state, {\n      traitRequestCount: state.traitRequestCount - 1\n    });\n  }\n  var newUserTraits = state.userTraits.filter(function (trait) {\n    return trait.traitId !== payload.traitId;\n  });\n  return (0, _extends3.default)({}, state, {\n    userTraits: newUserTraits,\n    traitRequestCount: state.traitRequestCount - 1\n  });\n}\n\n/**\n * Creates a new user trait reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} userTraits reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n    traitRequestCount: 0,\n    userTraits: []\n  };\n\n  var a = _settings2.default.settings;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.getAllUserTraits, onGetAllUserTraits), (0, _defineProperty3.default)(_handleActions, a.modifyUserTraitInit, onModifyUserTraitInit), (0, _defineProperty3.default)(_handleActions, a.addUserTrait, onAddUserTrait), (0, _defineProperty3.default)(_handleActions, a.deleteUserTrait, onDeleteUserTrait), (0, _defineProperty3.default)(_handleActions, a.updateUserTrait, onUpdateUserTrait), _handleActions), initialState);\n}\n\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetAllUserTraits, 'onGetAllUserTraits', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onModifyUserTraitInit, 'onModifyUserTraitInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onAddUserTrait, 'onAddUserTrait', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onUpdateUserTrait, 'onUpdateUserTrait', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onDeleteUserTrait, 'onDeleteUserTrait', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/settings.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/settings.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _settings = __webpack_require__(/*! ../actions/settings */ \"./src/actions/settings.js\");\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.settings\"\n    * @desc Reducer for the Redux store segment that holds traits data.\n    */\n\n/**\n * Handles SETTINGS/GET_ALL_USER_TRAITS action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetAllUserTraits(state, _ref) {\n  var error = _ref.error,\n      payload = _ref.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to get all user traits', payload);\n    return (0, _extends3.default)({}, state, {\n      userTraits: []\n    });\n  }\n\n  return (0, _extends3.default)({}, state, {\n    userTraits: payload.data\n  });\n}\n\n/**\n * Handles SETTINGS/MODIFY_USER_TRAIT_INIT action.\n * @param {Object} state *\n * @return {Object} New state.\n */\nfunction onModifyUserTraitInit(state) {\n  return (0, _extends3.default)({}, state, {\n    traitRequestCount: state.traitRequestCount + 1\n  });\n}\n\n/**\n * Handles SETTINGS/ADD_USER_TRAIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onAddUserTrait(state, _ref2) {\n  var error = _ref2.error,\n      payload = _ref2.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to add user trait', payload);\n    (0, _errors.fireErrorMessage)('Failed to add user trait', '');\n    return (0, _extends3.default)({}, state, {\n      traitRequestCount: state.traitRequestCount - 1\n    });\n  }\n  var newData = payload.result[0];\n  return (0, _extends3.default)({}, state, {\n    userTraits: [].concat((0, _toConsumableArray3.default)(state.userTraits), [newData]),\n    traitRequestCount: state.traitRequestCount - 1\n  });\n}\n\n/**\n * Handles SETTINGS/UPDATE_USER_TRAIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onUpdateUserTrait(state, _ref3) {\n  var error = _ref3.error,\n      payload = _ref3.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to update user trait', payload);\n    (0, _errors.fireErrorMessage)('Failed to update user trait', '');\n    return (0, _extends3.default)({}, state, {\n      traitRequestCount: state.traitRequestCount - 1\n    });\n  }\n  var newData = payload.result[0];\n  var newUserTraits = state.userTraits.filter(function (trait) {\n    return trait.traitId !== payload.traitId;\n  });\n  newUserTraits.push(newData);\n\n  return (0, _extends3.default)({}, state, {\n    userTraits: newUserTraits,\n    traitRequestCount: state.traitRequestCount - 1\n  });\n}\n\n/**\n * Handles SETTINGS/DELETE_USER_TRAIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onDeleteUserTrait(state, _ref4) {\n  var error = _ref4.error,\n      payload = _ref4.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to delete user trait', payload);\n    (0, _errors.fireErrorMessage)('Failed to delete user trait', '');\n    return (0, _extends3.default)({}, state, {\n      traitRequestCount: state.traitRequestCount - 1\n    });\n  }\n  var newUserTraits = state.userTraits.filter(function (trait) {\n    return trait.traitId !== payload.traitId;\n  });\n  return (0, _extends3.default)({}, state, {\n    userTraits: newUserTraits,\n    traitRequestCount: state.traitRequestCount - 1\n  });\n}\n\n/**\n * Creates a new user trait reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} userTraits reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n    traitRequestCount: 0,\n    userTraits: []\n  };\n\n  var a = _settings2.default.settings;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.getAllUserTraits, onGetAllUserTraits), (0, _defineProperty3.default)(_handleActions, a.modifyUserTraitInit, onModifyUserTraitInit), (0, _defineProperty3.default)(_handleActions, a.addUserTrait, onAddUserTrait), (0, _defineProperty3.default)(_handleActions, a.deleteUserTrait, onDeleteUserTrait), (0, _defineProperty3.default)(_handleActions, a.updateUserTrait, onUpdateUserTrait), _handleActions), initialState);\n}\n\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetAllUserTraits, 'onGetAllUserTraits', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onModifyUserTraitInit, 'onModifyUserTraitInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onAddUserTrait, 'onAddUserTrait', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onUpdateUserTrait, 'onUpdateUserTrait', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(onDeleteUserTrait, 'onDeleteUserTrait', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/settings.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/settings.js?");
 
 /***/ }),
 
@@ -784,7 +784,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends4 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends5 = _interopRequireDefault(_extends4);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _stats = __webpack_require__(/*! ../actions/stats */ \"./src/actions/stats.js\");\n\nvar _stats2 = _interopRequireDefault(_stats);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.stats\"\n    * @desc Reducer for state.stats. That part of Redux state is intended to keep\n    *  user- and group-related statistics to render in the frontend.\n    * @todo Document state segment structure.\n    */\n\n/**\n * Inits the loading of community stats.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetCommunityStatsInit(state, action) {\n  var _action$payload = action.payload,\n      community = _action$payload.community,\n      uuid = _action$payload.uuid;\n\n  var res = state.communities[community];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.loadingUuid = uuid;\n  return (0, _extends5.default)({}, state, {\n    communities: (0, _extends5.default)({}, state.communities, (0, _defineProperty3.default)({}, community, res))\n  });\n}\n\n/**\n * Handles result of the getCommunityStats action.\n * @param {Object} state Previous state.\n * @param {Object} action Action result.\n * @return {Object} New state.\n */\nfunction onGetCommunityStatsDone(state, _ref) {\n  var error = _ref.error,\n      payload = _ref.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to load community stats', payload);\n    (0, _errors.fireErrorMessage)('Failed to load community stats', '');\n    return state;\n  }\n\n  var community = payload.community,\n      stats = payload.stats,\n      uuid = payload.uuid;\n\n  if (_lodash2.default.get(state.communities[community], 'loadingUuid') !== uuid) {\n    return state;\n  }\n  return (0, _extends5.default)({}, state, {\n    communities: (0, _extends5.default)({}, state.communities, (0, _defineProperty3.default)({}, community, {\n      data: stats,\n      timestamp: Date.now()\n    }))\n  });\n}\n\n/**\n * Creates a new Stats reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Stats reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _stats2.default.stats;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.getCommunityStatsInit, onGetCommunityStatsInit), (0, _defineProperty3.default)(_handleActions, a.getCommunityStatsDone, onGetCommunityStatsDone), _handleActions), _lodash2.default.defaults(_lodash2.default.clone(initialState), {\n    communities: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetCommunityStatsInit, 'onGetCommunityStatsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(onGetCommunityStatsDone, 'onGetCommunityStatsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/stats.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/stats.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends4 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends5 = _interopRequireDefault(_extends4);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reduxActions = __webpack_require__(/*! redux-actions */ \"redux-actions\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _stats = __webpack_require__(/*! ../actions/stats */ \"./src/actions/stats.js\");\n\nvar _stats2 = _interopRequireDefault(_stats);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.stats\"\n    * @desc Reducer for state.stats. That part of Redux state is intended to keep\n    *  user- and group-related statistics to render in the frontend.\n    * @todo Document state segment structure.\n    */\n\n/**\n * Inits the loading of community stats.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetCommunityStatsInit(state, action) {\n  var _action$payload = action.payload,\n      community = _action$payload.community,\n      uuid = _action$payload.uuid;\n\n  var res = state.communities[community];\n  res = res ? _lodash2.default.clone(res) : {};\n  res.loadingUuid = uuid;\n  return (0, _extends5.default)({}, state, {\n    communities: (0, _extends5.default)({}, state.communities, (0, _defineProperty3.default)({}, community, res))\n  });\n}\n\n/**\n * Handles result of the getCommunityStats action.\n * @param {Object} state Previous state.\n * @param {Object} action Action result.\n * @return {Object} New state.\n */\nfunction onGetCommunityStatsDone(state, _ref) {\n  var error = _ref.error,\n      payload = _ref.payload;\n\n  if (error) {\n    _logger2.default.error('Failed to load community stats', payload);\n    (0, _errors.fireErrorMessage)('Failed to load community stats', '');\n    return state;\n  }\n\n  var community = payload.community,\n      stats = payload.stats,\n      uuid = payload.uuid;\n\n  if (_lodash2.default.get(state.communities[community], 'loadingUuid') !== uuid) {\n    return state;\n  }\n  return (0, _extends5.default)({}, state, {\n    communities: (0, _extends5.default)({}, state.communities, (0, _defineProperty3.default)({}, community, {\n      data: stats,\n      timestamp: Date.now()\n    }))\n  });\n}\n\n/**\n * Creates a new Stats reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function} Stats reducer.\n */\nfunction create() {\n  var _handleActions;\n\n  var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var a = _stats2.default.stats;\n  return (0, _reduxActions.handleActions)((_handleActions = {}, (0, _defineProperty3.default)(_handleActions, a.getCommunityStatsInit, onGetCommunityStatsInit), (0, _defineProperty3.default)(_handleActions, a.getCommunityStatsDone, onGetCommunityStatsDone), _handleActions), _lodash2.default.defaults(_lodash2.default.clone(initialState), {\n    communities: {}\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(onGetCommunityStatsInit, 'onGetCommunityStatsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(onGetCommunityStatsDone, 'onGetCommunityStatsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/stats.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/stats.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/stats.js?");
 
 /***/ }),
 
@@ -796,7 +796,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _terms = __webpack_require__(/*! ../actions/terms */ \"./src/actions/terms.js\");\n\nvar _terms2 = _interopRequireDefault(_terms);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.terms\"\n    * @desc Reducer for state.terms.\n    * @todo Document state segment structure.\n    */\n\n\n/**\n * sort terms by agreed status\n * @param  {Array} terms terms to sort\n * @return {Array}       sorted terms\n */\nfunction sortTerms(terms) {\n  return _lodash2.default.sortBy(terms, function (t) {\n    return t.agreed ? 0 : 1;\n  });\n}\n\n/**\n * Handles TERMS/GET_TERMS_DONE action.\n * Note, that it silently discards received terms if the entity of received data\n * mismatches the one stored in loadingTermsForEntity\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetTermsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get terms!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      terms: [],\n      getTermsFailure: action.error,\n      loadingTermsForEntity: null\n    });\n  }\n\n  if (!_lodash2.default.isEqual(action.payload.entity, state.loadingTermsForEntity)) {\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, {\n    entity: action.payload.entity,\n    terms: sortTerms(action.payload.terms),\n    getTermsFailure: false,\n    loadingTermsForEntity: null\n  });\n}\n\n/**\n * Handles TERMS/GET_TERMS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetTermsInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    getTermsFailure: false,\n    loadingTermsForEntity: action.payload,\n    terms: [],\n    entity: action.payload\n  });\n}\n\n/**\n * Handles TERMS/CHECK_STATUS_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onCheckStatusDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Check terms status failed!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      checkingStatus: false,\n      checkStatusError: action.payload,\n      canRegister: false\n    });\n  }\n  var canRegister = _lodash2.default.every(action.payload, 'agreed');\n  var selectedTerm = _lodash2.default.find(action.payload, function (t) {\n    return !t.agreed;\n  });\n  return (0, _extends3.default)({}, state, {\n    checkingStatus: false,\n    checkStatusError: false,\n    canRegister: canRegister,\n    terms: sortTerms(action.payload),\n    selectedTerm: selectedTerm\n  });\n}\n\n/**\n * Handles TERMS/GET_TERM_DETAILS_DONE action.\n * Note, that it silently discards received details if the termId of received\n * mismatches the one stored in loadingDetailsForTermId field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetTermDetailsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get term details!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      details: null,\n      getTermDetailsFailure: action.payload,\n      loadingDetailsForTermId: ''\n    });\n  }\n\n  if (_lodash2.default.toString(action.payload.termId) !== state.loadingDetailsForTermId) {\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, action.payload, {\n    getTermDetailsFailure: false,\n    loadingDetailsForTermId: ''\n  });\n}\n\n/**\n * Handles TERMS/GET_DOCU_SIGN_URL_DONE action.\n * Note, that it silently discards received url if the templateId of received\n * mismatches the one stored in loadingDocuSignUrl field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetDocuSignUrlDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get docu sign url!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      docuSignUrl: '',\n      getDocuSignUrlFailure: action.payload,\n      loadingDocuSignUrl: ''\n    });\n  }\n\n  if (_lodash2.default.toString(action.payload.templateId) !== state.loadingDocuSignUrl) {\n    return state;\n  }\n  return (0, _extends3.default)({}, state, action.payload, {\n    getDocuSignUrlFailure: false,\n    loadingDocuSignUrl: ''\n  });\n}\n\n/**\n * Handles TERMS/AGREE_TERM_DONE action.\n * Note, that it silently discards received result if the termId of received\n * mismatches the one stored in agreeingTerm field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onAgreeTermDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to agree term!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      agreeTermFailure: action.payload,\n      agreeingTerm: ''\n    });\n  }\n\n  if (_lodash2.default.toString(action.payload.termId) !== state.agreeingTerm) {\n    return state;\n  }\n  if (action.payload.success) {\n    var terms = _lodash2.default.cloneDeep(state.terms);\n    var term = _lodash2.default.find(terms, ['termsOfUseId', action.payload.termId]);\n    term.agreed = true;\n    var selectedTerm = _lodash2.default.find(terms, function (t) {\n      return !t.agreed;\n    });\n    return (0, _extends3.default)({}, state, {\n      terms: terms,\n      selectedTerm: selectedTerm,\n      agreeTermFailure: false,\n      agreeingTerm: ''\n    });\n  }\n  return (0, _extends3.default)({}, state, {\n    agreeTermFailure: false,\n    agreeingTerm: ''\n  });\n}\n\n/**\n * Creates a new Profile reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function(state, action): state} Profile reducer.\n */\nfunction create(initialState) {\n  var _redux$handleActions;\n\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermsInit, onGetTermsInit), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermsDone, onGetTermsDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermDetailsInit, function (state, _ref) {\n    var payload = _ref.payload;\n    return (0, _extends3.default)({}, state, {\n      getTermDetailsFailure: false,\n      loadingDetailsForTermId: payload,\n      details: null,\n      termId: payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermDetailsDone, onGetTermDetailsDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getDocuSignUrlInit, function (state, _ref2) {\n    var payload = _ref2.payload;\n    return (0, _extends3.default)({}, state, {\n      getDocuSignUrlFailure: false,\n      loadingDocuSignUrl: payload,\n      docuSignUrl: '',\n      templateId: payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getDocuSignUrlDone, onGetDocuSignUrlDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.agreeTermInit, function (state, _ref3) {\n    var payload = _ref3.payload;\n    return (0, _extends3.default)({}, state, {\n      agreeTermFailure: false,\n      agreeingTerm: payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.agreeTermDone, onAgreeTermDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.checkStatusInit, function (state) {\n    return (0, _extends3.default)({}, state, {\n      checkingStatus: true\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.checkStatusDone, onCheckStatusDone), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    terms: [],\n    selectedTerm: null\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @param {Object} options={} Optional. Options object for initial state.\n * @param {String} [options.auth.tokenV2=''] The V2 auth token\n * @param {String} [options.auth.tokenV3=''] The V3 auth token\n * @param {String} [options.terms.entity.type=''] The terms entity type:\n *  - `challenge`\n *  - `community`\n *  - `reviewOpportunity`\n * @param {String} [options.terms.entity.id=''] The terms entity id\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var entityType = _lodash2.default.get(options, 'terms.entity.type');\n  var entityId = _lodash2.default.get(options, 'terms.entity.id');\n\n  if (entityType && entityId) {\n    var entity = options.terms.entity;\n\n    var tokens = {\n      tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n      tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n    };\n    return _topcoderReactUtils.redux.resolveAction(_terms2.default.terms.getTermsDone(entity, tokens)).then(function (termsDoneAction) {\n      // we have to init first, otherwise results will be ignored by onGetTermsDone\n      var state = onGetTermsInit({}, _terms2.default.terms.getTermsInit(entity));\n      state = onGetTermsDone(state, termsDoneAction);\n\n      return create(state);\n    });\n  }\n\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(sortTerms, 'sortTerms', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetTermsDone, 'onGetTermsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetTermsInit, 'onGetTermsInit', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onCheckStatusDone, 'onCheckStatusDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetTermDetailsDone, 'onGetTermDetailsDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetDocuSignUrlDone, 'onGetDocuSignUrlDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onAgreeTermDone, 'onAgreeTermDone', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(create, 'create', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(factory, 'factory', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/reducers/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/terms.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.factory = factory;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _terms = __webpack_require__(/*! ../actions/terms */ \"./src/actions/terms.js\");\n\nvar _terms2 = _interopRequireDefault(_terms);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"reducers.terms\"\n    * @desc Reducer for state.terms.\n    * @todo Document state segment structure.\n    */\n\n\n/**\n * sort terms by agreed status\n * @param  {Array} terms terms to sort\n * @return {Array}       sorted terms\n */\nfunction sortTerms(terms) {\n  return _lodash2.default.sortBy(terms, function (t) {\n    return t.agreed ? 0 : 1;\n  });\n}\n\n/**\n * Handles TERMS/GET_TERMS_DONE action.\n * Note, that it silently discards received terms if the entity of received data\n * mismatches the one stored in loadingTermsForEntity\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetTermsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get terms!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      terms: [],\n      getTermsFailure: action.error,\n      loadingTermsForEntity: null\n    });\n  }\n\n  if (!_lodash2.default.isEqual(action.payload.entity, state.loadingTermsForEntity)) {\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, {\n    entity: action.payload.entity,\n    terms: sortTerms(action.payload.terms),\n    getTermsFailure: false,\n    loadingTermsForEntity: null\n  });\n}\n\n/**\n * Handles TERMS/GET_TERMS_INIT action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetTermsInit(state, action) {\n  return (0, _extends3.default)({}, state, {\n    getTermsFailure: false,\n    loadingTermsForEntity: action.payload,\n    terms: [],\n    entity: action.payload\n  });\n}\n\n/**\n * Handles TERMS/CHECK_STATUS_DONE action.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onCheckStatusDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Check terms status failed!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      checkingStatus: false,\n      checkStatusError: action.payload,\n      canRegister: false\n    });\n  }\n  var canRegister = _lodash2.default.every(action.payload, 'agreed');\n  var selectedTerm = _lodash2.default.find(action.payload, function (t) {\n    return !t.agreed;\n  });\n  return (0, _extends3.default)({}, state, {\n    checkingStatus: false,\n    checkStatusError: false,\n    canRegister: canRegister,\n    terms: sortTerms(action.payload),\n    selectedTerm: selectedTerm\n  });\n}\n\n/**\n * Handles TERMS/GET_TERM_DETAILS_DONE action.\n * Note, that it silently discards received details if the termId of received\n * mismatches the one stored in loadingDetailsForTermId field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetTermDetailsDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get term details!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      details: null,\n      getTermDetailsFailure: action.payload,\n      loadingDetailsForTermId: ''\n    });\n  }\n\n  if (_lodash2.default.toString(action.payload.termId) !== state.loadingDetailsForTermId) {\n    return state;\n  }\n\n  return (0, _extends3.default)({}, state, action.payload, {\n    getTermDetailsFailure: false,\n    loadingDetailsForTermId: ''\n  });\n}\n\n/**\n * Handles TERMS/GET_DOCU_SIGN_URL_DONE action.\n * Note, that it silently discards received url if the templateId of received\n * mismatches the one stored in loadingDocuSignUrl field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onGetDocuSignUrlDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to get docu sign url!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      docuSignUrl: '',\n      getDocuSignUrlFailure: action.payload,\n      loadingDocuSignUrl: ''\n    });\n  }\n\n  if (_lodash2.default.toString(action.payload.templateId) !== state.loadingDocuSignUrl) {\n    return state;\n  }\n  return (0, _extends3.default)({}, state, action.payload, {\n    getDocuSignUrlFailure: false,\n    loadingDocuSignUrl: ''\n  });\n}\n\n/**\n * Handles TERMS/AGREE_TERM_DONE action.\n * Note, that it silently discards received result if the termId of received\n * mismatches the one stored in agreeingTerm field\n * of the state.\n * @param {Object} state\n * @param {Object} action\n * @return {Object} New state.\n */\nfunction onAgreeTermDone(state, action) {\n  if (action.error) {\n    _logger2.default.error('Failed to agree term!', action.payload);\n    return (0, _extends3.default)({}, state, {\n      agreeTermFailure: action.payload,\n      agreeingTerm: ''\n    });\n  }\n\n  if (_lodash2.default.toString(action.payload.termId) !== state.agreeingTerm) {\n    return state;\n  }\n  if (action.payload.success) {\n    var terms = _lodash2.default.cloneDeep(state.terms);\n    var term = _lodash2.default.find(terms, ['termsOfUseId', action.payload.termId]);\n    term.agreed = true;\n    var selectedTerm = _lodash2.default.find(terms, function (t) {\n      return !t.agreed;\n    });\n    return (0, _extends3.default)({}, state, {\n      terms: terms,\n      selectedTerm: selectedTerm,\n      agreeTermFailure: false,\n      agreeingTerm: ''\n    });\n  }\n  return (0, _extends3.default)({}, state, {\n    agreeTermFailure: false,\n    agreeingTerm: ''\n  });\n}\n\n/**\n * Creates a new Profile reducer with the specified initial state.\n * @param {Object} initialState Optional. Initial state.\n * @return {Function(state, action): state} Profile reducer.\n */\nfunction create(initialState) {\n  var _redux$handleActions;\n\n  return _topcoderReactUtils.redux.handleActions((_redux$handleActions = {}, (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermsInit, onGetTermsInit), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermsDone, onGetTermsDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermDetailsInit, function (state, _ref) {\n    var payload = _ref.payload;\n    return (0, _extends3.default)({}, state, {\n      getTermDetailsFailure: false,\n      loadingDetailsForTermId: payload,\n      details: null,\n      termId: payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getTermDetailsDone, onGetTermDetailsDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getDocuSignUrlInit, function (state, _ref2) {\n    var payload = _ref2.payload;\n    return (0, _extends3.default)({}, state, {\n      getDocuSignUrlFailure: false,\n      loadingDocuSignUrl: payload,\n      docuSignUrl: '',\n      templateId: payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.getDocuSignUrlDone, onGetDocuSignUrlDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.agreeTermInit, function (state, _ref3) {\n    var payload = _ref3.payload;\n    return (0, _extends3.default)({}, state, {\n      agreeTermFailure: false,\n      agreeingTerm: payload\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.agreeTermDone, onAgreeTermDone), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.checkStatusInit, function (state) {\n    return (0, _extends3.default)({}, state, {\n      checkingStatus: true\n    });\n  }), (0, _defineProperty3.default)(_redux$handleActions, _terms2.default.terms.checkStatusDone, onCheckStatusDone), _redux$handleActions), _lodash2.default.defaults(initialState, {\n    terms: [],\n    selectedTerm: null\n  }));\n}\n\n/**\n * Factory which creates a new reducer with its initial state tailored to the\n * given options object, if specified (for server-side rendering). If options\n * object is not specified, it creates just the default reducer. Accepted options are:\n * @param {Object} options={} Optional. Options object for initial state.\n * @param {String} [options.auth.tokenV2=''] The V2 auth token\n * @param {String} [options.auth.tokenV3=''] The V3 auth token\n * @param {String} [options.terms.entity.type=''] The terms entity type:\n *  - `challenge`\n *  - `community`\n *  - `reviewOpportunity`\n * @param {String} [options.terms.entity.id=''] The terms entity id\n * @return {Promise}\n * @resolves {Function(state, action): state} New reducer.\n */\nfunction factory() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var entityType = _lodash2.default.get(options, 'terms.entity.type');\n  var entityId = _lodash2.default.get(options, 'terms.entity.id');\n\n  if (entityType && entityId) {\n    var entity = options.terms.entity;\n\n    var tokens = {\n      tokenV2: _lodash2.default.get(options.auth, 'tokenV2'),\n      tokenV3: _lodash2.default.get(options.auth, 'tokenV3')\n    };\n    return _topcoderReactUtils.redux.resolveAction(_terms2.default.terms.getTermsDone(entity, tokens)).then(function (termsDoneAction) {\n      // we have to init first, otherwise results will be ignored by onGetTermsDone\n      var state = onGetTermsInit({}, _terms2.default.terms.getTermsInit(entity));\n      state = onGetTermsDone(state, termsDoneAction);\n\n      return create(state);\n    });\n  }\n\n  return _promise2.default.resolve(create());\n}\n\n/**\n * @static\n * @member default\n * @desc Reducer with default initial state.\n */\n\nvar _default = create();\n\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(sortTerms, 'sortTerms', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetTermsDone, 'onGetTermsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetTermsInit, 'onGetTermsInit', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onCheckStatusDone, 'onCheckStatusDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetTermDetailsDone, 'onGetTermDetailsDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onGetDocuSignUrlDone, 'onGetDocuSignUrlDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(onAgreeTermDone, 'onAgreeTermDone', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(create, 'create', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(factory, 'factory', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/reducers/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/reducers/terms.js?");
 
 /***/ }),
 
@@ -874,7 +874,7 @@ eval("module.exports = JSON.parse(\"{\\\"termsOfUseId\\\":21193,\\\"title\\\":\\
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _termsAuth = __webpack_require__(/*! ./data/terms-auth.json */ \"./src/services/__mocks__/data/terms-auth.json\");\n\nvar _termsAuth2 = _interopRequireDefault(_termsAuth);\n\nvar _termsDocuSignDetails = __webpack_require__(/*! ./data/terms-docu-sign-details.json */ \"./src/services/__mocks__/data/terms-docu-sign-details.json\");\n\nvar _termsDocuSignDetails2 = _interopRequireDefault(_termsDocuSignDetails);\n\nvar _termsNoauth = __webpack_require__(/*! ./data/terms-noauth.json */ \"./src/services/__mocks__/data/terms-noauth.json\");\n\nvar _termsNoauth2 = _interopRequireDefault(_termsNoauth);\n\nvar _termsReviewer = __webpack_require__(/*! ./data/terms-reviewer.json */ \"./src/services/__mocks__/data/terms-reviewer.json\");\n\nvar _termsReviewer2 = _interopRequireDefault(_termsReviewer);\n\nvar _termsReviewerDetails = __webpack_require__(/*! ./data/terms-reviewer-details.json */ \"./src/services/__mocks__/data/terms-reviewer-details.json\");\n\nvar _termsReviewerDetails2 = _interopRequireDefault(_termsReviewerDetails);\n\nvar _termsTopcoderDetails = __webpack_require__(/*! ./data/terms-topcoder-details.json */ \"./src/services/__mocks__/data/terms-topcoder-details.json\");\n\nvar _termsTopcoderDetails2 = _interopRequireDefault(_termsTopcoderDetails);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Mock version of Terms service. To be used both for Jest testing, and for\n    * manual testing inside the app (see MOCK_TERMS_SERVICE constant\n    * in the app config).\n    *\n    * NOTE: At the moment this mock does not care much about authorization\n    * (i.e. the presence of auth token), as the real backend api acts a bit\n    * surprising and non-intuitive at the moment, so it is a bit difficult\n    * to imitate it exactly.\n    */\n\nvar reviewTermsAgreed = false;\n\nvar TermsService = function () {\n  /**\n   * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n   */\n  function TermsService(tokenV2) {\n    (0, _classCallCheck3.default)(this, TermsService);\n\n    this.private = {\n      tokenV2: tokenV2\n    };\n  }\n\n  /**\n   * Mock of getChallengeTerms(..) method.\n   * The second argument is optional. If present, it should be an array of\n   * boolean values, and it will override acceptance status of terms read\n   * from the JSON data file.\n   * @param {String} challengeId\n   * @param {Array} agreed Optional.\n   */\n\n\n  (0, _createClass3.default)(TermsService, [{\n    key: 'getChallengeTerms',\n    value: function getChallengeTerms(challengeId, agreed) {\n      var res = _lodash2.default.clone(this.private.tokenV2 ? _termsAuth2.default : _termsNoauth2.default);\n      res.serverInformation.currentTime = Date.now();\n      res.requesterInformation.receivedParams.challengeId = _lodash2.default.toString(challengeId);\n      if (this.private.tokenV2 && _lodash2.default.isArray(agreed)) {\n        for (var i = 0; i < Math.min(agreed.length, res.terms.length); i += 1) {\n          res.terms[i].agreed = agreed[i];\n        }\n      }\n      return _promise2.default.resolve(res);\n    }\n\n    /**\n     * Mock of getCommunityTerms(..) method.\n     *\n     * @param {String} communityId community id\n     * @param {String} tokenV3     auth token V3\n     * @param {Array}  agreed      Optional. If present, it should be an array of\n     *                             boolean values, and it will override acceptance\n     *                             status of terms read from the JSON data file.\n     *\n     * @return {Promise} resolves to the list of mocked terms\n     */\n\n  }, {\n    key: 'getCommunityTerms',\n    value: function getCommunityTerms(challengeId, tokenV3, agreed) {\n      var res = _lodash2.default.clone(this.private.tokenV2 ? _termsAuth2.default : _termsNoauth2.default);\n      res.serverInformation.currentTime = Date.now();\n      if (this.private.tokenV2 && _lodash2.default.isArray(agreed)) {\n        for (var i = 0; i < Math.min(agreed.length, res.terms.length); i += 1) {\n          res.terms[i].agreed = agreed[i];\n          delete res.terms[i].text;\n        }\n      }\n      return _promise2.default.resolve(res);\n    }\n\n    /**\n     * Mock of getReviewOpportunityTerms(..) method.\n     */\n    /* eslint-disable class-methods-use-this */\n\n  }, {\n    key: 'getReviewOpportunityTerms',\n    value: function getReviewOpportunityTerms() {\n      var res = _lodash2.default.clone(_termsReviewer2.default);\n      res.terms[0].agreed = reviewTermsAgreed;\n      res.terms[1].agreed = reviewTermsAgreed;\n      return _promise2.default.resolve(res);\n    }\n    /* eslint-enable class-methods-use-this */\n\n    /**\n     * Mock of getTermDetails(..) method.\n     * In the case of Topcoder challenge terms there is \"agreed\" field in the\n     * response. If the second argument is passed into this method, it will\n     * override the value of this field from JSON file with mock data.\n     * @param {Number} termId\n     * @param {Boolean} agreed Optional.\n     */\n\n  }, {\n    key: 'getTermDetails',\n    value: function getTermDetails(termId, agreed) {\n      _lodash2.default.noop(this);\n      var res = void 0;\n      switch (termId) {\n        case 20704:\n          // eslint-disable-next-line\n          agreed = reviewTermsAgreed;\n          res = _lodash2.default.clone(_termsReviewerDetails2.default);\n          break;\n        case 21153:\n          // eslint-disable-next-line\n          if (reviewTermsAgreed) agreed = reviewTermsAgreed;\n          res = _lodash2.default.clone(_termsDocuSignDetails2.default);\n          break;\n        case 21193:\n        case 21194:\n          res = _lodash2.default.clone(_termsTopcoderDetails2.default);\n          break;\n        default:\n          throw new Error('Unknown termId \\'' + termId + '\\'!');\n      }\n      if (!_lodash2.default.isUndefined(agreed)) res.agreed = agreed;\n      res.serverInformation.currentTime = Date.now();\n      res.termsOfUseId = termId;\n      res.requesterInformation.receivedParams.termsOfUseId = _lodash2.default.toString(termId);\n      return _promise2.default.resolve(res);\n    }\n  }, {\n    key: 'getDocuSignUrl',\n    value: function getDocuSignUrl(templateId, returnUrl) {\n      _lodash2.default.noop(this);\n\n      /* TODO: It has not been tracked explicitely, what is the response of\n       * the real api here. It sure contains \"recipientViewUrl\", and this is\n       * the only thing we need for our purposes now. However, it might also\n       * have another useful datafields. This should be explored. */\n      return _promise2.default.resolve({\n        recipientViewUrl: '/community-app-assets/api/mock/docu-sign?returnUrl=' + returnUrl\n      });\n    }\n  }, {\n    key: 'agreeTerm',\n    value: function agreeTerm(termId) {\n      _lodash2.default.noop(termId, this);\n\n      if (termId === 20704) {\n        reviewTermsAgreed = true;\n      }\n\n      /* TODO: It has not been tracked explicitely, what is the response of\n       * the real api here. It sure contains \"success\" field, and this is\n       * the only thing we need for our purposes now. However, it might also\n       * have another useful datafields. This should be explored. */\n      return _promise2.default.resolve({ success: true });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return TermsService;\n}();\n\n/**\n * Returns a new or existing terms service.\n * @param  {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {Object} Terms service object\n */\n\n\nvar lastInstance = null;\nfunction getService(tokenV2) {\n  /* eslint-disable no-console */\n  console.error('WARNING:\\n    Mock version of DocuSign service is used! Should you see this message in\\n    production, contact support as soon as possible!');\n  /* eslint-enable no-console */\n  if (!lastInstance || tokenV2 && lastInstance.private.tokenV2 !== tokenV2) {\n    lastInstance = new TermsService(tokenV2);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(reviewTermsAgreed, 'reviewTermsAgreed', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(TermsService, 'TermsService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/__mocks__/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/__mocks__/terms.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _termsAuth = __webpack_require__(/*! ./data/terms-auth.json */ \"./src/services/__mocks__/data/terms-auth.json\");\n\nvar _termsAuth2 = _interopRequireDefault(_termsAuth);\n\nvar _termsDocuSignDetails = __webpack_require__(/*! ./data/terms-docu-sign-details.json */ \"./src/services/__mocks__/data/terms-docu-sign-details.json\");\n\nvar _termsDocuSignDetails2 = _interopRequireDefault(_termsDocuSignDetails);\n\nvar _termsNoauth = __webpack_require__(/*! ./data/terms-noauth.json */ \"./src/services/__mocks__/data/terms-noauth.json\");\n\nvar _termsNoauth2 = _interopRequireDefault(_termsNoauth);\n\nvar _termsReviewer = __webpack_require__(/*! ./data/terms-reviewer.json */ \"./src/services/__mocks__/data/terms-reviewer.json\");\n\nvar _termsReviewer2 = _interopRequireDefault(_termsReviewer);\n\nvar _termsReviewerDetails = __webpack_require__(/*! ./data/terms-reviewer-details.json */ \"./src/services/__mocks__/data/terms-reviewer-details.json\");\n\nvar _termsReviewerDetails2 = _interopRequireDefault(_termsReviewerDetails);\n\nvar _termsTopcoderDetails = __webpack_require__(/*! ./data/terms-topcoder-details.json */ \"./src/services/__mocks__/data/terms-topcoder-details.json\");\n\nvar _termsTopcoderDetails2 = _interopRequireDefault(_termsTopcoderDetails);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Mock version of Terms service. To be used both for Jest testing, and for\n    * manual testing inside the app (see MOCK_TERMS_SERVICE constant\n    * in the app config).\n    *\n    * NOTE: At the moment this mock does not care much about authorization\n    * (i.e. the presence of auth token), as the real backend api acts a bit\n    * surprising and non-intuitive at the moment, so it is a bit difficult\n    * to imitate it exactly.\n    */\n\nvar reviewTermsAgreed = false;\n\nvar TermsService = function () {\n  /**\n   * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n   */\n  function TermsService(tokenV2) {\n    (0, _classCallCheck3.default)(this, TermsService);\n\n    this.private = {\n      tokenV2: tokenV2\n    };\n  }\n\n  /**\n   * Mock of getChallengeTerms(..) method.\n   * The second argument is optional. If present, it should be an array of\n   * boolean values, and it will override acceptance status of terms read\n   * from the JSON data file.\n   * @param {String} challengeId\n   * @param {Array} agreed Optional.\n   */\n\n\n  (0, _createClass3.default)(TermsService, [{\n    key: 'getChallengeTerms',\n    value: function getChallengeTerms(challengeId, agreed) {\n      var res = _lodash2.default.clone(this.private.tokenV2 ? _termsAuth2.default : _termsNoauth2.default);\n      res.serverInformation.currentTime = Date.now();\n      res.requesterInformation.receivedParams.challengeId = _lodash2.default.toString(challengeId);\n      if (this.private.tokenV2 && _lodash2.default.isArray(agreed)) {\n        for (var i = 0; i < Math.min(agreed.length, res.terms.length); i += 1) {\n          res.terms[i].agreed = agreed[i];\n        }\n      }\n      return _promise2.default.resolve(res);\n    }\n\n    /**\n     * Mock of getCommunityTerms(..) method.\n     *\n     * @param {String} communityId community id\n     * @param {String} tokenV3     auth token V3\n     * @param {Array}  agreed      Optional. If present, it should be an array of\n     *                             boolean values, and it will override acceptance\n     *                             status of terms read from the JSON data file.\n     *\n     * @return {Promise} resolves to the list of mocked terms\n     */\n\n  }, {\n    key: 'getCommunityTerms',\n    value: function getCommunityTerms(challengeId, tokenV3, agreed) {\n      var res = _lodash2.default.clone(this.private.tokenV2 ? _termsAuth2.default : _termsNoauth2.default);\n      res.serverInformation.currentTime = Date.now();\n      if (this.private.tokenV2 && _lodash2.default.isArray(agreed)) {\n        for (var i = 0; i < Math.min(agreed.length, res.terms.length); i += 1) {\n          res.terms[i].agreed = agreed[i];\n          delete res.terms[i].text;\n        }\n      }\n      return _promise2.default.resolve(res);\n    }\n\n    /**\n     * Mock of getReviewOpportunityTerms(..) method.\n     */\n    /* eslint-disable class-methods-use-this */\n\n  }, {\n    key: 'getReviewOpportunityTerms',\n    value: function getReviewOpportunityTerms() {\n      var res = _lodash2.default.clone(_termsReviewer2.default);\n      res.terms[0].agreed = reviewTermsAgreed;\n      res.terms[1].agreed = reviewTermsAgreed;\n      return _promise2.default.resolve(res);\n    }\n    /* eslint-enable class-methods-use-this */\n\n    /**\n     * Mock of getTermDetails(..) method.\n     * In the case of Topcoder challenge terms there is \"agreed\" field in the\n     * response. If the second argument is passed into this method, it will\n     * override the value of this field from JSON file with mock data.\n     * @param {Number} termId\n     * @param {Boolean} agreed Optional.\n     */\n\n  }, {\n    key: 'getTermDetails',\n    value: function getTermDetails(termId, agreed) {\n      _lodash2.default.noop(this);\n      var res = void 0;\n      switch (termId) {\n        case 20704:\n          // eslint-disable-next-line\n          agreed = reviewTermsAgreed;\n          res = _lodash2.default.clone(_termsReviewerDetails2.default);\n          break;\n        case 21153:\n          // eslint-disable-next-line\n          if (reviewTermsAgreed) agreed = reviewTermsAgreed;\n          res = _lodash2.default.clone(_termsDocuSignDetails2.default);\n          break;\n        case 21193:\n        case 21194:\n          res = _lodash2.default.clone(_termsTopcoderDetails2.default);\n          break;\n        default:\n          throw new Error('Unknown termId \\'' + termId + '\\'!');\n      }\n      if (!_lodash2.default.isUndefined(agreed)) res.agreed = agreed;\n      res.serverInformation.currentTime = Date.now();\n      res.termsOfUseId = termId;\n      res.requesterInformation.receivedParams.termsOfUseId = _lodash2.default.toString(termId);\n      return _promise2.default.resolve(res);\n    }\n  }, {\n    key: 'getDocuSignUrl',\n    value: function getDocuSignUrl(templateId, returnUrl) {\n      _lodash2.default.noop(this);\n\n      /* TODO: It has not been tracked explicitely, what is the response of\n       * the real api here. It sure contains \"recipientViewUrl\", and this is\n       * the only thing we need for our purposes now. However, it might also\n       * have another useful datafields. This should be explored. */\n      return _promise2.default.resolve({\n        recipientViewUrl: '/community-app-assets/api/mock/docu-sign?returnUrl=' + returnUrl\n      });\n    }\n  }, {\n    key: 'agreeTerm',\n    value: function agreeTerm(termId) {\n      _lodash2.default.noop(termId, this);\n\n      if (termId === 20704) {\n        reviewTermsAgreed = true;\n      }\n\n      /* TODO: It has not been tracked explicitely, what is the response of\n       * the real api here. It sure contains \"success\" field, and this is\n       * the only thing we need for our purposes now. However, it might also\n       * have another useful datafields. This should be explored. */\n      return _promise2.default.resolve({ success: true });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return TermsService;\n}();\n\n/**\n * Returns a new or existing terms service.\n * @param  {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {Object} Terms service object\n */\n\n\nvar lastInstance = null;\nfunction getService(tokenV2) {\n  /* eslint-disable no-console */\n  console.error('WARNING:\\n    Mock version of DocuSign service is used! Should you see this message in\\n    production, contact support as soon as possible!');\n  /* eslint-enable no-console */\n  if (!lastInstance || tokenV2 && lastInstance.private.tokenV2 !== tokenV2) {\n    lastInstance = new TermsService(tokenV2);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(reviewTermsAgreed, 'reviewTermsAgreed', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(TermsService, 'TermsService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/__mocks__/terms.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/__mocks__/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/__mocks__/terms.js?");
 
 /***/ }),
 
@@ -886,7 +886,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getTcM2mToken = exports.getApiV5 = exports.getApiV4 = exports.getApiV3 = exports.getApiV2 = undefined;\n\nvar _keys = __webpack_require__(/*! babel-runtime/core-js/object/keys */ \"babel-runtime/core-js/object/keys\");\n\nvar _keys2 = _interopRequireDefault(_keys);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\n/**\n * Gets a valid TC M2M token, either requesting one from TC Auth0 API, or\n * serving one from internal cache.\n *\n * @return {Promise} Resolves to a token, valid at least next\n *  getTcM2mToken.MIN_LIFETIME milliseconds.\n *\n * @throw if called outside of the server.s\n */\nvar getTcM2mToken = exports.getTcM2mToken = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n    var now, cached, TC_M2M, res;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            if (_topcoderReactUtils.isomorphy.isServerSide()) {\n              _context2.next = 2;\n              break;\n            }\n\n            throw new Error('getTcM2mToken() called outside the server');\n\n          case 2:\n            now = Date.now();\n            cached = getTcM2mToken.cached;\n            TC_M2M = _topcoderReactUtils.config.SECRET.TC_M2M;\n\n            if (!(!cached || cached.expires < now + getTcM2mToken.MIN_LIFETIME)) {\n              _context2.next = 13;\n              break;\n            }\n\n            _context2.next = 8;\n            return (0, _isomorphicFetch2.default)('https://' + _topcoderReactUtils.config.AUTH0.DOMAIN + '/oauth/token', {\n              headers: { 'Content-Type': 'application/json' },\n              body: (0, _stringify2.default)({\n                client_id: TC_M2M.CLIENT_ID,\n                client_secret: TC_M2M.CLIENT_SECRET,\n                audience: TC_M2M.AUDIENCE,\n                grant_type: TC_M2M.GRANT_TYPE\n              }),\n              method: 'POST'\n            });\n\n          case 8:\n            res = _context2.sent;\n            _context2.next = 11;\n            return res.json();\n\n          case 11:\n            res = _context2.sent;\n\n            getTcM2mToken.cached = {\n              expires: now + 1000 * res.expires_in, // [ms]\n              token: res.access_token\n            };\n\n          case 13:\n            return _context2.abrupt('return', getTcM2mToken.cached.token);\n\n          case 14:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n\n  return function getTcM2mToken() {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\nexports.getApi = getApi;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _isomorphicFetch = __webpack_require__(/*! isomorphic-fetch */ \"isomorphic-fetch\");\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _time = __webpack_require__(/*! ../utils/time */ \"./src/utils/time.js\");\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.api\"\n    * @desc This module provides a service for conventient access to Topcoder APIs.\n    */\n\n/* The minimal delay [ms] between API calls. To avoid problems with the requests\n * rate limits configured in Topcoder APIs, we throttle requests rate at the\n * client side, and at server-side, in dev mode (which is meant to be used for\n * local development. */\nvar MIN_API_CALL_DELAY = _topcoderReactUtils.isomorphy.isDevBuild() ? 1000 : 200;\n\nvar API_THROTTLING = true;\n\nvar lastApiCallTimestamp = Date.now();\n\n/**\n * @static\n * @member default\n * @desc The default export from the module is\n *  {@link module:services.api~Api} class.\n */\n\n/**\n * API service object. It is reused for both Topcoder API v2 and v3,\n * as in these cases we are fine with the same interface, and the only\n * thing we need to be different is the base URL and auth token to use.\n */\n\nvar Api = function () {\n  /**\n   * Creates a new Api object.\n   * @param {String} base Base URL of the API.\n   * @param {String} token Optional. Authorization token.\n   */\n  function Api(base, token) {\n    (0, _classCallCheck3.default)(this, Api);\n\n    this.private = {\n      base: base,\n      token: token\n    };\n  }\n\n  /**\n   * Sends HTTP request to the specified API endpoint. This method is just\n   * a convenient wrapper around isomorphic fetch(..):\n   *\n   *  - If API service has auth token, Authorization header is automatically\n   *    added to the request;\n   *\n   *  - If no Content-Type header set in options, it is automatically set to\n   *    \"application/json\". In case you want to avoid it, pass null into\n   *    Content-Type header option.\n   *\n   * For additional details see https://github.github.io/fetch/\n   * @param {String} enpoint Should start with slash, like /endpoint.\n   * @param {Object} options Optional. Fetch options.\n   * @return {Promise} It resolves to the HTTP response object. To get the\n   *  actual data you probably want to call .json() method of that object.\n   *  Mind that this promise rejects only on network errors. In case of\n   *  HTTP errors (404, etc.) the promise will be resolved successfully,\n   *  and you should check .status or .ok fields of the response object\n   *  to find out the response status.\n   */\n\n\n  (0, _createClass3.default)(Api, [{\n    key: 'fetch',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(endpoint) {\n        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n        var _private, base, token, headers, now;\n\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _private = this.private, base = _private.base, token = _private.token;\n                headers = options.headers ? _lodash2.default.clone(options.headers) : {};\n\n                if (token) headers.Authorization = 'Bearer ' + token;\n\n                _context.t0 = headers['Content-Type'];\n                _context.next = _context.t0 === null ? 6 : _context.t0 === undefined ? 8 : 10;\n                break;\n\n              case 6:\n                delete headers['Content-Type'];\n                return _context.abrupt('break', 10);\n\n              case 8:\n                headers['Content-Type'] = 'application/json';\n                return _context.abrupt('break', 10);\n\n              case 10:\n                if (!(API_THROTTLING && (_topcoderReactUtils.isomorphy.isClientSide() || _topcoderReactUtils.isomorphy.isDevBuild()))) {\n                  _context.next = 19;\n                  break;\n                }\n\n                now = Date.now();\n\n                lastApiCallTimestamp += MIN_API_CALL_DELAY;\n\n                if (!(lastApiCallTimestamp > now)) {\n                  _context.next = 18;\n                  break;\n                }\n\n                _context.next = 16;\n                return (0, _time.delay)(lastApiCallTimestamp - now);\n\n              case 16:\n                _context.next = 19;\n                break;\n\n              case 18:\n                lastApiCallTimestamp = now;\n\n              case 19:\n                return _context.abrupt('return', (0, _isomorphicFetch2.default)('' + base + endpoint, (0, _extends3.default)({}, options, {\n                  headers: headers\n                })).catch(function (e) {\n                  (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.NETWORK, '' + base + endpoint, e.message);\n                  throw e;\n                }));\n\n              case 20:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function fetch(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return fetch;\n    }()\n\n    /**\n     * Sends DELETE request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'delete',\n    value: function _delete(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'DELETE'\n      });\n    }\n\n    /**\n     * Sends GET request to the specified endpoint.\n     * @param {String} endpoint\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'get',\n    value: function get(endpoint) {\n      return this.fetch(endpoint);\n    }\n\n    /**\n     * Sends POST request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'post',\n    value: function post(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'POST'\n      });\n    }\n\n    /**\n     * Sends POST request to the specified endpoint, with JSON payload.\n     * @param {String} endpoint\n     * @param {JSON} json\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'postJson',\n    value: function postJson(endpoint, json) {\n      return this.post(endpoint, (0, _stringify2.default)(json));\n    }\n\n    /**\n     * Sends PUT request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'put',\n    value: function put(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'PUT'\n      });\n    }\n\n    /**\n     * Sends PUT request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {JSON} json\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'putJson',\n    value: function putJson(endpoint, json) {\n      return this.put(endpoint, (0, _stringify2.default)(json));\n    }\n\n    /**\n     * Sends PATCH request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'patch',\n    value: function patch(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'PATCH'\n      });\n    }\n\n    /**\n     * Sends PATCH request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {JSON} json\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'patchJson',\n    value: function patchJson(endpoint, json) {\n      return this.patch(endpoint, (0, _stringify2.default)(json));\n    }\n\n    /**\n     * Upload with progress\n     * @param {String} endpoint\n     * @param {Object} body and headers\n     * @param {Function} callback handler for update progress only works for client side for now\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'upload',\n    value: function upload(endpoint, options, onProgress) {\n      var _private2 = this.private,\n          base = _private2.base,\n          token = _private2.token;\n\n      var headers = options.headers ? _lodash2.default.clone(options.headers) : {};\n      if (token) headers.Authorization = 'Bearer ' + token;\n      if (_topcoderReactUtils.isomorphy.isClientSide()) {\n        return new _promise2.default(function (res, rej) {\n          var xhr = new XMLHttpRequest(); //eslint-disable-line\n          xhr.open(options.method, '' + base + endpoint);\n          (0, _keys2.default)(headers).forEach(function (key) {\n            if (headers[key] != null) {\n              xhr.setRequestHeader(key, headers[key]);\n            }\n          });\n          xhr.onload = function (e) {\n            return res(e.target.responseText);\n          };\n          xhr.onerror = rej;\n          if (xhr.upload && onProgress) {\n            xhr.upload.onprogress = function (evt) {\n              if (evt.lengthComputable) onProgress(evt.loaded / evt.total);\n            };\n          }\n          xhr.send(options.body);\n        });\n      }\n      return this.fetch(endpoint, options);\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Api;\n}();\n\nvar _default = Api;\nexports.default = _default;\n\n/*\n * Topcoder API\n */\n\nvar lastApiInstances = {};\n\n/**\n * Returns a new or existing Api object for Topcoder API.\n * @param {String} version The API version.\n * @param {String} token Optional. Auth token for Topcoder API.\n * @return {Api} API service object.\n */\nfunction getApi(version, token) {\n  if (!version || !_topcoderReactUtils.config.API[version]) {\n    throw new Error(version + ' is not a valid API version');\n  }\n  if (!lastApiInstances[version] || lastApiInstances[version].private.token !== token) {\n    lastApiInstances[version] = new Api(_topcoderReactUtils.config.API[version], token);\n  }\n  return lastApiInstances[version];\n}\n\n/**\n * Keep the old API factories for backwards compatibility\n * DO NOT USE THEM FOR NEW IMPLEMENTATIONS.\n * USE THE getApi(version, token) FACTORY.\n */\nvar getApiV2 = exports.getApiV2 = function getApiV2(token) {\n  return getApi('V2', token);\n};\nvar getApiV3 = exports.getApiV3 = function getApiV3(token) {\n  return getApi('V3', token);\n};\nvar getApiV4 = exports.getApiV4 = function getApiV4(token) {\n  return getApi('V4', token);\n};\nvar getApiV5 = exports.getApiV5 = function getApiV5(token) {\n  return getApi('V5', token);\n};\n\ngetTcM2mToken.MIN_LIFETIME = 30 * 1000; // [ms]\n\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(MIN_API_CALL_DELAY, 'MIN_API_CALL_DELAY', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(API_THROTTLING, 'API_THROTTLING', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(lastApiCallTimestamp, 'lastApiCallTimestamp', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(Api, 'Api', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(lastApiInstances, 'lastApiInstances', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApi, 'getApi', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV2, 'getApiV2', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV3, 'getApiV3', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV4, 'getApiV4', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV5, 'getApiV5', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getTcM2mToken, 'getTcM2mToken', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/api.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/api.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getTcM2mToken = exports.getApiV5 = exports.getApiV4 = exports.getApiV3 = exports.getApiV2 = undefined;\n\nvar _keys = __webpack_require__(/*! babel-runtime/core-js/object/keys */ \"babel-runtime/core-js/object/keys\");\n\nvar _keys2 = _interopRequireDefault(_keys);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\n/**\n * Gets a valid TC M2M token, either requesting one from TC Auth0 API, or\n * serving one from internal cache.\n *\n * @return {Promise} Resolves to a token, valid at least next\n *  getTcM2mToken.MIN_LIFETIME milliseconds.\n *\n * @throw if called outside of the server.s\n */\nvar getTcM2mToken = exports.getTcM2mToken = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n    var now, cached, TC_M2M, res;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            if (_topcoderReactUtils.isomorphy.isServerSide()) {\n              _context2.next = 2;\n              break;\n            }\n\n            throw new Error('getTcM2mToken() called outside the server');\n\n          case 2:\n            now = Date.now();\n            cached = getTcM2mToken.cached;\n            TC_M2M = _topcoderReactUtils.config.SECRET.TC_M2M;\n\n            if (!(!cached || cached.expires < now + getTcM2mToken.MIN_LIFETIME)) {\n              _context2.next = 13;\n              break;\n            }\n\n            _context2.next = 8;\n            return (0, _isomorphicFetch2.default)('https://' + _topcoderReactUtils.config.AUTH0.DOMAIN + '/oauth/token', {\n              headers: { 'Content-Type': 'application/json' },\n              body: (0, _stringify2.default)({\n                client_id: TC_M2M.CLIENT_ID,\n                client_secret: TC_M2M.CLIENT_SECRET,\n                audience: TC_M2M.AUDIENCE,\n                grant_type: TC_M2M.GRANT_TYPE\n              }),\n              method: 'POST'\n            });\n\n          case 8:\n            res = _context2.sent;\n            _context2.next = 11;\n            return res.json();\n\n          case 11:\n            res = _context2.sent;\n\n            getTcM2mToken.cached = {\n              expires: now + 1000 * res.expires_in, // [ms]\n              token: res.access_token\n            };\n\n          case 13:\n            return _context2.abrupt('return', getTcM2mToken.cached.token);\n\n          case 14:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n\n  return function getTcM2mToken() {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\nexports.getApi = getApi;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _isomorphicFetch = __webpack_require__(/*! isomorphic-fetch */ \"isomorphic-fetch\");\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _time = __webpack_require__(/*! ../utils/time */ \"./src/utils/time.js\");\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.api\"\n    * @desc This module provides a service for conventient access to Topcoder APIs.\n    */\n\n/* The minimal delay [ms] between API calls. To avoid problems with the requests\n * rate limits configured in Topcoder APIs, we throttle requests rate at the\n * client side, and at server-side, in dev mode (which is meant to be used for\n * local development. */\nvar MIN_API_CALL_DELAY = _topcoderReactUtils.isomorphy.isDevBuild() ? 1000 : 200;\n\nvar API_THROTTLING = true;\n\nvar lastApiCallTimestamp = Date.now();\n\n/**\n * @static\n * @member default\n * @desc The default export from the module is\n *  {@link module:services.api~Api} class.\n */\n\n/**\n * API service object. It is reused for both Topcoder API v2 and v3,\n * as in these cases we are fine with the same interface, and the only\n * thing we need to be different is the base URL and auth token to use.\n */\n\nvar Api = function () {\n  /**\n   * Creates a new Api object.\n   * @param {String} base Base URL of the API.\n   * @param {String} token Optional. Authorization token.\n   */\n  function Api(base, token) {\n    (0, _classCallCheck3.default)(this, Api);\n\n    this.private = {\n      base: base,\n      token: token\n    };\n  }\n\n  /**\n   * Sends HTTP request to the specified API endpoint. This method is just\n   * a convenient wrapper around isomorphic fetch(..):\n   *\n   *  - If API service has auth token, Authorization header is automatically\n   *    added to the request;\n   *\n   *  - If no Content-Type header set in options, it is automatically set to\n   *    \"application/json\". In case you want to avoid it, pass null into\n   *    Content-Type header option.\n   *\n   * For additional details see https://github.github.io/fetch/\n   * @param {String} enpoint Should start with slash, like /endpoint.\n   * @param {Object} options Optional. Fetch options.\n   * @return {Promise} It resolves to the HTTP response object. To get the\n   *  actual data you probably want to call .json() method of that object.\n   *  Mind that this promise rejects only on network errors. In case of\n   *  HTTP errors (404, etc.) the promise will be resolved successfully,\n   *  and you should check .status or .ok fields of the response object\n   *  to find out the response status.\n   */\n\n\n  (0, _createClass3.default)(Api, [{\n    key: 'fetch',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(endpoint) {\n        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n        var _private, base, token, headers, now;\n\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _private = this.private, base = _private.base, token = _private.token;\n                headers = options.headers ? _lodash2.default.clone(options.headers) : {};\n\n                if (token) headers.Authorization = 'Bearer ' + token;\n\n                _context.t0 = headers['Content-Type'];\n                _context.next = _context.t0 === null ? 6 : _context.t0 === undefined ? 8 : 10;\n                break;\n\n              case 6:\n                delete headers['Content-Type'];\n                return _context.abrupt('break', 10);\n\n              case 8:\n                headers['Content-Type'] = 'application/json';\n                return _context.abrupt('break', 10);\n\n              case 10:\n                if (!(API_THROTTLING && (_topcoderReactUtils.isomorphy.isClientSide() || _topcoderReactUtils.isomorphy.isDevBuild()))) {\n                  _context.next = 19;\n                  break;\n                }\n\n                now = Date.now();\n\n                lastApiCallTimestamp += MIN_API_CALL_DELAY;\n\n                if (!(lastApiCallTimestamp > now)) {\n                  _context.next = 18;\n                  break;\n                }\n\n                _context.next = 16;\n                return (0, _time.delay)(lastApiCallTimestamp - now);\n\n              case 16:\n                _context.next = 19;\n                break;\n\n              case 18:\n                lastApiCallTimestamp = now;\n\n              case 19:\n                return _context.abrupt('return', (0, _isomorphicFetch2.default)('' + base + endpoint, (0, _extends3.default)({}, options, {\n                  headers: headers\n                })).catch(function (e) {\n                  (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.NETWORK, '' + base + endpoint, e.message);\n                  throw e;\n                }));\n\n              case 20:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function fetch(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return fetch;\n    }()\n\n    /**\n     * Sends DELETE request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'delete',\n    value: function _delete(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'DELETE'\n      });\n    }\n\n    /**\n     * Sends GET request to the specified endpoint.\n     * @param {String} endpoint\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'get',\n    value: function get(endpoint) {\n      return this.fetch(endpoint);\n    }\n\n    /**\n     * Sends POST request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'post',\n    value: function post(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'POST'\n      });\n    }\n\n    /**\n     * Sends POST request to the specified endpoint, with JSON payload.\n     * @param {String} endpoint\n     * @param {JSON} json\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'postJson',\n    value: function postJson(endpoint, json) {\n      return this.post(endpoint, (0, _stringify2.default)(json));\n    }\n\n    /**\n     * Sends PUT request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'put',\n    value: function put(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'PUT'\n      });\n    }\n\n    /**\n     * Sends PUT request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {JSON} json\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'putJson',\n    value: function putJson(endpoint, json) {\n      return this.put(endpoint, (0, _stringify2.default)(json));\n    }\n\n    /**\n     * Sends PATCH request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {Blob|BufferSource|FormData|String} body\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'patch',\n    value: function patch(endpoint, body) {\n      return this.fetch(endpoint, {\n        body: body,\n        method: 'PATCH'\n      });\n    }\n\n    /**\n     * Sends PATCH request to the specified endpoint.\n     * @param {String} endpoint\n     * @param {JSON} json\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'patchJson',\n    value: function patchJson(endpoint, json) {\n      return this.patch(endpoint, (0, _stringify2.default)(json));\n    }\n\n    /**\n     * Upload with progress\n     * @param {String} endpoint\n     * @param {Object} body and headers\n     * @param {Function} callback handler for update progress only works for client side for now\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'upload',\n    value: function upload(endpoint, options, onProgress) {\n      var _private2 = this.private,\n          base = _private2.base,\n          token = _private2.token;\n\n      var headers = options.headers ? _lodash2.default.clone(options.headers) : {};\n      if (token) headers.Authorization = 'Bearer ' + token;\n      if (_topcoderReactUtils.isomorphy.isClientSide()) {\n        return new _promise2.default(function (res, rej) {\n          var xhr = new XMLHttpRequest(); //eslint-disable-line\n          xhr.open(options.method, '' + base + endpoint);\n          (0, _keys2.default)(headers).forEach(function (key) {\n            if (headers[key] != null) {\n              xhr.setRequestHeader(key, headers[key]);\n            }\n          });\n          xhr.onload = function (e) {\n            return res(e.target.responseText);\n          };\n          xhr.onerror = rej;\n          if (xhr.upload && onProgress) {\n            xhr.upload.onprogress = function (evt) {\n              if (evt.lengthComputable) onProgress(evt.loaded / evt.total);\n            };\n          }\n          xhr.send(options.body);\n        });\n      }\n      return this.fetch(endpoint, options);\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Api;\n}();\n\nvar _default = Api;\nexports.default = _default;\n\n/*\n * Topcoder API\n */\n\nvar lastApiInstances = {};\n\n/**\n * Returns a new or existing Api object for Topcoder API.\n * @param {String} version The API version.\n * @param {String} token Optional. Auth token for Topcoder API.\n * @return {Api} API service object.\n */\nfunction getApi(version, token) {\n  if (!version || !_topcoderReactUtils.config.API[version]) {\n    throw new Error(version + ' is not a valid API version');\n  }\n  if (!lastApiInstances[version] || lastApiInstances[version].private.token !== token) {\n    lastApiInstances[version] = new Api(_topcoderReactUtils.config.API[version], token);\n  }\n  return lastApiInstances[version];\n}\n\n/**\n * Keep the old API factories for backwards compatibility\n * DO NOT USE THEM FOR NEW IMPLEMENTATIONS.\n * USE THE getApi(version, token) FACTORY.\n */\nvar getApiV2 = exports.getApiV2 = function getApiV2(token) {\n  return getApi('V2', token);\n};\nvar getApiV3 = exports.getApiV3 = function getApiV3(token) {\n  return getApi('V3', token);\n};\nvar getApiV4 = exports.getApiV4 = function getApiV4(token) {\n  return getApi('V4', token);\n};\nvar getApiV5 = exports.getApiV5 = function getApiV5(token) {\n  return getApi('V5', token);\n};\n\ngetTcM2mToken.MIN_LIFETIME = 30 * 1000; // [ms]\n\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(MIN_API_CALL_DELAY, 'MIN_API_CALL_DELAY', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(API_THROTTLING, 'API_THROTTLING', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(lastApiCallTimestamp, 'lastApiCallTimestamp', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(Api, 'Api', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(lastApiInstances, 'lastApiInstances', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApi, 'getApi', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV2, 'getApiV2', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV3, 'getApiV3', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV4, 'getApiV4', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getApiV5, 'getApiV5', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(getTcM2mToken, 'getTcM2mToken', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/api.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/api.js?");
 
 /***/ }),
 
@@ -898,7 +898,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.billing\"\n    * @desc Access to Topcoder billing accounts.\n    */\n\n\n/**\n * @static\n * @member default\n * @desc Default module export is\n *  {@link module:services.billing~Billing} class.\n */\n\n/**\n * Billing service object.\n */\nvar Billing = function () {\n  /**\n   * Creates a new service.\n   * @param {String} tokenV3 Topcoder auth token v3.\n   */\n  function Billing(tokenV3) {\n    (0, _classCallCheck3.default)(this, Billing);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets billing accounts accessible to service user.\n   * @return {Promise} Resolves to the list of billing account objects.\n   */\n\n\n  (0, _createClass3.default)(Billing, [{\n    key: 'getUserBillingAccounts',\n    value: function getUserBillingAccounts() {\n      return this.private.api.fetch();\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Billing;\n}();\n\nvar lastInstance = null;\n\n/**\n * Returns a new or existing Billing service for the user specified by token.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Billing} Billing service instance.\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new Billing(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = Billing;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(Billing, 'Billing', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/billing.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/billing.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/billing.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/billing.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/billing.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.billing\"\n    * @desc Access to Topcoder billing accounts.\n    */\n\n\n/**\n * @static\n * @member default\n * @desc Default module export is\n *  {@link module:services.billing~Billing} class.\n */\n\n/**\n * Billing service object.\n */\nvar Billing = function () {\n  /**\n   * Creates a new service.\n   * @param {String} tokenV3 Topcoder auth token v3.\n   */\n  function Billing(tokenV3) {\n    (0, _classCallCheck3.default)(this, Billing);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets billing accounts accessible to service user.\n   * @return {Promise} Resolves to the list of billing account objects.\n   */\n\n\n  (0, _createClass3.default)(Billing, [{\n    key: 'getUserBillingAccounts',\n    value: function getUserBillingAccounts() {\n      return this.private.api.fetch();\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Billing;\n}();\n\nvar lastInstance = null;\n\n/**\n * Returns a new or existing Billing service for the user specified by token.\n * @param {String} tokenV3 Topcoder auth token v3.\n * @return {Billing} Billing service instance.\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new Billing(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = Billing;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(Billing, 'Billing', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/billing.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/billing.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/billing.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/billing.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/billing.js?");
 
 /***/ }),
 
@@ -910,7 +910,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ORDER_BY = undefined;\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\n/**\n * Helper method that checks for HTTP error response and throws Error in this case.\n * @param {Object} res HTTP response object\n * @return {Object} API JSON response object\n * @private\n */\nvar checkError = function () {\n  var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(res) {\n    var jsonRes;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            if (res.ok) {\n              _context.next = 3;\n              break;\n            }\n\n            if (res.status >= 500) {\n              (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.API, '/challenges', res.statusText);\n            }\n            throw new Error(res.statusText);\n\n          case 3:\n            _context.next = 5;\n            return res.json();\n\n          case 5:\n            jsonRes = _context.sent.result;\n\n            if (!(jsonRes.status !== 200)) {\n              _context.next = 8;\n              break;\n            }\n\n            throw new Error(jsonRes.content);\n\n          case 8:\n            return _context.abrupt('return', jsonRes);\n\n          case 9:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function checkError(_x) {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * Challenge service.\n */\n\n\nexports.normalizeChallengeDetails = normalizeChallengeDetails;\nexports.normalizeChallenge = normalizeChallenge;\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.challenges\"\n    * @desc This module provides a service for convenient manipulation with\n    *  Topcoder challenges via TC API.\n    */\n\nvar ORDER_BY = exports.ORDER_BY = {\n  SUBMISSION_END_DATE: 'submissionEndDate'\n};\n\n/**\n * Normalizes a regular challenge details object received from the backend APIs.\n * @todo Why this one is exported? It should be only used internally!\n * @param {Object} challenge Challenge object received from the /challenges/{id}\n *  endpoint.\n * @param {Object} filtered Challenge object received from the\n *  /challenges?filter=id={id} endpoint.\n * @param {Object} user Challenge object received from the\n *  /members/{username}/challenges?filter=id={id} endpoint.\n * If action was fired for authenticated visitor, `user` will contain\n * details fetched specifically for the user (thus may include additional\n * data comparing to the standard API response for the challenge details,\n * stored in `filtered`).\n * @param {String} username Optional.\n * @return {Object} Normalized challenge object.\n */\nfunction normalizeChallengeDetails(challenge, filtered, user, username) {\n  // Normalize exising data to make it consistent with the rest of the code\n  var finalChallenge = (0, _extends3.default)({}, challenge, {\n\n    id: challenge.challengeId,\n    reliabilityBonus: _lodash2.default.get(filtered, 'reliabilityBonus', 0),\n    status: (challenge.currentStatus || '').toUpperCase(),\n\n    allPhases: [],\n    currentPhases: [],\n    name: challenge.challengeName || challenge.challengeTitle,\n    projectId: Number(challenge.projectId),\n    forumId: Number(challenge.forumId),\n    introduction: challenge.introduction || '',\n    detailedRequirements: challenge.detailedRequirements === 'null' ? '' : challenge.detailedRequirements,\n    finalSubmissionGuidelines: challenge.finalSubmissionGuidelines === 'null' ? '' : challenge.finalSubmissionGuidelines,\n    screeningScorecardId: Number(challenge.screeningScorecardId),\n    reviewScorecardId: Number(challenge.reviewScorecardId),\n    numberOfCheckpointsPrizes: challenge.numberOfCheckpointsPrizes,\n    topCheckPointPrize: challenge.topCheckPointPrize,\n    submissionsViewable: challenge.submissionsViewable || 'false',\n    reviewType: challenge.reviewType,\n    allowStockArt: challenge.allowStockArt === 'true',\n    fileTypes: challenge.filetypes || [],\n    environment: challenge.environment,\n    codeRepo: challenge.codeRepo,\n    forumLink: challenge.forumLink,\n    submissionLimit: Number(challenge.submissionLimit) || 0,\n    drPoints: challenge.digitalRunPoints,\n    directUrl: challenge.directUrl,\n    technologies: challenge.technologies || challenge.technology || [],\n    platforms: challenge.platforms || [],\n    prizes: challenge.prize || challenge.prizes || [],\n    events: _lodash2.default.map(challenge.event, function (e) {\n      return {\n        eventName: e.eventShortDesc,\n        eventId: e.id,\n        description: e.eventDescription\n      };\n    }),\n    terms: challenge.terms,\n    submissions: challenge.submissions,\n    track: _lodash2.default.toUpper(challenge.challengeCommunity),\n    subTrack: challenge.subTrack,\n    checkpoints: challenge.checkpoints,\n    documents: challenge.documents || [],\n    numRegistrants: challenge.numberOfRegistrants,\n    numberOfCheckpointSubmissions: challenge.numberOfCheckpointSubmissions,\n    registrants: challenge.registrants || []\n  });\n\n  // Winners have different field names, needs to be normalized to match `filtered` and `challenge`\n  finalChallenge.winners = _lodash2.default.map(challenge.winners, function (winner, index) {\n    return (0, _extends3.default)({}, winner, {\n      handle: winner.submitter,\n      placement: winner.rank || index + 1 // Legacy MMs do not have a rank but are sorted by points\n    });\n  });\n\n  if (finalChallenge.subTrack === 'MARATHON_MATCH') {\n    finalChallenge.track = 'DATA_SCIENCE';\n  }\n\n  // It's not clear if this will be the main event, will need to be investigated\n  finalChallenge.mainEvent = finalChallenge.events[0] || {};\n\n  /* It's unclear if these normalization steps are still required for `challenge` */\n  // Fill missing data from filtered\n  if (filtered) {\n    var groups = {};\n    if (filtered.groupIds) {\n      filtered.groupIds.forEach(function (id) {\n        groups[id] = true;\n      });\n    }\n\n    _lodash2.default.merge(finalChallenge, {\n      componentId: filtered.componentId,\n      contestId: filtered.contestId,\n\n      submissionEndDate: filtered.submissionEndDate, // Dates are not correct in `challenge`\n      submissionEndTimestamp: filtered.submissionEndDate, // Dates are not correct in `challenge`\n\n      /* Taking phases from filtered, because dates are not correct in `challenge` */\n      allPhases: filtered.allPhases || [],\n\n      /* Taking phases from filtered, because dates are not correct in `challenge` */\n      currentPhases: filtered.currentPhases || [],\n\n      /* `challenge` has incorrect value for numberOfSubmissions for some reason */\n      numSubmissions: filtered.numSubmissions,\n      groups: groups\n    });\n  }\n\n  // Fill missing data from user\n  if (user) {\n    _lodash2.default.defaults(finalChallenge, {\n      userDetails: user.userDetails\n    });\n  }\n\n  // Fill some derived data\n  var registrationOpen = _lodash2.default.some(finalChallenge.allPhases, function (phase) {\n    return phase.phaseType === 'Registration' && phase.phaseStatus === 'Open';\n  }) ? 'Yes' : 'No';\n  _lodash2.default.defaults(finalChallenge, {\n    communities: new _set2.default([_tc.COMPETITION_TRACKS[finalChallenge.track]]),\n    registrationOpen: registrationOpen,\n    users: username ? (0, _defineProperty3.default)({}, username, true) : {}\n  });\n\n  // A hot fix to show submissions for on-going challenges\n  if (!finalChallenge.submissions || !finalChallenge.submissions.length) {\n    finalChallenge.submissions = finalChallenge.registrants.filter(function (r) {\n      return r.submissionDate || '';\n    }).sort(function (a, b) {\n      return (a.submissionDate || '').localeCompare(b.submissionDate || '');\n    });\n  }\n\n  if (!finalChallenge.allPhases) finalChallenge.allPhases = [];\n  if (!finalChallenge.track) finalChallenge.track = '';\n\n  return finalChallenge;\n}\n\n/**\n * Normalizes a regular challenge object received from the backend.\n * NOTE: This function is copied from the existing code in the challenge listing\n * component. It is possible, that this normalization is not necessary after we\n * have moved to Topcoder API, but it is kept for now to minimize a risk of\n * breaking anything.\n * @todo Should be used only internally!\n * @param {Object} challenge Challenge object received from the backend.\n * @param {String} username Optional.\n */\nfunction normalizeChallenge(challenge, username) {\n  var registrationOpen = challenge.allPhases.filter(function (d) {\n    return d.phaseType === 'Registration';\n  })[0].phaseStatus === 'Open' ? 'Yes' : 'No';\n  var groups = {};\n  if (challenge.groupIds) {\n    challenge.groupIds.forEach(function (id) {\n      groups[id] = true;\n    });\n  }\n  /* eslint-disable no-param-reassign */\n  if (!challenge.prizes) challenge.prizes = challenge.prize || [];\n  if (!challenge.totalPrize) {\n    challenge.totalPrize = challenge.prizes.reduce(function (sum, x) {\n      return sum + x;\n    }, 0);\n  }\n  if (!challenge.technologies) challenge.technologies = [];\n  if (!challenge.platforms) challenge.platforms = [];\n\n  if (challenge.subTrack === 'DEVELOP_MARATHON_MATCH') {\n    challenge.track = 'DATA_SCIENCE';\n  }\n  /* eslint-enable no-param-reassign */\n\n  _lodash2.default.defaults(challenge, {\n    communities: new _set2.default([_tc.COMPETITION_TRACKS[challenge.track]]),\n    groups: groups,\n    registrationOpen: registrationOpen,\n    submissionEndTimestamp: challenge.submissionEndDate,\n    users: username ? (0, _defineProperty3.default)({}, username, true) : {}\n  });\n}\nvar ChallengesService = function () {\n  /**\n   * Creates a new ChallengeService instance.\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n   */\n  function ChallengesService(tokenV3, tokenV2) {\n    var _this = this;\n\n    (0, _classCallCheck3.default)(this, ChallengesService);\n\n    /**\n     * Private function being re-used in all methods related to getting\n     * challenges. It handles query-related arguments in the uniform way:\n     * @param {String} endpoint API endpoint, where the request will be send.\n     * @param {Object} filters Optional. A map of filters to pass as `filter`\n     *  query parameter (this function takes care to stringify it properly).\n     * @param {Object} params Optional. A map of any other parameters beside\n     *  `filter`.\n     */\n    var getChallenges = function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(endpoint) {\n        var filters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n        var query, url, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                query = (0, _extends3.default)({\n                  filter: _qs2.default.stringify(filters, { encode: false })\n                }, params);\n                url = endpoint + '?' + _qs2.default.stringify(query);\n                _context2.next = 4;\n                return _this.private.api.get(url).then(checkError);\n\n              case 4:\n                res = _context2.sent;\n                return _context2.abrupt('return', {\n                  challenges: res.content || [],\n                  totalCount: res.metadata.totalCount,\n                  meta: res.metadata\n                });\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, _this);\n      }));\n\n      return function getChallenges(_x2) {\n        return _ref4.apply(this, arguments);\n      };\n    }();\n\n    this.private = {\n      api: (0, _api.getApi)('V4', tokenV3),\n      apiV2: (0, _api.getApi)('V2', tokenV2),\n      getChallenges: getChallenges,\n      tokenV2: tokenV2,\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Activates the specified challenge.\n   * @param {Number} challengeId\n   * @return {Promise} Resolves to null value in case of success; otherwise it\n   *  is rejected.\n   */\n\n\n  (0, _createClass3.default)(ChallengesService, [{\n    key: 'activate',\n    value: function () {\n      var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(challengeId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.api.post('/challenges/' + challengeId + '/activate');\n\n              case 2:\n                res = _context3.sent;\n\n                if (res.ok) {\n                  _context3.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                _context3.next = 7;\n                return res.json();\n\n              case 7:\n                res = _context3.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context3.next = 10;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 10:\n                return _context3.abrupt('return', res.content);\n\n              case 11:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function activate(_x5) {\n        return _ref5.apply(this, arguments);\n      }\n\n      return activate;\n    }()\n\n    /**\n     * Closes the specified challenge.\n     * @param {Number} challengeId\n     * @param {Number} winnerId Optional. ID of the assignee to declare the\n     *  winner.\n     * @return {Promise} Resolves to null value in case of success; otherwise it\n     *  is rejected.\n     */\n\n  }, {\n    key: 'close',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(challengeId, winnerId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                url = '/challenges/' + challengeId + '/close';\n\n                if (winnerId) url = url + '?winnerId=' + winnerId;\n                _context4.next = 4;\n                return this.private.api.post(url);\n\n              case 4:\n                res = _context4.sent;\n\n                if (res.ok) {\n                  _context4.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context4.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context4.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context4.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context4.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function close(_x6, _x7) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return close;\n    }()\n\n    /**\n     * Creates a new payment task.\n     * @param {Number} projectId\n     * @param {Number} accountId Billing account ID.\n     * @param {String} title\n     * @param {String} description\n     * @param {String} assignee\n     * @param {Number} payment\n     * @param {String} submissionGuidelines\n     * @param {Number} copilotId\n     * @param {Number} copilotFee\n     * @param {?} technologies\n     * @return {Promise} Resolves to the created challenge object (payment task).\n     */\n\n  }, {\n    key: 'createTask',\n    value: function () {\n      var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(projectId, accountId, title, description, assignee, payment, submissionGuidelines, copilotId, copilotFee, technologies) {\n        var payload, res;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                payload = {\n                  param: {\n                    assignees: [assignee],\n                    billingAccountId: accountId,\n                    confidentialityType: 'public',\n                    detailedRequirements: description,\n                    submissionGuidelines: submissionGuidelines,\n                    milestoneId: 1,\n                    name: title,\n                    technologies: technologies,\n                    prizes: payment ? [payment] : [],\n                    projectId: projectId,\n                    registrationStartsAt: (0, _moment2.default)().toISOString(),\n                    reviewType: 'INTERNAL',\n                    subTrack: 'FIRST_2_FINISH',\n                    task: true\n                  }\n                };\n\n                if (copilotId) {\n                  _lodash2.default.assign(payload.param, {\n                    copilotId: copilotId,\n                    copilotFee: copilotFee\n                  });\n                }\n                _context5.next = 4;\n                return this.private.api.postJson('/challenges', payload);\n\n              case 4:\n                res = _context5.sent;\n\n                if (res.ok) {\n                  _context5.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context5.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context5.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context5.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context5.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function createTask(_x8, _x9, _x10, _x11, _x12, _x13, _x14, _x15, _x16, _x17) {\n        return _ref7.apply(this, arguments);\n      }\n\n      return createTask;\n    }()\n\n    /**\n     * Gets challenge details from Topcoder API.\n     * NOTE: This function also uses API v2 and other endpoints for now, due\n     * to some information is missing or\n     * incorrect in the main endpoint. This may change in the future.\n     * @param {Number|String} challengeId\n     * @return {Promise} Resolves to the challenge object.\n     */\n\n  }, {\n    key: 'getChallengeDetails',\n    value: function () {\n      var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(challengeId) {\n        var challenge, challengeFiltered, username, challengeUser, finalChallenge;\n        return _regenerator2.default.wrap(function _callee6$(_context6) {\n          while (1) {\n            switch (_context6.prev = _context6.next) {\n              case 0:\n                _context6.next = 2;\n                return this.private.api.get('/challenges/' + challengeId).then(checkError).then(function (res) {\n                  return res.content;\n                });\n\n              case 2:\n                challenge = _context6.sent;\n                _context6.next = 5;\n                return this.private.getChallenges('/challenges/', { id: challengeId }).then(function (res) {\n                  return res.challenges[0];\n                });\n\n              case 5:\n                challengeFiltered = _context6.sent;\n                username = this.private.tokenV3 && (0, _tcAccounts.decodeToken)(this.private.tokenV3).handle;\n                _context6.t0 = username;\n\n                if (!_context6.t0) {\n                  _context6.next = 12;\n                  break;\n                }\n\n                _context6.next = 11;\n                return this.getUserChallenges(username, { id: challengeId }).then(function (res) {\n                  return res.challenges[0];\n                }).catch(function () {\n                  return null;\n                });\n\n              case 11:\n                _context6.t0 = _context6.sent;\n\n              case 12:\n                challengeUser = _context6.t0;\n                finalChallenge = normalizeChallengeDetails(challenge, challengeFiltered, challengeUser, username);\n\n\n                finalChallenge.fetchedWithAuth = Boolean(this.private.api.private.token);\n\n                return _context6.abrupt('return', finalChallenge);\n\n              case 16:\n              case 'end':\n                return _context6.stop();\n            }\n          }\n        }, _callee6, this);\n      }));\n\n      function getChallengeDetails(_x18) {\n        return _ref8.apply(this, arguments);\n      }\n\n      return getChallengeDetails;\n    }()\n\n    /**\n     * Gets possible challenge subtracks.\n     * @return {Promise} Resolves to the array of subtrack names.\n     */\n\n  }, {\n    key: 'getChallengeSubtracks',\n    value: function getChallengeSubtracks() {\n      return this.private.api.get('/challenge-types').then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : new Error(res.result.content);\n      });\n    }\n\n    /**\n     * Gets possible challenge tags (technologies).\n     * @return {Promise} Resolves to the array of tag strings.\n     */\n\n  }, {\n    key: 'getChallengeTags',\n    value: function getChallengeTags() {\n      return this.private.api.get('/technologies').then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : new Error(res.result.content);\n      });\n    }\n\n    /**\n     * Gets challenges.\n     * @param {Object} filters Optional.\n     * @param {Object} params Optional.\n     * @return {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getChallenges',\n    value: function getChallenges(filters, params) {\n      return this.private.getChallenges('/challenges/', filters, params).then(function (res) {\n        res.challenges.forEach(function (item) {\n          return normalizeChallenge(item);\n        });\n        return res;\n      });\n    }\n\n    /**\n     * Gets SRM matches.\n     * @param {Object} params\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'getSrms',\n    value: function () {\n      var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(params) {\n        var res;\n        return _regenerator2.default.wrap(function _callee7$(_context7) {\n          while (1) {\n            switch (_context7.prev = _context7.next) {\n              case 0:\n                _context7.next = 2;\n                return this.private.api.get('/srms/?' + _qs2.default.stringify(params));\n\n              case 2:\n                res = _context7.sent;\n                return _context7.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context7.stop();\n            }\n          }\n        }, _callee7, this);\n      }));\n\n      function getSrms(_x19) {\n        return _ref9.apply(this, arguments);\n      }\n\n      return getSrms;\n    }()\n\n    /**\n     * Gets challenges of the specified user.\n     * @param {String} username User whose challenges we want to fetch.\n     * @param {Object} filters Optional.\n     * @param {Number} params Optional.\n     * @return {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getUserChallenges',\n    value: function getUserChallenges(username, filters, params) {\n      var endpoint = '/members/' + username.toLowerCase() + '/challenges/';\n      return this.private.getChallenges(endpoint, filters, params).then(function (res) {\n        res.challenges.forEach(function (item) {\n          return normalizeChallenge(item, username);\n        });\n        return res;\n      });\n    }\n\n    /**\n     * Gets marathon matches of the specified user.\n     * @param {String} username User whose challenges we want to fetch.\n     * @param {Object} filters Optional.\n     * @param {Number} params Optional.\n     * @return {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getUserMarathonMatches',\n    value: function getUserMarathonMatches(username, filters, params) {\n      var endpoint = '/members/' + username.toLowerCase() + '/mms/';\n      return this.private.getChallenges(endpoint, filters, params);\n    }\n\n    /**\n     * Gets SRM matches related to the user.\n     * @param {String} handle\n     * @param {Object} params\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'getUserSrms',\n    value: function () {\n      var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(handle, params) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                url = '/members/' + handle + '/srms/?' + _qs2.default.stringify(params);\n                _context8.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context8.sent;\n                return _context8.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context8.stop();\n            }\n          }\n        }, _callee8, this);\n      }));\n\n      function getUserSrms(_x20, _x21) {\n        return _ref10.apply(this, arguments);\n      }\n\n      return getUserSrms;\n    }()\n\n    /**\n     * Registers user to the specified challenge.\n     * @param {String} challengeId\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'register',\n    value: function () {\n      var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(challengeId) {\n        var endpoint, res;\n        return _regenerator2.default.wrap(function _callee9$(_context9) {\n          while (1) {\n            switch (_context9.prev = _context9.next) {\n              case 0:\n                endpoint = '/challenges/' + challengeId + '/register';\n                _context9.next = 3;\n                return this.private.api.postJson(endpoint);\n\n              case 3:\n                res = _context9.sent;\n\n                if (res.ok) {\n                  _context9.next = 6;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 6:\n                return _context9.abrupt('return', res.json());\n\n              case 7:\n              case 'end':\n                return _context9.stop();\n            }\n          }\n        }, _callee9, this);\n      }));\n\n      function register(_x22) {\n        return _ref11.apply(this, arguments);\n      }\n\n      return register;\n    }()\n\n    /**\n     * Unregisters user from the specified challenge.\n     * @param {String} challengeId\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'unregister',\n    value: function () {\n      var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(challengeId) {\n        var endpoint, res;\n        return _regenerator2.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                endpoint = '/challenges/' + challengeId + '/unregister';\n                _context10.next = 3;\n                return this.private.api.post(endpoint);\n\n              case 3:\n                res = _context10.sent;\n\n                if (res.ok) {\n                  _context10.next = 6;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 6:\n                return _context10.abrupt('return', res.json());\n\n              case 7:\n              case 'end':\n                return _context10.stop();\n            }\n          }\n        }, _callee10, this);\n      }));\n\n      function unregister(_x23) {\n        return _ref12.apply(this, arguments);\n      }\n\n      return unregister;\n    }()\n\n    /**\n     * Gets count of user's active challenges.\n     * @param {String} handle Topcoder user handle.\n     * @return {Action} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getActiveChallengesCount',\n    value: function getActiveChallengesCount(handle) {\n      var filter = { status: 'ACTIVE' };\n      var params = { limit: 1, offset: 0 };\n      return this.getUserChallenges(handle, filter, params).then(function (res) {\n        return res.totalCount;\n      });\n    }\n\n    /**\n     * Submits a challenge submission.  Uses APIV2 for Development submission\n     * and APIV3 for Design submisisons.\n     * @param {Object} body\n     * @param {String} challengeId\n     * @param {String} track Either DESIGN or DEVELOP\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'submit',\n    value: function submit(body, challengeId, track, onProgress) {\n      var api = void 0;\n      var contentType = void 0;\n      var url = void 0;\n\n      if (track === 'DESIGN') {\n        api = this.private.api;\n\n        contentType = 'application/json';\n        url = '/submissions/'; // The submission info is contained entirely in the JSON body\n      } else {\n        api = this.private.apiV2;\n        // contentType = 'multipart/form-data';\n        contentType = null;\n        url = '/develop/challenges/' + challengeId + '/upload';\n      }\n\n      return api.upload(url, {\n        body: body,\n        headers: { 'Content-Type': contentType },\n        method: 'POST'\n      }, onProgress).then(function (res) {\n        var jres = JSON.parse(res);\n        // Return result for Develop submission\n        if (track === 'DEVELOP') {\n          return jres;\n        }\n        // Design Submission requires an extra \"Processing\" POST\n        var procId = jres.result.content.id;\n        return api.upload('/submissions/' + procId + '/process/', {\n          body: (0, _stringify2.default)({ param: jres.result.content }),\n          headers: { 'Content-Type': contentType },\n          method: 'POST'\n        }, onProgress).then(function (procres) {\n          return JSON.parse(procres);\n        });\n      }, function (err) {\n        _logger2.default.error('Failed to submit to the challenge #' + challengeId, err);\n        throw err;\n      });\n    }\n\n    /**\n     * Updates the challenge (saves the give challenge to the API).\n     * @param {Object} challenge\n     * @param {String} tokenV3\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'updateChallenge',\n    value: function () {\n      var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(challenge) {\n        var URL, body, res;\n        return _regenerator2.default.wrap(function _callee11$(_context11) {\n          while (1) {\n            switch (_context11.prev = _context11.next) {\n              case 0:\n                URL = '/challenges/' + challenge.id;\n                body = { param: challenge };\n                _context11.next = 4;\n                return this.private.api.putJson(URL, body);\n\n              case 4:\n                res = _context11.sent;\n\n                if (res.ok) {\n                  _context11.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context11.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context11.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context11.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context11.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context11.stop();\n            }\n          }\n        }, _callee11, this);\n      }));\n\n      function updateChallenge(_x24) {\n        return _ref13.apply(this, arguments);\n      }\n\n      return updateChallenge;\n    }()\n\n    /**\n     * Gets roles of a user in the specified challenge. The user tested is\n     * the owner of authentication token used to instantiate the service.\n     *\n     * Notice, if you have already loaded the challenge as that user, these roles\n     * are attached to the challenge object under `userDetails.roles` path during\n     * challenge normalization. However, if you have not, this method is the most\n     * efficient way to get them, as it by-passes any unnecessary normalizations\n     * of the challenge object.\n     *\n     * @param {Number} challengeId Challenge ID.\n     */\n\n  }, {\n    key: 'getUserRolesInChallenge',\n    value: function () {\n      var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(challengeId) {\n        var user, username, url, data;\n        return _regenerator2.default.wrap(function _callee12$(_context12) {\n          while (1) {\n            switch (_context12.prev = _context12.next) {\n              case 0:\n                user = (0, _tcAccounts.decodeToken)(this.private.tokenV3);\n                username = user.handle || user.payload.handle;\n                url = '/members/' + username.toLowerCase() + '/challenges';\n                _context12.next = 5;\n                return this.private.getChallenges(url, { id: challengeId });\n\n              case 5:\n                data = _context12.sent;\n                return _context12.abrupt('return', data.challenges[0].userDetails.roles);\n\n              case 7:\n              case 'end':\n                return _context12.stop();\n            }\n          }\n        }, _callee12, this);\n      }));\n\n      function getUserRolesInChallenge(_x25) {\n        return _ref14.apply(this, arguments);\n      }\n\n      return getUserRolesInChallenge;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return ChallengesService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing challenges service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n * @return {ChallengesService} Challenges service object\n */\nfunction getService(tokenV3, tokenV2) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3 || lastInstance.tokenV2 !== tokenV2) {\n    lastInstance = new ChallengesService(tokenV3, tokenV2);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ORDER_BY, 'ORDER_BY', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(normalizeChallengeDetails, 'normalizeChallengeDetails', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(normalizeChallenge, 'normalizeChallenge', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(checkError, 'checkError', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(ChallengesService, 'ChallengesService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/challenges.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/challenges.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ORDER_BY = undefined;\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\n/**\n * Helper method that checks for HTTP error response and throws Error in this case.\n * @param {Object} res HTTP response object\n * @return {Object} API JSON response object\n * @private\n */\nvar checkError = function () {\n  var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(res) {\n    var jsonRes;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            if (res.ok) {\n              _context.next = 3;\n              break;\n            }\n\n            if (res.status >= 500) {\n              (0, _errors.setErrorIcon)(_errors.ERROR_ICON_TYPES.API, '/challenges', res.statusText);\n            }\n            throw new Error(res.statusText);\n\n          case 3:\n            _context.next = 5;\n            return res.json();\n\n          case 5:\n            jsonRes = _context.sent.result;\n\n            if (!(jsonRes.status !== 200)) {\n              _context.next = 8;\n              break;\n            }\n\n            throw new Error(jsonRes.content);\n\n          case 8:\n            return _context.abrupt('return', jsonRes);\n\n          case 9:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function checkError(_x) {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * Challenge service.\n */\n\n\nexports.normalizeChallengeDetails = normalizeChallengeDetails;\nexports.normalizeChallenge = normalizeChallenge;\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _tcAccounts = __webpack_require__(/*! tc-accounts */ \"tc-accounts\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _errors = __webpack_require__(/*! ../utils/errors */ \"./src/utils/errors.js\");\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/services/members.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.challenges\"\n    * @desc This module provides a service for convenient manipulation with\n    *  Topcoder challenges via TC API.\n    */\n\nvar ORDER_BY = exports.ORDER_BY = {\n  SUBMISSION_END_DATE: 'submissionEndDate'\n};\n\n/**\n * Normalizes a regular challenge details object received from the backend APIs.\n * @todo Why this one is exported? It should be only used internally!\n * @param {Object} challenge Challenge object received from the /challenges/{id}\n *  endpoint.\n * @param {Object} filtered Challenge object received from the\n *  /challenges?filter=id={id} endpoint.\n * @param {Object} user Challenge object received from the\n *  /members/{username}/challenges?filter=id={id} endpoint.\n * If action was fired for authenticated visitor, `user` will contain\n * details fetched specifically for the user (thus may include additional\n * data comparing to the standard API response for the challenge details,\n * stored in `filtered`).\n * @param {String} username Optional.\n * @return {Object} Normalized challenge object.\n */\nfunction normalizeChallengeDetails(challenge, filtered, user, username) {\n  // Normalize exising data to make it consistent with the rest of the code\n  var finalChallenge = (0, _extends3.default)({}, challenge, {\n\n    id: challenge.challengeId,\n    reliabilityBonus: _lodash2.default.get(filtered, 'reliabilityBonus', 0),\n    status: (challenge.currentStatus || '').toUpperCase(),\n\n    allPhases: [],\n    currentPhases: [],\n    name: challenge.challengeName || challenge.challengeTitle,\n    projectId: Number(challenge.projectId),\n    forumId: Number(challenge.forumId),\n    introduction: challenge.introduction || '',\n    detailedRequirements: challenge.detailedRequirements === 'null' ? '' : challenge.detailedRequirements,\n    finalSubmissionGuidelines: challenge.finalSubmissionGuidelines === 'null' ? '' : challenge.finalSubmissionGuidelines,\n    screeningScorecardId: Number(challenge.screeningScorecardId),\n    reviewScorecardId: Number(challenge.reviewScorecardId),\n    numberOfCheckpointsPrizes: challenge.numberOfCheckpointsPrizes,\n    topCheckPointPrize: challenge.topCheckPointPrize,\n    submissionsViewable: challenge.submissionsViewable || 'false',\n    reviewType: challenge.reviewType,\n    allowStockArt: challenge.allowStockArt === 'true',\n    fileTypes: challenge.filetypes || [],\n    environment: challenge.environment,\n    codeRepo: challenge.codeRepo,\n    forumLink: challenge.forumLink,\n    submissionLimit: Number(challenge.submissionLimit) || 0,\n    drPoints: challenge.digitalRunPoints,\n    directUrl: challenge.directUrl,\n    technologies: challenge.technologies || challenge.technology || [],\n    platforms: challenge.platforms || [],\n    prizes: challenge.prize || challenge.prizes || [],\n    events: _lodash2.default.map(challenge.event, function (e) {\n      return {\n        eventName: e.eventShortDesc,\n        eventId: e.id,\n        description: e.eventDescription\n      };\n    }),\n    terms: challenge.terms,\n    submissions: challenge.submissions,\n    track: _lodash2.default.toUpper(challenge.challengeCommunity),\n    subTrack: challenge.subTrack,\n    checkpoints: challenge.checkpoints,\n    documents: challenge.documents || [],\n    numRegistrants: challenge.numberOfRegistrants,\n    numberOfCheckpointSubmissions: challenge.numberOfCheckpointSubmissions,\n    registrants: challenge.registrants || []\n  });\n\n  // Winners have different field names, needs to be normalized to match `filtered` and `challenge`\n  finalChallenge.winners = _lodash2.default.map(challenge.winners, function (winner, index) {\n    return (0, _extends3.default)({}, winner, {\n      handle: winner.submitter,\n      placement: winner.rank || index + 1 // Legacy MMs do not have a rank but are sorted by points\n    });\n  });\n\n  if (finalChallenge.subTrack === 'MARATHON_MATCH') {\n    finalChallenge.track = 'DATA_SCIENCE';\n  }\n\n  // It's not clear if this will be the main event, will need to be investigated\n  finalChallenge.mainEvent = finalChallenge.events[0] || {};\n\n  /* It's unclear if these normalization steps are still required for `challenge` */\n  // Fill missing data from filtered\n  if (filtered) {\n    var groups = {};\n    if (filtered.groupIds) {\n      filtered.groupIds.forEach(function (id) {\n        groups[id] = true;\n      });\n    }\n\n    _lodash2.default.merge(finalChallenge, {\n      componentId: filtered.componentId,\n      contestId: filtered.contestId,\n\n      submissionEndDate: filtered.submissionEndDate, // Dates are not correct in `challenge`\n      submissionEndTimestamp: filtered.submissionEndDate, // Dates are not correct in `challenge`\n\n      /* Taking phases from filtered, because dates are not correct in `challenge` */\n      allPhases: filtered.allPhases || [],\n\n      /* Taking phases from filtered, because dates are not correct in `challenge` */\n      currentPhases: filtered.currentPhases || [],\n\n      /* `challenge` has incorrect value for numberOfSubmissions for some reason */\n      numSubmissions: filtered.numSubmissions,\n      groups: groups\n    });\n  }\n\n  // Fill missing data from user\n  if (user) {\n    _lodash2.default.defaults(finalChallenge, {\n      userDetails: user.userDetails\n    });\n  }\n\n  // Fill some derived data\n  var registrationOpen = _lodash2.default.some(finalChallenge.allPhases, function (phase) {\n    return phase.phaseType === 'Registration' && phase.phaseStatus === 'Open';\n  }) ? 'Yes' : 'No';\n  _lodash2.default.defaults(finalChallenge, {\n    communities: new _set2.default([_tc.COMPETITION_TRACKS[finalChallenge.track]]),\n    registrationOpen: registrationOpen,\n    users: username ? (0, _defineProperty3.default)({}, username, true) : {}\n  });\n\n  // A hot fix to show submissions for on-going challenges\n  if (!finalChallenge.submissions || !finalChallenge.submissions.length) {\n    finalChallenge.submissions = finalChallenge.registrants.filter(function (r) {\n      return r.submissionDate || '';\n    }).sort(function (a, b) {\n      return (a.submissionDate || '').localeCompare(b.submissionDate || '');\n    });\n  }\n\n  if (!finalChallenge.allPhases) finalChallenge.allPhases = [];\n  if (!finalChallenge.track) finalChallenge.track = '';\n\n  return finalChallenge;\n}\n\n/**\n * Normalizes a regular challenge object received from the backend.\n * NOTE: This function is copied from the existing code in the challenge listing\n * component. It is possible, that this normalization is not necessary after we\n * have moved to Topcoder API, but it is kept for now to minimize a risk of\n * breaking anything.\n * @todo Should be used only internally!\n * @param {Object} challenge Challenge object received from the backend.\n * @param {String} username Optional.\n */\nfunction normalizeChallenge(challenge, username) {\n  var registrationOpen = challenge.allPhases.filter(function (d) {\n    return d.phaseType === 'Registration';\n  })[0].phaseStatus === 'Open' ? 'Yes' : 'No';\n  var groups = {};\n  if (challenge.groupIds) {\n    challenge.groupIds.forEach(function (id) {\n      groups[id] = true;\n    });\n  }\n  /* eslint-disable no-param-reassign */\n  if (!challenge.prizes) challenge.prizes = challenge.prize || [];\n  if (!challenge.totalPrize) {\n    challenge.totalPrize = challenge.prizes.reduce(function (sum, x) {\n      return sum + x;\n    }, 0);\n  }\n  if (!challenge.technologies) challenge.technologies = [];\n  if (!challenge.platforms) challenge.platforms = [];\n\n  if (challenge.subTrack === 'DEVELOP_MARATHON_MATCH') {\n    challenge.track = 'DATA_SCIENCE';\n  }\n  /* eslint-enable no-param-reassign */\n\n  _lodash2.default.defaults(challenge, {\n    communities: new _set2.default([_tc.COMPETITION_TRACKS[challenge.track]]),\n    groups: groups,\n    registrationOpen: registrationOpen,\n    submissionEndTimestamp: challenge.submissionEndDate,\n    users: username ? (0, _defineProperty3.default)({}, username, true) : {}\n  });\n}\nvar ChallengesService = function () {\n  /**\n   * Creates a new ChallengeService instance.\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n   */\n  function ChallengesService(tokenV3, tokenV2) {\n    var _this = this;\n\n    (0, _classCallCheck3.default)(this, ChallengesService);\n\n    /**\n     * Private function being re-used in all methods related to getting\n     * challenges. It handles query-related arguments in the uniform way:\n     * @param {String} endpoint API endpoint, where the request will be send.\n     * @param {Object} filters Optional. A map of filters to pass as `filter`\n     *  query parameter (this function takes care to stringify it properly).\n     * @param {Object} params Optional. A map of any other parameters beside\n     *  `filter`.\n     */\n    var getChallenges = function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(endpoint) {\n        var filters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n        var query, url, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                query = (0, _extends3.default)({\n                  filter: _qs2.default.stringify(filters, { encode: false })\n                }, params);\n                url = endpoint + '?' + _qs2.default.stringify(query);\n                _context2.next = 4;\n                return _this.private.api.get(url).then(checkError);\n\n              case 4:\n                res = _context2.sent;\n                return _context2.abrupt('return', {\n                  challenges: res.content || [],\n                  totalCount: res.metadata.totalCount,\n                  meta: res.metadata\n                });\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, _this);\n      }));\n\n      return function getChallenges(_x2) {\n        return _ref4.apply(this, arguments);\n      };\n    }();\n\n    this.private = {\n      api: (0, _api.getApi)('V4', tokenV3),\n      apiV2: (0, _api.getApi)('V2', tokenV2),\n      getChallenges: getChallenges,\n      tokenV2: tokenV2,\n      tokenV3: tokenV3,\n      memberService: (0, _members.getService)()\n    };\n  }\n\n  /**\n   * Activates the specified challenge.\n   * @param {Number} challengeId\n   * @return {Promise} Resolves to null value in case of success; otherwise it\n   *  is rejected.\n   */\n\n\n  (0, _createClass3.default)(ChallengesService, [{\n    key: 'activate',\n    value: function () {\n      var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(challengeId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.api.post('/challenges/' + challengeId + '/activate');\n\n              case 2:\n                res = _context3.sent;\n\n                if (res.ok) {\n                  _context3.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                _context3.next = 7;\n                return res.json();\n\n              case 7:\n                res = _context3.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context3.next = 10;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 10:\n                return _context3.abrupt('return', res.content);\n\n              case 11:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function activate(_x5) {\n        return _ref5.apply(this, arguments);\n      }\n\n      return activate;\n    }()\n\n    /**\n     * Closes the specified challenge.\n     * @param {Number} challengeId\n     * @param {Number} winnerId Optional. ID of the assignee to declare the\n     *  winner.\n     * @return {Promise} Resolves to null value in case of success; otherwise it\n     *  is rejected.\n     */\n\n  }, {\n    key: 'close',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(challengeId, winnerId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                url = '/challenges/' + challengeId + '/close';\n\n                if (winnerId) url = url + '?winnerId=' + winnerId;\n                _context4.next = 4;\n                return this.private.api.post(url);\n\n              case 4:\n                res = _context4.sent;\n\n                if (res.ok) {\n                  _context4.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context4.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context4.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context4.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context4.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function close(_x6, _x7) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return close;\n    }()\n\n    /**\n     * Creates a new payment task.\n     * @param {Number} projectId\n     * @param {Number} accountId Billing account ID.\n     * @param {String} title\n     * @param {String} description\n     * @param {String} assignee\n     * @param {Number} payment\n     * @param {String} submissionGuidelines\n     * @param {Number} copilotId\n     * @param {Number} copilotFee\n     * @param {?} technologies\n     * @return {Promise} Resolves to the created challenge object (payment task).\n     */\n\n  }, {\n    key: 'createTask',\n    value: function () {\n      var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(projectId, accountId, title, description, assignee, payment, submissionGuidelines, copilotId, copilotFee, technologies) {\n        var payload, res;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                payload = {\n                  param: {\n                    assignees: [assignee],\n                    billingAccountId: accountId,\n                    confidentialityType: 'public',\n                    detailedRequirements: description,\n                    submissionGuidelines: submissionGuidelines,\n                    milestoneId: 1,\n                    name: title,\n                    technologies: technologies,\n                    prizes: payment ? [payment] : [],\n                    projectId: projectId,\n                    registrationStartsAt: (0, _moment2.default)().toISOString(),\n                    reviewType: 'INTERNAL',\n                    subTrack: 'FIRST_2_FINISH',\n                    task: true\n                  }\n                };\n\n                if (copilotId) {\n                  _lodash2.default.assign(payload.param, {\n                    copilotId: copilotId,\n                    copilotFee: copilotFee\n                  });\n                }\n                _context5.next = 4;\n                return this.private.api.postJson('/challenges', payload);\n\n              case 4:\n                res = _context5.sent;\n\n                if (res.ok) {\n                  _context5.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context5.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context5.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context5.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context5.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function createTask(_x8, _x9, _x10, _x11, _x12, _x13, _x14, _x15, _x16, _x17) {\n        return _ref7.apply(this, arguments);\n      }\n\n      return createTask;\n    }()\n\n    /**\n     * Gets challenge details from Topcoder API.\n     * NOTE: This function also uses API v2 and other endpoints for now, due\n     * to some information is missing or\n     * incorrect in the main endpoint. This may change in the future.\n     * @param {Number|String} challengeId\n     * @return {Promise} Resolves to the challenge object.\n     */\n\n  }, {\n    key: 'getChallengeDetails',\n    value: function () {\n      var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(challengeId) {\n        var challenge, challengeFiltered, username, challengeUser, finalChallenge;\n        return _regenerator2.default.wrap(function _callee6$(_context6) {\n          while (1) {\n            switch (_context6.prev = _context6.next) {\n              case 0:\n                _context6.next = 2;\n                return this.private.api.get('/challenges/' + challengeId).then(checkError).then(function (res) {\n                  return res.content;\n                });\n\n              case 2:\n                challenge = _context6.sent;\n                _context6.next = 5;\n                return this.private.getChallenges('/challenges/', { id: challengeId }).then(function (res) {\n                  return res.challenges[0];\n                });\n\n              case 5:\n                challengeFiltered = _context6.sent;\n                username = this.private.tokenV3 && (0, _tcAccounts.decodeToken)(this.private.tokenV3).handle;\n                _context6.t0 = username;\n\n                if (!_context6.t0) {\n                  _context6.next = 12;\n                  break;\n                }\n\n                _context6.next = 11;\n                return this.getUserChallenges(username, { id: challengeId }).then(function (res) {\n                  return res.challenges[0];\n                }).catch(function () {\n                  return null;\n                });\n\n              case 11:\n                _context6.t0 = _context6.sent;\n\n              case 12:\n                challengeUser = _context6.t0;\n                finalChallenge = normalizeChallengeDetails(challenge, challengeFiltered, challengeUser, username);\n\n\n                finalChallenge.fetchedWithAuth = Boolean(this.private.api.private.token);\n\n                return _context6.abrupt('return', finalChallenge);\n\n              case 16:\n              case 'end':\n                return _context6.stop();\n            }\n          }\n        }, _callee6, this);\n      }));\n\n      function getChallengeDetails(_x18) {\n        return _ref8.apply(this, arguments);\n      }\n\n      return getChallengeDetails;\n    }()\n\n    /**\n     * Gets challenge registrants from Topcoder API.\n     * @param {Number|String} challengeId\n     * @return {Promise} Resolves to the challenge registrants array.\n     */\n\n  }, {\n    key: 'getChallengeRegistrants',\n    value: function () {\n      var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(challengeId) {\n        var challenge;\n        return _regenerator2.default.wrap(function _callee7$(_context7) {\n          while (1) {\n            switch (_context7.prev = _context7.next) {\n              case 0:\n                _context7.next = 2;\n                return this.private.api.get('/challenges/' + challengeId).then(checkError).then(function (res) {\n                  return res.content;\n                });\n\n              case 2:\n                challenge = _context7.sent;\n                return _context7.abrupt('return', challenge.registrants);\n\n              case 4:\n              case 'end':\n                return _context7.stop();\n            }\n          }\n        }, _callee7, this);\n      }));\n\n      function getChallengeRegistrants(_x19) {\n        return _ref9.apply(this, arguments);\n      }\n\n      return getChallengeRegistrants;\n    }()\n\n    /**\n     * Gets possible challenge subtracks.\n     * @return {Promise} Resolves to the array of subtrack names.\n     */\n\n  }, {\n    key: 'getChallengeSubtracks',\n    value: function getChallengeSubtracks() {\n      return this.private.api.get('/challenge-types').then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : new Error(res.result.content);\n      });\n    }\n\n    /**\n     * Gets possible challenge tags (technologies).\n     * @return {Promise} Resolves to the array of tag strings.\n     */\n\n  }, {\n    key: 'getChallengeTags',\n    value: function getChallengeTags() {\n      return this.private.api.get('/technologies').then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : new Error(res.result.content);\n      });\n    }\n\n    /**\n     * Gets challenges.\n     * @param {Object} filters Optional.\n     * @param {Object} params Optional.\n     * @return {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getChallenges',\n    value: function getChallenges(filters, params) {\n      return this.private.getChallenges('/challenges/', filters, params).then(function (res) {\n        res.challenges.forEach(function (item) {\n          return normalizeChallenge(item);\n        });\n        return res;\n      });\n    }\n\n    /**\n     * Gets SRM matches.\n     * @param {Object} params\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'getSrms',\n    value: function () {\n      var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(params) {\n        var res;\n        return _regenerator2.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                _context8.next = 2;\n                return this.private.api.get('/srms/?' + _qs2.default.stringify(params));\n\n              case 2:\n                res = _context8.sent;\n                return _context8.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context8.stop();\n            }\n          }\n        }, _callee8, this);\n      }));\n\n      function getSrms(_x20) {\n        return _ref10.apply(this, arguments);\n      }\n\n      return getSrms;\n    }()\n\n    /**\n     * Gets challenges of the specified user.\n     * @param {String} username User whose challenges we want to fetch.\n     * @param {Object} filters Optional.\n     * @param {Number} params Optional.\n     * @return {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getUserChallenges',\n    value: function getUserChallenges(username, filters, params) {\n      var endpoint = '/members/' + username.toLowerCase() + '/challenges/';\n      return this.private.getChallenges(endpoint, filters, params).then(function (res) {\n        res.challenges.forEach(function (item) {\n          return normalizeChallenge(item, username);\n        });\n        return res;\n      });\n    }\n\n    /**\n     * Gets marathon matches of the specified user.\n     * @param {String} username User whose challenges we want to fetch.\n     * @param {Object} filters Optional.\n     * @param {Number} params Optional.\n     * @return {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getUserMarathonMatches',\n    value: function getUserMarathonMatches(username, filters, params) {\n      var endpoint = '/members/' + username.toLowerCase() + '/mms/';\n      return this.private.getChallenges(endpoint, filters, params);\n    }\n\n    /**\n     * Gets SRM matches related to the user.\n     * @param {String} handle\n     * @param {Object} params\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'getUserSrms',\n    value: function () {\n      var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(handle, params) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee9$(_context9) {\n          while (1) {\n            switch (_context9.prev = _context9.next) {\n              case 0:\n                url = '/members/' + handle + '/srms/?' + _qs2.default.stringify(params);\n                _context9.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context9.sent;\n                return _context9.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context9.stop();\n            }\n          }\n        }, _callee9, this);\n      }));\n\n      function getUserSrms(_x21, _x22) {\n        return _ref11.apply(this, arguments);\n      }\n\n      return getUserSrms;\n    }()\n\n    /**\n     * Registers user to the specified challenge.\n     * @param {String} challengeId\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'register',\n    value: function () {\n      var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(challengeId) {\n        var endpoint, res;\n        return _regenerator2.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                endpoint = '/challenges/' + challengeId + '/register';\n                _context10.next = 3;\n                return this.private.api.postJson(endpoint);\n\n              case 3:\n                res = _context10.sent;\n\n                if (res.ok) {\n                  _context10.next = 6;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 6:\n                return _context10.abrupt('return', res.json());\n\n              case 7:\n              case 'end':\n                return _context10.stop();\n            }\n          }\n        }, _callee10, this);\n      }));\n\n      function register(_x23) {\n        return _ref12.apply(this, arguments);\n      }\n\n      return register;\n    }()\n\n    /**\n     * Unregisters user from the specified challenge.\n     * @param {String} challengeId\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'unregister',\n    value: function () {\n      var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(challengeId) {\n        var endpoint, res;\n        return _regenerator2.default.wrap(function _callee11$(_context11) {\n          while (1) {\n            switch (_context11.prev = _context11.next) {\n              case 0:\n                endpoint = '/challenges/' + challengeId + '/unregister';\n                _context11.next = 3;\n                return this.private.api.post(endpoint);\n\n              case 3:\n                res = _context11.sent;\n\n                if (res.ok) {\n                  _context11.next = 6;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 6:\n                return _context11.abrupt('return', res.json());\n\n              case 7:\n              case 'end':\n                return _context11.stop();\n            }\n          }\n        }, _callee11, this);\n      }));\n\n      function unregister(_x24) {\n        return _ref13.apply(this, arguments);\n      }\n\n      return unregister;\n    }()\n\n    /**\n     * Gets count of user's active challenges.\n     * @param {String} handle Topcoder user handle.\n     * @return {Action} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getActiveChallengesCount',\n    value: function getActiveChallengesCount(handle) {\n      var filter = { status: 'ACTIVE' };\n      var params = { limit: 1, offset: 0 };\n      return this.getUserChallenges(handle, filter, params).then(function (res) {\n        return res.totalCount;\n      });\n    }\n\n    /**\n     * Submits a challenge submission.  Uses APIV2 for Development submission\n     * and APIV3 for Design submisisons.\n     * @param {Object} body\n     * @param {String} challengeId\n     * @param {String} track Either DESIGN or DEVELOP\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'submit',\n    value: function submit(body, challengeId, track, onProgress) {\n      var api = void 0;\n      var contentType = void 0;\n      var url = void 0;\n\n      if (track === 'DESIGN') {\n        api = this.private.api;\n\n        contentType = 'application/json';\n        url = '/submissions/'; // The submission info is contained entirely in the JSON body\n      } else {\n        api = this.private.apiV2;\n        // contentType = 'multipart/form-data';\n        contentType = null;\n        url = '/develop/challenges/' + challengeId + '/upload';\n      }\n\n      return api.upload(url, {\n        body: body,\n        headers: { 'Content-Type': contentType },\n        method: 'POST'\n      }, onProgress).then(function (res) {\n        var jres = JSON.parse(res);\n        // Return result for Develop submission\n        if (track === 'DEVELOP') {\n          return jres;\n        }\n        // Design Submission requires an extra \"Processing\" POST\n        var procId = jres.result.content.id;\n        return api.upload('/submissions/' + procId + '/process/', {\n          body: (0, _stringify2.default)({ param: jres.result.content }),\n          headers: { 'Content-Type': contentType },\n          method: 'POST'\n        }, onProgress).then(function (procres) {\n          return JSON.parse(procres);\n        });\n      }, function (err) {\n        _logger2.default.error('Failed to submit to the challenge #' + challengeId, err);\n        throw err;\n      });\n    }\n\n    /**\n     * Updates the challenge (saves the give challenge to the API).\n     * @param {Object} challenge\n     * @param {String} tokenV3\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'updateChallenge',\n    value: function () {\n      var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(challenge) {\n        var URL, body, res;\n        return _regenerator2.default.wrap(function _callee12$(_context12) {\n          while (1) {\n            switch (_context12.prev = _context12.next) {\n              case 0:\n                URL = '/challenges/' + challenge.id;\n                body = { param: challenge };\n                _context12.next = 4;\n                return this.private.api.putJson(URL, body);\n\n              case 4:\n                res = _context12.sent;\n\n                if (res.ok) {\n                  _context12.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context12.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context12.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context12.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context12.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context12.stop();\n            }\n          }\n        }, _callee12, this);\n      }));\n\n      function updateChallenge(_x25) {\n        return _ref14.apply(this, arguments);\n      }\n\n      return updateChallenge;\n    }()\n\n    /**\n     * Gets roles of a user in the specified challenge. The user tested is\n     * the owner of authentication token used to instantiate the service.\n     *\n     * Notice, if you have already loaded the challenge as that user, these roles\n     * are attached to the challenge object under `userDetails.roles` path during\n     * challenge normalization. However, if you have not, this method is the most\n     * efficient way to get them, as it by-passes any unnecessary normalizations\n     * of the challenge object.\n     *\n     * @param {Number} challengeId Challenge ID.\n     */\n\n  }, {\n    key: 'getUserRolesInChallenge',\n    value: function () {\n      var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(challengeId) {\n        var user, username, url, data;\n        return _regenerator2.default.wrap(function _callee13$(_context13) {\n          while (1) {\n            switch (_context13.prev = _context13.next) {\n              case 0:\n                user = (0, _tcAccounts.decodeToken)(this.private.tokenV3);\n                username = user.handle || user.payload.handle;\n                url = '/members/' + username.toLowerCase() + '/challenges';\n                _context13.next = 5;\n                return this.private.getChallenges(url, { id: challengeId });\n\n              case 5:\n                data = _context13.sent;\n                return _context13.abrupt('return', data.challenges[0].userDetails.roles);\n\n              case 7:\n              case 'end':\n                return _context13.stop();\n            }\n          }\n        }, _callee13, this);\n      }));\n\n      function getUserRolesInChallenge(_x26) {\n        return _ref15.apply(this, arguments);\n      }\n\n      return getUserRolesInChallenge;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return ChallengesService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing challenges service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n * @return {ChallengesService} Challenges service object\n */\nfunction getService(tokenV3, tokenV2) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3 || lastInstance.tokenV2 !== tokenV2) {\n    lastInstance = new ChallengesService(tokenV3, tokenV2);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ORDER_BY, 'ORDER_BY', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(normalizeChallengeDetails, 'normalizeChallengeDetails', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(normalizeChallenge, 'normalizeChallenge', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(checkError, 'checkError', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(ChallengesService, 'ChallengesService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/challenges.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/challenges.js?");
 
 /***/ }),
 
@@ -922,7 +922,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _isomorphicFetch = __webpack_require__(/*! isomorphic-fetch */ \"isomorphic-fetch\");\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.communities\"\n    * @desc Communities service.\n    */\n\n\n/**\n * Returns Community App URL, or throws an error if URL cannot be found in\n * config.\n */\nfunction getCommunityAppUrl() {\n  var url = _lodash2.default.get(_topcoderReactUtils.config, 'URL.COMMUNITY_APP');\n  if (!url) throw new Error('No URL.COMMUNITY_APP param found in config');\n  return url;\n}\n\n/**\n * Client-side version of the service.\n */\n\nvar Communities = function () {\n  /**\n   * Creates a new {@link module:services.communities~Communities} instance.\n   * @param {String} tokenV3\n   */\n  function Communities(tokenV3) {\n    (0, _classCallCheck3.default)(this, Communities);\n\n    this.private = { tokenV3: tokenV3 };\n  }\n\n  /**\n   * Gets the list of communities accessible to the member of specified groups.\n   * @param {String[]} userGroupIds\n   * @return {Promise} Resolves to the array of community data objects. Each of\n   *  the objects indludes only the most important data on the community.\n   */\n\n\n  (0, _createClass3.default)(Communities, [{\n    key: 'getList',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(userGroupIds) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                url = getCommunityAppUrl();\n\n                url += '/community-app-assets/api/tc-communities?';\n                url += _qs2.default.stringify({ groups: userGroupIds });\n                _context.next = 5;\n                return (0, _isomorphicFetch2.default)(url, {\n                  headers: {\n                    authorization: this.private.tokenV3\n                  }\n                });\n\n              case 5:\n                res = _context.sent;\n                return _context.abrupt('return', res.json());\n\n              case 7:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getList(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getList;\n    }()\n\n    /**\n     * Gets metadata for the specified community.\n     * @param {String} communityId\n     * @return {Promise} Resolves to the community metadata.\n     */\n\n  }, {\n    key: 'getMetadata',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(communityId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                url = getCommunityAppUrl();\n\n                url += '/community-app-assets/api/tc-communities/' + communityId + '/meta';\n                _context2.next = 4;\n                return (0, _isomorphicFetch2.default)(url, {\n                  headers: {\n                    authorization: this.private.tokenV3\n                  }\n                });\n\n              case 4:\n                res = _context2.sent;\n                return _context2.abrupt('return', res.json());\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getMetadata(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getMetadata;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Communities;\n}();\n\nvar lastInstance = null;\n\n/**\n * Returns a new or existing communities service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {Communities} Communties service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new Communities(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getCommunityAppUrl, 'getCommunityAppUrl', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(Communities, 'Communities', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/communities.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/communities.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _isomorphicFetch = __webpack_require__(/*! isomorphic-fetch */ \"isomorphic-fetch\");\n\nvar _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.communities\"\n    * @desc Communities service.\n    */\n\n\n/**\n * Returns Community App URL, or throws an error if URL cannot be found in\n * config.\n */\nfunction getCommunityAppUrl() {\n  var url = _lodash2.default.get(_topcoderReactUtils.config, 'URL.COMMUNITY_APP');\n  if (!url) throw new Error('No URL.COMMUNITY_APP param found in config');\n  return url;\n}\n\n/**\n * Client-side version of the service.\n */\n\nvar Communities = function () {\n  /**\n   * Creates a new {@link module:services.communities~Communities} instance.\n   * @param {String} tokenV3\n   */\n  function Communities(tokenV3) {\n    (0, _classCallCheck3.default)(this, Communities);\n\n    this.private = { tokenV3: tokenV3 };\n  }\n\n  /**\n   * Gets the list of communities accessible to the member of specified groups.\n   * @param {String[]} userGroupIds\n   * @return {Promise} Resolves to the array of community data objects. Each of\n   *  the objects indludes only the most important data on the community.\n   */\n\n\n  (0, _createClass3.default)(Communities, [{\n    key: 'getList',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(userGroupIds) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                url = getCommunityAppUrl();\n\n                url += '/community-app-assets/api/tc-communities?';\n                url += _qs2.default.stringify({ groups: userGroupIds });\n                _context.next = 5;\n                return (0, _isomorphicFetch2.default)(url, {\n                  headers: {\n                    authorization: this.private.tokenV3\n                  }\n                });\n\n              case 5:\n                res = _context.sent;\n                return _context.abrupt('return', res.json());\n\n              case 7:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getList(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getList;\n    }()\n\n    /**\n     * Gets metadata for the specified community.\n     * @param {String} communityId\n     * @return {Promise} Resolves to the community metadata.\n     */\n\n  }, {\n    key: 'getMetadata',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(communityId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                url = getCommunityAppUrl();\n\n                url += '/community-app-assets/api/tc-communities/' + communityId + '/meta';\n                _context2.next = 4;\n                return (0, _isomorphicFetch2.default)(url, {\n                  headers: {\n                    authorization: this.private.tokenV3\n                  }\n                });\n\n              case 4:\n                res = _context2.sent;\n                return _context2.abrupt('return', res.json());\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getMetadata(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getMetadata;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Communities;\n}();\n\nvar lastInstance = null;\n\n/**\n * Returns a new or existing communities service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {Communities} Communties service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new Communities(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getCommunityAppUrl, 'getCommunityAppUrl', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(Communities, 'Communities', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/communities.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/communities.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/communities.js?");
 
 /***/ }),
 
@@ -934,7 +934,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.direct\"\n    * @desc The Direct service takes care about communication with Direct APIs:\n    *  projects, billing accounts, copilots, all these stuff should be added here,\n    *  at least for now.\n    */\n\n/**\n * Direct service class.\n */\nvar Direct = function () {\n  /**\n   * Creates a new {@link module:services.direct~Direct} instance.\n   * @param {String} tokenV3 Optional. Topcoder auth token v3. Though optional,\n   *  most probably most, if not all, of the service functionality won't work\n   *  for non-authenticated visitors.\n   */\n  function Direct(tokenV3) {\n    (0, _classCallCheck3.default)(this, Direct);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets details of the specified project.\n   * @param {Number} projectId\n   * @return {Promise} Resolves to the project details object.\n   */\n\n\n  (0, _createClass3.default)(Direct, [{\n    key: 'getProjectDetails',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(projectId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/direct/projects/' + projectId);\n\n              case 2:\n                res = _context.sent;\n\n                if (res.ok) {\n                  _context.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                _context.next = 7;\n                return res.json();\n\n              case 7:\n                res = _context.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context.next = 10;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 10:\n                return _context.abrupt('return', res.content);\n\n              case 11:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getProjectDetails(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getProjectDetails;\n    }()\n\n    /**\n     * Gets user permissions on the specified project.\n     * @param {Number|String} projectId\n     * @param {String} tokenV3 Auth token for API v3.\n     * @return {Promise} Resolves to the user permissions data.\n     */\n\n  }, {\n    key: 'getProjectPermissions',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(projectId) {\n        var URL, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                URL = '/direct/projects/' + projectId + '/permissions';\n                _context2.next = 3;\n                return this.private.api.get(URL);\n\n              case 3:\n                res = _context2.sent;\n\n                if (res.ok) {\n                  _context2.next = 6;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 6:\n                _context2.next = 8;\n                return res.json();\n\n              case 8:\n                res = _context2.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context2.next = 11;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 11:\n                return _context2.abrupt('return', res.content);\n\n              case 12:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getProjectPermissions(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getProjectPermissions;\n    }()\n\n    /**\n     * Gets all projects the user can see.\n     * @param {Object} query Optional. Query params for the request.\n     * @return {Promise} Resolves to an array of project objects.\n     */\n\n  }, {\n    key: 'getUserProjects',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(query) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                url = '/direct/projects/user';\n\n                if (query) url += '?' + _qs2.default.stringify(query);\n                _context3.next = 4;\n                return this.private.api.get(url);\n\n              case 4:\n                res = _context3.sent;\n\n                if (res.ok) {\n                  _context3.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context3.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context3.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context3.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context3.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getUserProjects(_x3) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getUserProjects;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Direct;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing {@link module:services.direct~Direct} service.\n * @param {String} tokenV3 Optional. Topcoder auth token v3.\n * @return {Direct} Direct service object.\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new Direct(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(Direct, 'Direct', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/direct.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/direct.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/direct.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/direct.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/direct.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.direct\"\n    * @desc The Direct service takes care about communication with Direct APIs:\n    *  projects, billing accounts, copilots, all these stuff should be added here,\n    *  at least for now.\n    */\n\n/**\n * Direct service class.\n */\nvar Direct = function () {\n  /**\n   * Creates a new {@link module:services.direct~Direct} instance.\n   * @param {String} tokenV3 Optional. Topcoder auth token v3. Though optional,\n   *  most probably most, if not all, of the service functionality won't work\n   *  for non-authenticated visitors.\n   */\n  function Direct(tokenV3) {\n    (0, _classCallCheck3.default)(this, Direct);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets details of the specified project.\n   * @param {Number} projectId\n   * @return {Promise} Resolves to the project details object.\n   */\n\n\n  (0, _createClass3.default)(Direct, [{\n    key: 'getProjectDetails',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(projectId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/direct/projects/' + projectId);\n\n              case 2:\n                res = _context.sent;\n\n                if (res.ok) {\n                  _context.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                _context.next = 7;\n                return res.json();\n\n              case 7:\n                res = _context.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context.next = 10;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 10:\n                return _context.abrupt('return', res.content);\n\n              case 11:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getProjectDetails(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getProjectDetails;\n    }()\n\n    /**\n     * Gets user permissions on the specified project.\n     * @param {Number|String} projectId\n     * @param {String} tokenV3 Auth token for API v3.\n     * @return {Promise} Resolves to the user permissions data.\n     */\n\n  }, {\n    key: 'getProjectPermissions',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(projectId) {\n        var URL, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                URL = '/direct/projects/' + projectId + '/permissions';\n                _context2.next = 3;\n                return this.private.api.get(URL);\n\n              case 3:\n                res = _context2.sent;\n\n                if (res.ok) {\n                  _context2.next = 6;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 6:\n                _context2.next = 8;\n                return res.json();\n\n              case 8:\n                res = _context2.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context2.next = 11;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 11:\n                return _context2.abrupt('return', res.content);\n\n              case 12:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getProjectPermissions(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getProjectPermissions;\n    }()\n\n    /**\n     * Gets all projects the user can see.\n     * @param {Object} query Optional. Query params for the request.\n     * @return {Promise} Resolves to an array of project objects.\n     */\n\n  }, {\n    key: 'getUserProjects',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(query) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                url = '/direct/projects/user';\n\n                if (query) url += '?' + _qs2.default.stringify(query);\n                _context3.next = 4;\n                return this.private.api.get(url);\n\n              case 4:\n                res = _context3.sent;\n\n                if (res.ok) {\n                  _context3.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context3.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context3.sent.result;\n\n                if (!(res.status !== 200)) {\n                  _context3.next = 12;\n                  break;\n                }\n\n                throw new Error(res.content);\n\n              case 12:\n                return _context3.abrupt('return', res.content);\n\n              case 13:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getUserProjects(_x3) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getUserProjects;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return Direct;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing {@link module:services.direct~Direct} service.\n * @param {String} tokenV3 Optional. Topcoder auth token v3.\n * @return {Direct} Direct service object.\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new Direct(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(Direct, 'Direct', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/direct.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/direct.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/direct.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/direct.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/direct.js?");
 
 /***/ }),
 
@@ -946,7 +946,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\nexports.addDescendantGroups = addDescendantGroups;\nexports.checkGroupsStatus = checkGroupsStatus;\nexports.checkUserGroups = checkUserGroups;\nexports.reduceGroupIds = reduceGroupIds;\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.groups\"\n    * @desc Service for communication with group-related part of Topcoder API.\n    *\n    * NOTE: Through this file, and in related contexts, by loading a user group,\n    * or user groups data, we refer to loading the information about descendant\n    * user groups; i.e. given some user group(s) we speak about loading the sub-\n    * three of related child groups.\n    *\n    * By group maps we refer to the object having group IDs as the keys, and\n    * group data objects as the values. Any group object included into a group map\n    * has its \"subGroups\" array (if present) replaced by \"subGroupIds\", that lists\n    * only the IDs of immediate child groups; actual child group objects from\n    * \"subGroups\" are recursively added to the top level of the group map.\n    * Also each group in the group map is timestamped to keep caching of\n    * the loaded data.\n    */\n\n/* The value of USER_GROUP_MAXAGE constant converted to [ms]. */\nvar USER_GROUP_MAXAGE = _topcoderReactUtils.config.USER_GROUP_MAXAGE * 1000;\n\n/**\n * Given an array of IDs (or a single ID) of user groups, and a map of known\n * user groups, it returns the array including all specified user groups, and\n * all their known descendant groups.\n * @param {String|String[]} groupIds\n * @param {Object} knownGroups\n * @return {String[]}\n */\nfunction addDescendantGroups(groupIds, knownGroups) {\n  var res = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n  var visitedGroupsIds = new _set2.default();\n  var pos = 0;\n  while (pos < res.length) {\n    var id = res[pos];\n    if (!visitedGroupsIds.has(id)) {\n      visitedGroupsIds.add(id);\n      var g = knownGroups[id];\n      if (g && g.subGroupIds) res = res.concat(g.subGroupIds);\n    }\n    pos += 1;\n  }\n  return _lodash2.default.uniq(res);\n}\n\n/**\n * Splits the given list of group IDs into the lists of groups being loaded,\n * loaded, and others.\n * @param {String|String[]} groupIds ID, or an array of IDs, of the group(s) we\n *  are interested in.\n * @param {Object} knownGroups Optional. The map of already known groups (some\n *  of them may be outdated, though). This should be of the same format as the\n *  object on \"groups.groups\" path of the Redux store. Defaults to empty object.\n * @param {Object} loadingGroups Optional. Set of groups beign loaded now. This\n *  should be of the same format as the object on \"groups.loading\" path of the\n *  Redux store. Defaults to empty object.\n * @return {Object} Resulting object may hold four arrays with group IDs from\n *  \"groupIds\" (empty arrays will not be included into the result object):\n *  - \"loaded\" - the groups that are present in \"knownGroups\" and are not\n *    outdated;\n *  - \"loading\" - the groups that are not present in \"knownGroups\" (or present,\n *    but outdated); but they are already being loaded;\n *  - \"missing\" - the groups that are not present in \"knownGroups\"\n *    (or outdated), and are not being loaded.\n *  - \"unknown\" - the groups that are absent in \"knownGroups\" map.\n */\nfunction checkGroupsStatus(groupIds) {\n  var knownGroups = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var loadingGroups = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  var loaded = [];\n  var loading = [];\n  var missing = [];\n  var unknown = [];\n  var now = Date.now();\n  var tested = new _set2.default();\n  var ids = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n  ids.forEach(function (id) {\n    if (tested.has(id)) return;\n    tested.add(id);\n    var g = knownGroups[id];\n    if (!g) unknown.push(id);\n    if (g && (now - g.timestamp || 0) < USER_GROUP_MAXAGE) loaded.push(id);else if (loadingGroups[id]) loading.push(id);else missing.push(id);\n  });\n  return {\n    loaded: loaded.length ? loaded : null,\n    loading: loading.length ? loading : null,\n    missing: missing.length ? missing : null,\n    unknown: unknown.length ? unknown : null\n  };\n}\n\n/**\n * Returns \"true\" if \"userGroups\" arrays includes any group specified by\n * \"groupIds\", or any group descendant from a group specified by \"groupIds\".\n * The is the map of known groups\n * @param {String|String[]} groupIds\n * @param {Object[]|String[]} userGroups Array of user's groups or their IDs.\n * @param {Object} knownGroups Map of known groups.\n * @return {Boolean}\n */\nfunction checkUserGroups(groupIds, userGroups, knownGroups) {\n  var queue = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n  if (!queue.length) return true;\n  if (!userGroups.length) return false;\n\n  /* Algorithmically, \"knownGroups\" stores, in compressed form, data on\n   * known trees of user groups; and we want to check whether any of groups\n   * from \"userGroups\" belong to sub-trees having groups from \"groupIds\" as\n   * their roots. So, we do a breadth-frist search through the group trees. */\n  var userGroupIds = new _set2.default();\n  var visitedGroupIds = new _set2.default();\n  userGroups.forEach(function (g) {\n    return userGroupIds.add(_lodash2.default.isObject(g) ? g.id : g);\n  });\n  var pos = 0;\n  while (pos < queue.length) {\n    var id = queue[pos];\n    if (userGroupIds.has(id)) return true;\n    visitedGroupIds.add(id);\n    var g = knownGroups[id];\n    if (g && g.subGroupIds) {\n      g.subGroupIds.forEach(function (sgId) {\n        return !visitedGroupIds.has(sgId) ? queue.push(sgId) : null;\n      });\n    }\n    pos += 1;\n  }\n  return false;\n}\n\n/**\n * Private. Handles given response from the groups API.\n * @param {Object} response\n * @return {Promise} On success resolves to the data fetched from the API.\n */\nfunction handleApiResponse(response) {\n  if (!response.ok) throw new Error(response.statusText);\n  return response.json();\n  // return response.json().then(({ result }) => {\n  //   return result;\n  // if (result.status !== 200) throw new Error(result.content);\n  // });\n}\n\n/**\n * Private. Merges given user group (possibly a tree of user groups) into\n * groups map. This function intended only for internal use inside this module,\n * as it may mutate both arguments (hence, the corresponding ESLint rule is\n * disabled within this function), thus should be used only where it is safe.\n * For external use a similar function is provided by \"utils/tc\" module.\n * @param {Object} groups\n * @param {Object} group\n */\nfunction mergeGroup(groups, group) {\n  /* eslint-disable no-param-reassign */\n  var sg = group.subGroups;\n  group.timestamp = Date.now();\n  if (sg && sg.length) {\n    group.subGroupIds = sg.map(function (g) {\n      return g.id;\n    });\n    sg.forEach(function (g) {\n      return mergeGroup(groups, g);\n    });\n  }\n  delete group.subGroups;\n  groups[group.id] = group;\n  /* eslint-enable no-param-reassign */\n}\n\n/**\n * Given a group tree, reduces it to the array of all group IDs encountered in\n * the tree.\n * @param {Object} group\n * @return {String[]} Array of IDs.\n */\nfunction reduceGroupIds(_ref) {\n  var id = _ref.id,\n      subGroups = _ref.subGroups;\n\n  var res = [id];\n  if (subGroups) {\n    subGroups.forEach(function (g) {\n      res = res.concat(reduceGroupIds(g));\n    });\n  }\n  return res;\n}\n\n/**\n * Service class.\n */\n\nvar GroupService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function GroupService(tokenV3) {\n    (0, _classCallCheck3.default)(this, GroupService);\n\n    var now = Date.now();\n    this.private = {\n      api: (0, _api.getApi)('V5', tokenV3),\n      cache: {\n        groupTreeIds: {\n          lastCleanUp: now,\n          data: {}\n        }\n      },\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Adds new member to the group.\n   * @param {String} groupId\n   * @param {String} memberId\n   * @param {String} membershipType\n   * @return {Promise}\n   */\n\n\n  (0, _createClass3.default)(GroupService, [{\n    key: 'addMember',\n    value: function addMember(groupId, memberId, membershipType) {\n      return this.private.api.postJson('/groups/' + groupId + '/members', {\n        param: { memberId: memberId, membershipType: membershipType }\n      }).then(handleApiResponse);\n    }\n\n    /**\n     * Gets detailed information about the group.\n     *\n     * Notice, when \"withSubGroups\" argument is true (default) this method returns\n     * a tree of group data objects, connected via their \"subGroups\" fields.\n     * getMap(..) method below wraps this functionality in a more practical way!\n     *\n     * @param {String} groupId\n     * @param {Boolean} withSubGroups Optional. Defaults to true. Specifies,\n     *  whether the response should information about sub-groups, if any.\n     * @return {Promise} On success resolves to the group data object.\n     */\n\n  }, {\n    key: 'getGroup',\n    value: function getGroup(groupId) {\n      var withSubGroups = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n      var url = '/groups/' + groupId;\n      if (withSubGroups) {\n        url = url + '/getSubGroups?includeSubGroups=true&oneLevel=false';\n      }\n      return this.private.api.get(url).then(handleApiResponse);\n    }\n\n    /**\n     * Gets detailed information about the specified user group(s) and their\n     * descendant sub-groups.\n     *\n     * @param {String|String[]} groupIds Group ID, or an array of group IDs,\n     *  to query from Topcoder API.\n     * @return {Promise} Resolves to the group map. That object will have group\n     *  IDs as the keys, and corresponding group data objects as the values. In\n     *  each group data object the \"subGroups\" field, if any, will be replaced by\n     * \"subGroupIds\" (array of IDs of the immediate child groups), and the actual\n     *  data on the sub-groups will be moved to the root of the map object.\n     *  It also timestamps each fetched group.\n     */\n\n  }, {\n    key: 'getGroupMap',\n    value: function getGroupMap(groupIds) {\n      var _this = this;\n\n      var res = {};\n      var seen = new _set2.default();\n      var query = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n      var promises = query.map(function (id) {\n        if (seen.has(id)) return null;\n        seen.add(id);\n        return _this.getGroup(id).then(function (group) {\n          return mergeGroup(res, group);\n        }).catch(function (err) {\n          /* In case we have failed to get some of the requested groups,\n          * we just send error message to logs, and serve the result with\n          * those groups that we managed to get. Otherwise it will be to\n          * easy to break our code by minor mistakes in the group-related\n          * configuration in the API and in the App. */\n          _logger2.default.error('Failed to get user group #' + id, err);\n\n          /* Empty group with timestamp is added to the result, as we still\n          * want to cache the result, even if the result is that we cannot\n          * load this group, at least for this visitor. */\n          res[id] = { id: id, timestamp: Date.now() };\n        });\n      });\n      return _promise2.default.all(promises).then(function () {\n        return res;\n      });\n    }\n\n    /**\n     * Given a root group ID, returns an ID array that contains the root group ID,\n     * and IDs of all descendant groups in the group (sub-)tree rooted at the\n     * specified group.\n     *\n     * Results are cached inside the class instance to minimize the load on TC\n     * Group API. To take advantage of that, be sure to keep and reuse the same\n     * class instance.\n     *\n     * The reason to have such strange method and pay an extra attention to its\n     * optimization for smaller API load is that it is essential for authorization\n     * checks.\n     *\n     * @param {String} rootGroupId\n     * @param {Number} maxage Optional. Max age [ms] of records served from the\n     *  cache. Defaults to 5 minutes.\n     * @return {Promise} Resolves to ID array.\n     */\n\n  }, {\n    key: 'getGroupTreeIds',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(rootGroupId) {\n        var maxage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5 * 60 * 1000;\n        var now, cache, CLEAN_UP_INTERVAL, cached, res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                now = Date.now();\n                cache = this.private.cache.groupTreeIds;\n\n                /* Clean-up: removes stale records from the cache. */\n\n                CLEAN_UP_INTERVAL = 24 * 60 * 60 * 1000; // 1 day in ms.\n\n                if (now - cache.lastCleanUp > CLEAN_UP_INTERVAL) {\n                  _lodash2.default.forOwn(cache, function (_ref3, key) {\n                    var timestamp = _ref3.timestamp;\n\n                    if (now - timestamp > CLEAN_UP_INTERVAL) delete cache[key];\n                  });\n                  cache.lastCleanUp = now;\n                }\n\n                /* If result is found in cache, and is fresh enough, return it. */\n                cached = cache[rootGroupId];\n\n                if (!(cached && now - cached.timestamp < maxage)) {\n                  _context.next = 7;\n                  break;\n                }\n\n                return _context.abrupt('return', _lodash2.default.clone(cached.data));\n\n              case 7:\n                _context.t0 = reduceGroupIds;\n                _context.next = 10;\n                return this.getGroup(rootGroupId);\n\n              case 10:\n                _context.t1 = _context.sent;\n                res = (0, _context.t0)(_context.t1);\n\n                cache[rootGroupId] = { data: res, timestamp: now };\n                return _context.abrupt('return', _lodash2.default.clone(res));\n\n              case 14:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getGroupTreeIds(_x4) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getGroupTreeIds;\n    }()\n\n    /**\n     * Gets group members.\n     * @param {String} groupId\n     * @return {Promise} On sucess resolves to the array of member objects,\n     *  which include user IDs, membership time, and some bookkeeping data.\n     */\n\n  }, {\n    key: 'getMembers',\n    value: function getMembers(groupId) {\n      return this.private.api.get('/groups/' + groupId + '/members').then(handleApiResponse);\n    }\n\n    /**\n     * Gets the number of members in the group.\n     * @param {Number|String} groupId ID of the group.\n     * @param {Boolean} withSubGroups Optional. When this flag is set, the count\n     *  will include members of sub-groups of the specified group.\n     * @return {Promise} Resolves to the members count.\n     */\n\n  }, {\n    key: 'getMembersCount',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(groupId, withSubGroups) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                url = '/groups/' + groupId + '/membersCount';\n\n                if (withSubGroups) url += '?includeSubGroups=true';\n                _context2.next = 4;\n                return this.private.api.get(url);\n\n              case 4:\n                res = _context2.sent;\n\n                if (res.ok) {\n                  _context2.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context2.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context2.sent;\n                return _context2.abrupt('return', Number(res.count));\n\n              case 11:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getMembersCount(_x6, _x7) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return getMembersCount;\n    }()\n\n    /**\n     * Returns TC Auth Token V3 used by the service instance.\n     * @return {String} Token.\n     */\n\n  }, {\n    key: 'getTokenV3',\n    value: function getTokenV3() {\n      return this.private.tokenV3;\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return GroupService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing instance of challenge service, which works with\n * the specified auth token.\n * @param {String} tokenV3 Optional. Topcoder API v3 auth token.\n * @return {GroupService} Instance of the service.\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new GroupService(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(USER_GROUP_MAXAGE, 'USER_GROUP_MAXAGE', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(addDescendantGroups, 'addDescendantGroups', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(checkGroupsStatus, 'checkGroupsStatus', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(checkUserGroups, 'checkUserGroups', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(handleApiResponse, 'handleApiResponse', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(mergeGroup, 'mergeGroup', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(reduceGroupIds, 'reduceGroupIds', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(GroupService, 'GroupService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/groups.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/groups.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\nexports.addDescendantGroups = addDescendantGroups;\nexports.checkGroupsStatus = checkGroupsStatus;\nexports.checkUserGroups = checkUserGroups;\nexports.reduceGroupIds = reduceGroupIds;\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.groups\"\n    * @desc Service for communication with group-related part of Topcoder API.\n    *\n    * NOTE: Through this file, and in related contexts, by loading a user group,\n    * or user groups data, we refer to loading the information about descendant\n    * user groups; i.e. given some user group(s) we speak about loading the sub-\n    * three of related child groups.\n    *\n    * By group maps we refer to the object having group IDs as the keys, and\n    * group data objects as the values. Any group object included into a group map\n    * has its \"subGroups\" array (if present) replaced by \"subGroupIds\", that lists\n    * only the IDs of immediate child groups; actual child group objects from\n    * \"subGroups\" are recursively added to the top level of the group map.\n    * Also each group in the group map is timestamped to keep caching of\n    * the loaded data.\n    */\n\n/* The value of USER_GROUP_MAXAGE constant converted to [ms]. */\nvar USER_GROUP_MAXAGE = _topcoderReactUtils.config.USER_GROUP_MAXAGE * 1000;\n\n/**\n * Given an array of IDs (or a single ID) of user groups, and a map of known\n * user groups, it returns the array including all specified user groups, and\n * all their known descendant groups.\n * @param {String|String[]} groupIds\n * @param {Object} knownGroups\n * @return {String[]}\n */\nfunction addDescendantGroups(groupIds, knownGroups) {\n  var res = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n  var visitedGroupsIds = new _set2.default();\n  var pos = 0;\n  while (pos < res.length) {\n    var id = res[pos];\n    if (!visitedGroupsIds.has(id)) {\n      visitedGroupsIds.add(id);\n      var g = knownGroups[id];\n      if (g && g.subGroupIds) res = res.concat(g.subGroupIds);\n    }\n    pos += 1;\n  }\n  return _lodash2.default.uniq(res);\n}\n\n/**\n * Splits the given list of group IDs into the lists of groups being loaded,\n * loaded, and others.\n * @param {String|String[]} groupIds ID, or an array of IDs, of the group(s) we\n *  are interested in.\n * @param {Object} knownGroups Optional. The map of already known groups (some\n *  of them may be outdated, though). This should be of the same format as the\n *  object on \"groups.groups\" path of the Redux store. Defaults to empty object.\n * @param {Object} loadingGroups Optional. Set of groups beign loaded now. This\n *  should be of the same format as the object on \"groups.loading\" path of the\n *  Redux store. Defaults to empty object.\n * @return {Object} Resulting object may hold four arrays with group IDs from\n *  \"groupIds\" (empty arrays will not be included into the result object):\n *  - \"loaded\" - the groups that are present in \"knownGroups\" and are not\n *    outdated;\n *  - \"loading\" - the groups that are not present in \"knownGroups\" (or present,\n *    but outdated); but they are already being loaded;\n *  - \"missing\" - the groups that are not present in \"knownGroups\"\n *    (or outdated), and are not being loaded.\n *  - \"unknown\" - the groups that are absent in \"knownGroups\" map.\n */\nfunction checkGroupsStatus(groupIds) {\n  var knownGroups = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var loadingGroups = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  var loaded = [];\n  var loading = [];\n  var missing = [];\n  var unknown = [];\n  var now = Date.now();\n  var tested = new _set2.default();\n  var ids = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n  ids.forEach(function (id) {\n    if (tested.has(id)) return;\n    tested.add(id);\n    var g = knownGroups[id];\n    if (!g) unknown.push(id);\n    if (g && (now - g.timestamp || 0) < USER_GROUP_MAXAGE) loaded.push(id);else if (loadingGroups[id]) loading.push(id);else missing.push(id);\n  });\n  return {\n    loaded: loaded.length ? loaded : null,\n    loading: loading.length ? loading : null,\n    missing: missing.length ? missing : null,\n    unknown: unknown.length ? unknown : null\n  };\n}\n\n/**\n * Returns \"true\" if \"userGroups\" arrays includes any group specified by\n * \"groupIds\", or any group descendant from a group specified by \"groupIds\".\n * The is the map of known groups\n * @param {String|String[]} groupIds\n * @param {Object[]|String[]} userGroups Array of user's groups or their IDs.\n * @param {Object} knownGroups Map of known groups.\n * @return {Boolean}\n */\nfunction checkUserGroups(groupIds, userGroups, knownGroups) {\n  var queue = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n  if (!queue.length) return true;\n  if (!userGroups.length) return false;\n\n  /* Algorithmically, \"knownGroups\" stores, in compressed form, data on\n   * known trees of user groups; and we want to check whether any of groups\n   * from \"userGroups\" belong to sub-trees having groups from \"groupIds\" as\n   * their roots. So, we do a breadth-frist search through the group trees. */\n  var userGroupIds = new _set2.default();\n  var visitedGroupIds = new _set2.default();\n  userGroups.forEach(function (g) {\n    return userGroupIds.add(_lodash2.default.isObject(g) ? g.id : g);\n  });\n  var pos = 0;\n  while (pos < queue.length) {\n    var id = queue[pos];\n    if (userGroupIds.has(id)) return true;\n    visitedGroupIds.add(id);\n    var g = knownGroups[id];\n    if (g && g.subGroupIds) {\n      g.subGroupIds.forEach(function (sgId) {\n        return !visitedGroupIds.has(sgId) ? queue.push(sgId) : null;\n      });\n    }\n    pos += 1;\n  }\n  return false;\n}\n\n/**\n * Private. Handles given response from the groups API.\n * @param {Object} response\n * @return {Promise} On success resolves to the data fetched from the API.\n */\nfunction handleApiResponse(response) {\n  if (!response.ok) throw new Error(response.statusText);\n  return response.json();\n}\n\n/**\n * Private. Merges given user group (possibly a tree of user groups) into\n * groups map. This function intended only for internal use inside this module,\n * as it may mutate both arguments (hence, the corresponding ESLint rule is\n * disabled within this function), thus should be used only where it is safe.\n * For external use a similar function is provided by \"utils/tc\" module.\n * @param {Object} groups\n * @param {Object} group\n */\nfunction mergeGroup(groups, group) {\n  /* eslint-disable no-param-reassign */\n  var sg = group.subGroups;\n  group.timestamp = Date.now();\n  if (sg && sg.length) {\n    group.subGroupIds = sg.map(function (g) {\n      return g.id;\n    });\n    sg.forEach(function (g) {\n      return mergeGroup(groups, g);\n    });\n  }\n  delete group.subGroups;\n  groups[group.id] = group;\n  /* eslint-enable no-param-reassign */\n}\n\n/**\n * Given a group tree, reduces it to the array of all group IDs encountered in\n * the tree.\n * @param {Object} group\n * @return {String[]} Array of IDs.\n */\nfunction reduceGroupIds(_ref) {\n  var oldId = _ref.oldId,\n      subGroups = _ref.subGroups;\n\n  var res = [oldId];\n  if (subGroups) {\n    subGroups.forEach(function (g) {\n      res = res.concat(reduceGroupIds(g));\n    });\n  }\n  return res;\n}\n\n/**\n * Service class.\n */\n\nvar GroupService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function GroupService(tokenV3) {\n    (0, _classCallCheck3.default)(this, GroupService);\n\n    var now = Date.now();\n    this.private = {\n      api: (0, _api.getApi)('V5', tokenV3),\n      cache: {\n        groupTreeIds: {\n          lastCleanUp: now,\n          data: {}\n        }\n      },\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Adds new member to the group.\n   * @param {String} groupId\n   * @param {String} memberId\n   * @param {String} membershipType\n   * @return {Promise}\n   */\n\n\n  (0, _createClass3.default)(GroupService, [{\n    key: 'addMember',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(groupId, memberId, membershipType) {\n        var response;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.postJson('/groups/' + groupId + '/members', {\n                  param: { memberId: memberId, membershipType: membershipType }\n                });\n\n              case 2:\n                response = _context.sent;\n                return _context.abrupt('return', handleApiResponse(response));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function addMember(_x3, _x4, _x5) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return addMember;\n    }()\n\n    /**\n     * Gets detailed information about the group.\n     *\n     * Notice, when \"withSubGroups\" argument is true (default) this method returns\n     * a tree of group data objects, connected via their \"subGroups\" fields.\n     * getMap(..) method below wraps this functionality in a more practical way!\n     *\n     * @param {String} groupId\n     * @param {Boolean} withSubGroups Optional. Defaults to true. Specifies,\n     *  whether the response should information about sub-groups, if any.\n     * @return {Promise} On success resolves to the group data object.\n     */\n\n  }, {\n    key: 'getGroup',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(groupId) {\n        var withSubGroups = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n        var url, response;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                url = '/groups/' + groupId;\n\n                if (withSubGroups) {\n                  url = url + '/?includeSubGroups=true&oneLevel=false';\n                }\n\n                _context2.next = 4;\n                return this.private.api.get(url);\n\n              case 4:\n                response = _context2.sent;\n                return _context2.abrupt('return', handleApiResponse(response));\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getGroup(_x6) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getGroup;\n    }()\n\n    /**\n     * Gets detailed information about the specified user group(s) and their\n     * descendant sub-groups.\n     *\n     * @param {String|String[]} groupIds Group ID, or an array of group IDs,\n     *  to query from Topcoder API.\n     * @return {Promise} Resolves to the group map. That object will have group\n     *  IDs as the keys, and corresponding group data objects as the values. In\n     *  each group data object the \"subGroups\" field, if any, will be replaced by\n     * \"subGroupIds\" (array of IDs of the immediate child groups), and the actual\n     *  data on the sub-groups will be moved to the root of the map object.\n     *  It also timestamps each fetched group.\n     */\n\n  }, {\n    key: 'getGroupMap',\n    value: function getGroupMap(groupIds) {\n      var _this = this;\n\n      var res = {};\n      var seen = new _set2.default();\n      var query = _lodash2.default.isArray(groupIds) ? groupIds : [groupIds];\n      var promises = query.map(function (id) {\n        if (seen.has(id)) return null;\n        seen.add(id);\n        return _this.getGroup(id).then(function (group) {\n          return mergeGroup(res, group);\n        }).catch(function (err) {\n          /* In case we have failed to get some of the requested groups,\n          * we just send error message to logs, and serve the result with\n          * those groups that we managed to get. Otherwise it will be to\n          * easy to break our code by minor mistakes in the group-related\n          * configuration in the API and in the App. */\n          _logger2.default.error('Failed to get user group #' + id, err);\n\n          /* Empty group with timestamp is added to the result, as we still\n          * want to cache the result, even if the result is that we cannot\n          * load this group, at least for this visitor. */\n          res[id] = { id: id, timestamp: Date.now() };\n        });\n      });\n      return _promise2.default.all(promises).then(function () {\n        return res;\n      });\n    }\n\n    /**\n     * Given a root group ID, returns an ID array that contains the root group ID,\n     * and IDs of all descendant groups in the group (sub-)tree rooted at the\n     * specified group.\n     *\n     * Results are cached inside the class instance to minimize the load on TC\n     * Group API. To take advantage of that, be sure to keep and reuse the same\n     * class instance.\n     *\n     * The reason to have such strange method and pay an extra attention to its\n     * optimization for smaller API load is that it is essential for authorization\n     * checks.\n     *\n     * @param {String} rootGroupId\n     * @param {Number} maxage Optional. Max age [ms] of records served from the\n     *  cache. Defaults to 5 minutes.\n     * @return {Promise} Resolves to ID array.\n     */\n\n  }, {\n    key: 'getGroupTreeIds',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(rootGroupId) {\n        var maxage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5 * 60 * 1000;\n        var now, cache, CLEAN_UP_INTERVAL, cached, res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                now = Date.now();\n                cache = this.private.cache.groupTreeIds;\n\n                /* Clean-up: removes stale records from the cache. */\n\n                CLEAN_UP_INTERVAL = 24 * 60 * 60 * 1000; // 1 day in ms.\n\n                if (now - cache.lastCleanUp > CLEAN_UP_INTERVAL) {\n                  _lodash2.default.forOwn(cache, function (_ref5, key) {\n                    var timestamp = _ref5.timestamp;\n\n                    if (now - timestamp > CLEAN_UP_INTERVAL) delete cache[key];\n                  });\n                  cache.lastCleanUp = now;\n                }\n\n                /* If result is found in cache, and is fresh enough, return it. */\n                cached = cache[rootGroupId];\n\n                if (!(cached && now - cached.timestamp < maxage)) {\n                  _context3.next = 7;\n                  break;\n                }\n\n                return _context3.abrupt('return', _lodash2.default.clone(cached.data));\n\n              case 7:\n                _context3.t0 = reduceGroupIds;\n                _context3.next = 10;\n                return this.getGroup(rootGroupId);\n\n              case 10:\n                _context3.t1 = _context3.sent;\n                res = (0, _context3.t0)(_context3.t1);\n\n                cache[rootGroupId] = { data: res, timestamp: now };\n                return _context3.abrupt('return', _lodash2.default.clone(res));\n\n              case 14:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getGroupTreeIds(_x8) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return getGroupTreeIds;\n    }()\n\n    /**\n     * Gets group members.\n     * @param {String} groupId\n     * @return {Promise} On sucess resolves to the array of member objects,\n     *  which include user IDs, membership time, and some bookkeeping data.\n     */\n\n  }, {\n    key: 'getMembers',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(groupId) {\n        var response;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                _context4.next = 2;\n                return this.private.api.get('/groups/' + groupId + '/members');\n\n              case 2:\n                response = _context4.sent;\n                return _context4.abrupt('return', handleApiResponse(response));\n\n              case 4:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function getMembers(_x10) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return getMembers;\n    }()\n\n    /**\n     * Gets the number of members in the group.\n     * @param {Number|String} groupId ID of the group.\n     * @param {Boolean} withSubGroups Optional. When this flag is set, the count\n     *  will include members of sub-groups of the specified group.\n     * @return {Promise} Resolves to the members count.\n     */\n\n  }, {\n    key: 'getMembersCount',\n    value: function () {\n      var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(groupId, withSubGroups) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                url = '/groups/' + groupId + '/membersCount';\n\n                if (withSubGroups) url += '?includeSubGroups=true';\n                _context5.next = 4;\n                return this.private.api.get(url);\n\n              case 4:\n                res = _context5.sent;\n\n                if (res.ok) {\n                  _context5.next = 7;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 7:\n                _context5.next = 9;\n                return res.json();\n\n              case 9:\n                res = _context5.sent;\n                return _context5.abrupt('return', Number(res.count));\n\n              case 11:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function getMembersCount(_x11, _x12) {\n        return _ref7.apply(this, arguments);\n      }\n\n      return getMembersCount;\n    }()\n\n    /**\n     * Returns TC Auth Token V3 used by the service instance.\n     * @return {String} Token.\n     */\n\n  }, {\n    key: 'getTokenV3',\n    value: function getTokenV3() {\n      return this.private.tokenV3;\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return GroupService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing instance of challenge service, which works with\n * the specified auth token.\n * @param {String} tokenV3 Optional. Topcoder API v3 auth token.\n * @return {GroupService} Instance of the service.\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new GroupService(tokenV3);\n  }\n  return lastInstance;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(USER_GROUP_MAXAGE, 'USER_GROUP_MAXAGE', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(addDescendantGroups, 'addDescendantGroups', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(checkGroupsStatus, 'checkGroupsStatus', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(checkUserGroups, 'checkUserGroups', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(handleApiResponse, 'handleApiResponse', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(mergeGroup, 'mergeGroup', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(reduceGroupIds, 'reduceGroupIds', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(GroupService, 'GroupService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/groups.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/groups.js?");
 
 /***/ }),
 
@@ -958,7 +958,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.services = undefined;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar api = _interopRequireWildcard(_api);\n\nvar _billing = __webpack_require__(/*! ./billing */ \"./src/services/billing.js\");\n\nvar billing = _interopRequireWildcard(_billing);\n\nvar _challenges = __webpack_require__(/*! ./challenges */ \"./src/services/challenges.js\");\n\nvar challenge = _interopRequireWildcard(_challenges);\n\nvar _direct = __webpack_require__(/*! ./direct */ \"./src/services/direct.js\");\n\nvar direct = _interopRequireWildcard(_direct);\n\nvar _groups = __webpack_require__(/*! ./groups */ \"./src/services/groups.js\");\n\nvar groups = _interopRequireWildcard(_groups);\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/services/members.js\");\n\nvar members = _interopRequireWildcard(_members);\n\nvar _terms = __webpack_require__(/*! ./terms */ \"./src/services/terms.js\");\n\nvar terms = _interopRequireWildcard(_terms);\n\nvar _communities = __webpack_require__(/*! ./communities */ \"./src/services/communities.js\");\n\nvar communities = _interopRequireWildcard(_communities);\n\nvar _reviewOpportunities = __webpack_require__(/*! ./reviewOpportunities */ \"./src/services/reviewOpportunities.js\");\n\nvar reviewOpportunities = _interopRequireWildcard(_reviewOpportunities);\n\nvar _userSettings = __webpack_require__(/*! ./user-settings */ \"./src/services/user-settings.js\");\n\nvar userSetting = _interopRequireWildcard(_userSettings);\n\nvar _user = __webpack_require__(/*! ./user */ \"./src/services/user.js\");\n\nvar user = _interopRequireWildcard(_user);\n\nvar _lookup = __webpack_require__(/*! ./lookup */ \"./src/services/lookup.js\");\n\nvar lookup = _interopRequireWildcard(_lookup);\n\nvar _userTraits = __webpack_require__(/*! ./user-traits */ \"./src/services/user-traits.js\");\n\nvar userTraits = _interopRequireWildcard(_userTraits);\n\nvar _submissions = __webpack_require__(/*! ./submissions */ \"./src/services/submissions.js\");\n\nvar submissions = _interopRequireWildcard(_submissions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Export services.\n    */\n\n\nvar services = exports.services = {\n  api: api,\n  billing: billing,\n  terms: terms,\n  communities: communities,\n  challenge: challenge,\n  direct: direct,\n  groups: groups,\n  members: members,\n  user: user,\n  userSetting: userSetting,\n  reviewOpportunities: reviewOpportunities,\n  lookup: lookup,\n  userTraits: userTraits,\n  submissions: submissions\n};\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(services, 'services', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/index.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/index.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.services = undefined;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar api = _interopRequireWildcard(_api);\n\nvar _billing = __webpack_require__(/*! ./billing */ \"./src/services/billing.js\");\n\nvar billing = _interopRequireWildcard(_billing);\n\nvar _challenges = __webpack_require__(/*! ./challenges */ \"./src/services/challenges.js\");\n\nvar challenge = _interopRequireWildcard(_challenges);\n\nvar _direct = __webpack_require__(/*! ./direct */ \"./src/services/direct.js\");\n\nvar direct = _interopRequireWildcard(_direct);\n\nvar _groups = __webpack_require__(/*! ./groups */ \"./src/services/groups.js\");\n\nvar groups = _interopRequireWildcard(_groups);\n\nvar _members = __webpack_require__(/*! ./members */ \"./src/services/members.js\");\n\nvar members = _interopRequireWildcard(_members);\n\nvar _terms = __webpack_require__(/*! ./terms */ \"./src/services/terms.js\");\n\nvar terms = _interopRequireWildcard(_terms);\n\nvar _communities = __webpack_require__(/*! ./communities */ \"./src/services/communities.js\");\n\nvar communities = _interopRequireWildcard(_communities);\n\nvar _reviewOpportunities = __webpack_require__(/*! ./reviewOpportunities */ \"./src/services/reviewOpportunities.js\");\n\nvar reviewOpportunities = _interopRequireWildcard(_reviewOpportunities);\n\nvar _userSettings = __webpack_require__(/*! ./user-settings */ \"./src/services/user-settings.js\");\n\nvar userSetting = _interopRequireWildcard(_userSettings);\n\nvar _user = __webpack_require__(/*! ./user */ \"./src/services/user.js\");\n\nvar user = _interopRequireWildcard(_user);\n\nvar _lookup = __webpack_require__(/*! ./lookup */ \"./src/services/lookup.js\");\n\nvar lookup = _interopRequireWildcard(_lookup);\n\nvar _userTraits = __webpack_require__(/*! ./user-traits */ \"./src/services/user-traits.js\");\n\nvar userTraits = _interopRequireWildcard(_userTraits);\n\nvar _submissions = __webpack_require__(/*! ./submissions */ \"./src/services/submissions.js\");\n\nvar submissions = _interopRequireWildcard(_submissions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Export services.\n    */\n\n\nvar services = exports.services = {\n  api: api,\n  billing: billing,\n  terms: terms,\n  communities: communities,\n  challenge: challenge,\n  direct: direct,\n  groups: groups,\n  members: members,\n  user: user,\n  userSetting: userSetting,\n  reviewOpportunities: reviewOpportunities,\n  lookup: lookup,\n  userTraits: userTraits,\n  submissions: submissions\n};\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(services, 'services', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/index.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/index.js?");
 
 /***/ }),
 
@@ -970,7 +970,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.looker\"\n    * @desc  This module provides a service to get look data json via Topcoder API.\n    */\n\n\n/**\n * Service class.\n */\nvar LookerService = function () {\n  /**\n   * @param {String} token Optional. Auth token for Topcoder API.\n   */\n  function LookerService(token) {\n    (0, _classCallCheck3.default)(this, LookerService);\n\n    this.private = {\n      api: (0, _api.getApi)('V4', token),\n      token: token\n    };\n  }\n\n  /**\n   * Get json look data by id.\n   * @param {String} lookerId Look id.\n   * @return {Promise} Resolves to the json data.\n   */\n\n\n  (0, _createClass3.default)(LookerService, [{\n    key: 'getLooker',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(lookerId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/looks/' + lookerId + '/run/json');\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getLookerApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getLooker(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getLooker;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return LookerService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing looker service.\n * @param {String} token Optional. Auth token for Topcoder API.\n * @return {LookerService} looker service object\n */\nfunction getService(token) {\n  if (!lastInstance || token !== lastInstance.private.token) {\n    lastInstance = new LookerService(token);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(LookerService, 'LookerService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/looker.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/looker.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/looker.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/looker.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/looker.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.looker\"\n    * @desc  This module provides a service to get look data json via Topcoder API.\n    */\n\n\n/**\n * Service class.\n */\nvar LookerService = function () {\n  /**\n   * @param {String} token Optional. Auth token for Topcoder API.\n   */\n  function LookerService(token) {\n    (0, _classCallCheck3.default)(this, LookerService);\n\n    this.private = {\n      api: (0, _api.getApi)('V4', token),\n      token: token\n    };\n  }\n\n  /**\n   * Get json look data by id.\n   * @param {String} lookerId Look id.\n   * @return {Promise} Resolves to the json data.\n   */\n\n\n  (0, _createClass3.default)(LookerService, [{\n    key: 'getLooker',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(lookerId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/looks/' + lookerId + '/run/json');\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getLookerApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getLooker(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getLooker;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return LookerService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing looker service.\n * @param {String} token Optional. Auth token for Topcoder API.\n * @return {LookerService} looker service object\n */\nfunction getService(token) {\n  if (!lastInstance || token !== lastInstance.private.token) {\n    lastInstance = new LookerService(token);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(LookerService, 'LookerService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/looker.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/looker.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/looker.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/looker.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/looker.js?");
 
 /***/ }),
 
@@ -982,7 +982,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.lookup\"\n    * @desc  This module provides a service to get lookup data from Topcoder\n    * via API V3.\n    */\n\n\nvar LookupService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function LookupService(tokenV3) {\n    (0, _classCallCheck3.default)(this, LookupService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets tags.\n   * @param {Object} params Parameters\n   * @return {Promise} Resolves to the tags.\n   */\n\n\n  (0, _createClass3.default)(LookupService, [{\n    key: 'getTags',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(params) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/tags/?' + _qs2.default.stringify(params));\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getTags(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getTags;\n    }()\n\n    /**\n     * Gets countries.\n     * @param {Object} params Parameters\n     * @return {Promise} Resolves to the countries.\n     */\n\n  }, {\n    key: 'getCountries',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n        var res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.private.api.get('/members/lookup/countries');\n\n              case 2:\n                res = _context2.sent;\n                return _context2.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getCountries() {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getCountries;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return LookupService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing lookup service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {LookupService} Lookup service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new LookupService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(LookupService, 'LookupService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/lookup.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/lookup.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/lookup.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/lookup.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/lookup.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.lookup\"\n    * @desc  This module provides a service to get lookup data from Topcoder\n    * via API V3.\n    */\n\n\nvar LookupService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function LookupService(tokenV3) {\n    (0, _classCallCheck3.default)(this, LookupService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      apiV5: (0, _api.getApi)('V5', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets tags.\n   * @param {Object} params Parameters\n   * @return {Promise} Resolves to the tags.\n   */\n\n\n  (0, _createClass3.default)(LookupService, [{\n    key: 'getTags',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(params) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/tags/?' + _qs2.default.stringify(params));\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getTags(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getTags;\n    }()\n\n    /**\n     * Gets countries.\n     * @param {Object} params Parameters\n     * @return {Promise} Resolves to the countries.\n     */\n\n  }, {\n    key: 'getCountries',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n        var res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.private.api.get('/members/lookup/countries');\n\n              case 2:\n                res = _context2.sent;\n                return _context2.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getCountries() {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getCountries;\n    }()\n\n    /**\n     * Gets all countries.\n     * @return {Promise} Resolves to the countries.\n     */\n\n  }, {\n    key: 'getAllCountries',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n        var res, jsonResult;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.apiV5.get('/lookups/countries');\n\n              case 2:\n                res = _context3.sent;\n                _context3.next = 5;\n                return res.json();\n\n              case 5:\n                jsonResult = _context3.sent;\n                return _context3.abrupt('return', jsonResult);\n\n              case 7:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getAllCountries() {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getAllCountries;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return LookupService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing lookup service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {LookupService} Lookup service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new LookupService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(LookupService, 'LookupService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/lookup.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/lookup.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/lookup.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/lookup.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/lookup.js?");
 
 /***/ }),
 
@@ -994,7 +994,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _assign = __webpack_require__(/*! babel-runtime/core-js/object/assign */ \"babel-runtime/core-js/object/assign\");\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.members\"\n    * @desc  This module provides a service for searching for Topcoder\n    * members via API V3.\n    */\n\n/* global XMLHttpRequest */\n\n\n/**\n * Service class.\n */\nvar MembersService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function MembersService(tokenV3) {\n    (0, _classCallCheck3.default)(this, MembersService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets member's financial information.\n   * @param {String} handle User handle.\n   * @return {Promise} Resolves to the financial information object.\n   */\n\n\n  (0, _createClass3.default)(MembersService, [{\n    key: 'getMemberFinances',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/members/' + handle + '/financial');\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getMemberFinances(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getMemberFinances;\n    }()\n\n    /**\n     * Gets public information on a member.\n     *\n     * This method does not require any authorization.\n     *\n     * @param {String} handle Member handle.\n     * @return {Promise} Resolves to the data object.\n     */\n\n  }, {\n    key: 'getMemberInfo',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.private.api.get('/members/' + handle);\n\n              case 2:\n                res = _context2.sent;\n                return _context2.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getMemberInfo(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getMemberInfo;\n    }()\n\n    /**\n     * Gets member external account info.\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getExternalAccounts',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.api.get('/members/' + handle + '/externalAccounts');\n\n              case 2:\n                res = _context3.sent;\n                return _context3.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getExternalAccounts(_x3) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getExternalAccounts;\n    }()\n\n    /**\n     * Gets member external links.\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getExternalLinks',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                _context4.next = 2;\n                return this.private.api.get('/members/' + handle + '/externalLinks');\n\n              case 2:\n                res = _context4.sent;\n                return _context4.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function getExternalLinks(_x4) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return getExternalLinks;\n    }()\n\n    /**\n     * Gets member skills.\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getSkills',\n    value: function () {\n      var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                _context5.next = 2;\n                return this.private.api.get('/members/' + handle + '/skills');\n\n              case 2:\n                res = _context5.sent;\n                return _context5.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function getSkills(_x5) {\n        return _ref5.apply(this, arguments);\n      }\n\n      return getSkills;\n    }()\n\n    /**\n     * Gets member statistics.\n     * @param {String} handle\n     * @param {String} groupIds\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getStats',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(handle, groupIds) {\n        var res;\n        return _regenerator2.default.wrap(function _callee6$(_context6) {\n          while (1) {\n            switch (_context6.prev = _context6.next) {\n              case 0:\n                res = void 0;\n\n                if (!groupIds) {\n                  _context6.next = 7;\n                  break;\n                }\n\n                _context6.next = 4;\n                return this.private.api.get('/members/' + handle + '/stats?groupIds=' + groupIds);\n\n              case 4:\n                res = _context6.sent;\n                _context6.next = 10;\n                break;\n\n              case 7:\n                _context6.next = 9;\n                return this.private.api.get('/members/' + handle + '/stats');\n\n              case 9:\n                res = _context6.sent;\n\n              case 10:\n                return _context6.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 11:\n              case 'end':\n                return _context6.stop();\n            }\n          }\n        }, _callee6, this);\n      }));\n\n      function getStats(_x6, _x7) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return getStats;\n    }()\n\n    /**\n     * Gets member statistics history\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getStatsHistory',\n    value: function () {\n      var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee7$(_context7) {\n          while (1) {\n            switch (_context7.prev = _context7.next) {\n              case 0:\n                _context7.next = 2;\n                return this.private.api.get('/members/' + handle + '/stats/history');\n\n              case 2:\n                res = _context7.sent;\n                return _context7.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context7.stop();\n            }\n          }\n        }, _callee7, this);\n      }));\n\n      function getStatsHistory(_x8) {\n        return _ref7.apply(this, arguments);\n      }\n\n      return getStatsHistory;\n    }()\n\n    /**\n     * Gets member statistics distribution\n     * @param {String} handle\n     * @param {String} track\n     * @param {String} subTrack\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getStatsDistribution',\n    value: function () {\n      var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(handle, track, subTrack) {\n        var res;\n        return _regenerator2.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                _context8.next = 2;\n                return this.private.api.get('/members/stats/distribution?filter=' + encodeURIComponent(_qs2.default.stringify({\n                  track: track,\n                  subTrack: subTrack\n                })));\n\n              case 2:\n                res = _context8.sent;\n                return _context8.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context8.stop();\n            }\n          }\n        }, _callee8, this);\n      }));\n\n      function getStatsDistribution(_x9, _x10, _x11) {\n        return _ref8.apply(this, arguments);\n      }\n\n      return getStatsDistribution;\n    }()\n\n    /**\n     * Gets a list of suggested member names for the supplied partial.\n     *\n     * WARNING: This method requires v3 authorization.\n     *\n     * @param {String} keyword Partial string to find suggestions for\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'getMemberSuggestions',\n    value: function () {\n      var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(keyword) {\n        var res;\n        return _regenerator2.default.wrap(function _callee9$(_context9) {\n          while (1) {\n            switch (_context9.prev = _context9.next) {\n              case 0:\n                _context9.next = 2;\n                return this.private.api.get('/members/_suggest/' + keyword);\n\n              case 2:\n                res = _context9.sent;\n                return _context9.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context9.stop();\n            }\n          }\n        }, _callee9, this);\n      }));\n\n      function getMemberSuggestions(_x12) {\n        return _ref9.apply(this, arguments);\n      }\n\n      return getMemberSuggestions;\n    }()\n\n    /**\n     * Adds external web link for member.\n     * @param {String} userHandle The user handle\n     * @param {String} webLink The external web link\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'addWebLink',\n    value: function () {\n      var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(userHandle, webLink) {\n        var res;\n        return _regenerator2.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                _context10.next = 2;\n                return this.private.api.postJson('/members/' + userHandle + '/externalLinks', { param: { url: webLink } });\n\n              case 2:\n                res = _context10.sent;\n                return _context10.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context10.stop();\n            }\n          }\n        }, _callee10, this);\n      }));\n\n      function addWebLink(_x13, _x14) {\n        return _ref10.apply(this, arguments);\n      }\n\n      return addWebLink;\n    }()\n\n    /**\n     * Deletes external web link for member.\n     * @param {String} userHandle The user handle\n     * @param {String} webLinkHandle The external web link handle\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'deleteWebLink',\n    value: function () {\n      var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(userHandle, webLinkHandle) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee11$(_context11) {\n          while (1) {\n            switch (_context11.prev = _context11.next) {\n              case 0:\n                body = {\n                  param: {\n                    handle: webLinkHandle\n                  }\n                };\n                _context11.next = 3;\n                return this.private.api.delete('/members/' + userHandle + '/externalLinks/' + webLinkHandle, (0, _stringify2.default)(body));\n\n              case 3:\n                res = _context11.sent;\n                return _context11.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context11.stop();\n            }\n          }\n        }, _callee11, this);\n      }));\n\n      function deleteWebLink(_x15, _x16) {\n        return _ref11.apply(this, arguments);\n      }\n\n      return deleteWebLink;\n    }()\n\n    /**\n     * Adds user skill.\n     * @param {String} handle Topcoder user handle\n     * @param {Number} skillTagId Skill tag id\n     * @return {Promise} Resolves to operation result\n     */\n\n  }, {\n    key: 'addSkill',\n    value: function () {\n      var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(handle, skillTagId) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee12$(_context12) {\n          while (1) {\n            switch (_context12.prev = _context12.next) {\n              case 0:\n                body = {\n                  param: {\n                    skills: (0, _defineProperty3.default)({}, skillTagId, {\n                      hidden: false\n                    })\n                  }\n                };\n                _context12.next = 3;\n                return this.private.api.patchJson('/members/' + handle + '/skills', body);\n\n              case 3:\n                res = _context12.sent;\n                return _context12.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context12.stop();\n            }\n          }\n        }, _callee12, this);\n      }));\n\n      function addSkill(_x17, _x18) {\n        return _ref12.apply(this, arguments);\n      }\n\n      return addSkill;\n    }()\n\n    /**\n     * Hides user skill.\n     * @param {String} handle Topcoder user handle\n     * @param {Number} skillTagId Skill tag id\n     * @return {Promise} Resolves to operation result\n     */\n\n  }, {\n    key: 'hideSkill',\n    value: function () {\n      var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(handle, skillTagId) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee13$(_context13) {\n          while (1) {\n            switch (_context13.prev = _context13.next) {\n              case 0:\n                body = {\n                  param: {\n                    skills: (0, _defineProperty3.default)({}, skillTagId, {\n                      hidden: true\n                    })\n                  }\n                };\n                _context13.next = 3;\n                return this.private.api.fetch('/members/' + handle + '/skills', {\n                  body: (0, _stringify2.default)(body),\n                  method: 'PATCH'\n                });\n\n              case 3:\n                res = _context13.sent;\n                return _context13.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context13.stop();\n            }\n          }\n        }, _callee13, this);\n      }));\n\n      function hideSkill(_x19, _x20) {\n        return _ref13.apply(this, arguments);\n      }\n\n      return hideSkill;\n    }()\n\n    /**\n     * Updates member profile.\n     * @param {Object} profile The profile to update.\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'updateMemberProfile',\n    value: function () {\n      var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(profile) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee14$(_context14) {\n          while (1) {\n            switch (_context14.prev = _context14.next) {\n              case 0:\n                url = profile.verifyUrl ? '/members/' + profile.handle + '?verifyUrl=' + profile.verifyUrl : '/members/' + profile.handle;\n                _context14.next = 3;\n                return this.private.api.putJson(url, { param: profile.verifyUrl ? _lodash2.default.omit(profile, ['verifyUrl']) : profile });\n\n              case 3:\n                res = _context14.sent;\n\n                if (!(profile.verifyUrl && res.status === 409)) {\n                  _context14.next = 6;\n                  break;\n                }\n\n                return _context14.abrupt('return', _promise2.default.resolve((0, _assign2.default)({}, profile, { isEmailConflict: true })));\n\n              case 6:\n                return _context14.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 7:\n              case 'end':\n                return _context14.stop();\n            }\n          }\n        }, _callee14, this);\n      }));\n\n      function updateMemberProfile(_x21) {\n        return _ref14.apply(this, arguments);\n      }\n\n      return updateMemberProfile;\n    }()\n\n    /**\n     * Gets presigned url for member photo file.\n     * @param {String} userHandle The user handle\n     * @param {File} file The file to get its presigned url\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'getPresignedUrl',\n    value: function () {\n      var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(userHandle, file) {\n        var res, payload;\n        return _regenerator2.default.wrap(function _callee15$(_context15) {\n          while (1) {\n            switch (_context15.prev = _context15.next) {\n              case 0:\n                _context15.next = 2;\n                return this.private.api.postJson('/members/' + userHandle + '/photoUploadUrl', { param: { contentType: file.type } });\n\n              case 2:\n                res = _context15.sent;\n                _context15.next = 5;\n                return (0, _tc.getApiResponsePayload)(res);\n\n              case 5:\n                payload = _context15.sent;\n                return _context15.abrupt('return', {\n                  preSignedURL: payload.preSignedURL,\n                  token: payload.token,\n                  file: file,\n                  userHandle: userHandle\n                });\n\n              case 7:\n              case 'end':\n                return _context15.stop();\n            }\n          }\n        }, _callee15, this);\n      }));\n\n      function getPresignedUrl(_x22, _x23) {\n        return _ref15.apply(this, arguments);\n      }\n\n      return getPresignedUrl;\n    }()\n\n    /**\n     * Updates member photo.\n     * @param {Object} S3Response The response from uploadFileToS3() function.\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'updateMemberPhoto',\n    value: function () {\n      var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(S3Response) {\n        var res;\n        return _regenerator2.default.wrap(function _callee16$(_context16) {\n          while (1) {\n            switch (_context16.prev = _context16.next) {\n              case 0:\n                _context16.next = 2;\n                return this.private.api.putJson('/members/' + S3Response.userHandle + '/photo', { param: S3Response.body });\n\n              case 2:\n                res = _context16.sent;\n                return _context16.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context16.stop();\n            }\n          }\n        }, _callee16, this);\n      }));\n\n      function updateMemberPhoto(_x24) {\n        return _ref16.apply(this, arguments);\n      }\n\n      return updateMemberPhoto;\n    }()\n\n    /**\n     * Uploads file to S3.\n     * @param {Object} presignedUrlResponse The presigned url response from\n     *                                      getPresignedUrl() function.\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'uploadFileToS3',\n    value: function uploadFileToS3(presignedUrlResponse) {\n      _lodash2.default.noop(this);\n      return new _promise2.default(function (resolve, reject) {\n        var xhr = new XMLHttpRequest();\n\n        xhr.open('PUT', presignedUrlResponse.preSignedURL, true);\n        xhr.setRequestHeader('Content-Type', presignedUrlResponse.file.type);\n\n        xhr.onreadystatechange = function () {\n          var status = xhr.status;\n\n          if ((status >= 200 && status < 300 || status === 304) && xhr.readyState === 4) {\n            resolve({\n              userHandle: presignedUrlResponse.userHandle,\n              body: {\n                token: presignedUrlResponse.token,\n                contentType: presignedUrlResponse.file.type\n              }\n            });\n          } else if (status >= 400) {\n            var err = new Error('Could not upload image to S3');\n            err.status = status;\n            reject(err);\n          }\n        };\n\n        xhr.onerror = function (err) {\n          _logger2.default.error('Could not upload image to S3', err);\n\n          reject(err);\n        };\n\n        xhr.send(presignedUrlResponse.file);\n      });\n    }\n\n    /**\n     * Verify member new email\n     * @param {String} handle handle Topcoder user handle\n     * @param {String} emailVerifyToken The verify token of new email\n     * @returns {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'verifyMemberNewEmail',\n    value: function () {\n      var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(handle, emailVerifyToken) {\n        var res;\n        return _regenerator2.default.wrap(function _callee17$(_context17) {\n          while (1) {\n            switch (_context17.prev = _context17.next) {\n              case 0:\n                _context17.next = 2;\n                return this.private.api.get('/members/' + handle + '/verify?token=' + emailVerifyToken);\n\n              case 2:\n                res = _context17.sent;\n                return _context17.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context17.stop();\n            }\n          }\n        }, _callee17, this);\n      }));\n\n      function verifyMemberNewEmail(_x25, _x26) {\n        return _ref17.apply(this, arguments);\n      }\n\n      return verifyMemberNewEmail;\n    }()\n\n    /**\n     * Get members information\n     * @param {Array} userIds the member ids\n     */\n\n  }, {\n    key: 'getMembersInformation',\n    value: function () {\n      var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(userIds) {\n        var query, limit, url, res;\n        return _regenerator2.default.wrap(function _callee18$(_context18) {\n          while (1) {\n            switch (_context18.prev = _context18.next) {\n              case 0:\n                query = 'query=' + encodeURI(_lodash2.default.map(userIds, function (id) {\n                  return 'userId:' + id;\n                }).join(' OR '));\n                limit = 'limit=' + userIds.length;\n                url = '/members/_search?fields=userId%2Chandle&' + query + '&' + limit;\n                _context18.next = 5;\n                return this.private.api.get(url);\n\n              case 5:\n                res = _context18.sent;\n                return _context18.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 7:\n              case 'end':\n                return _context18.stop();\n            }\n          }\n        }, _callee18, this);\n      }));\n\n      function getMembersInformation(_x27) {\n        return _ref18.apply(this, arguments);\n      }\n\n      return getMembersInformation;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return MembersService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing members service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {MembersService} Members service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new MembersService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(MembersService, 'MembersService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/members.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/members.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/members.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/members.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/members.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _assign = __webpack_require__(/*! babel-runtime/core-js/object/assign */ \"babel-runtime/core-js/object/assign\");\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _defineProperty2 = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ \"babel-runtime/helpers/defineProperty\");\n\nvar _defineProperty3 = _interopRequireDefault(_defineProperty2);\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.members\"\n    * @desc  This module provides a service for searching for Topcoder\n    * members via API V3.\n    */\n\n/* global XMLHttpRequest */\n\n\n/**\n * Service class.\n */\nvar MembersService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function MembersService(tokenV3) {\n    (0, _classCallCheck3.default)(this, MembersService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets member's financial information.\n   * @param {String} handle User handle.\n   * @return {Promise} Resolves to the financial information object.\n   */\n\n\n  (0, _createClass3.default)(MembersService, [{\n    key: 'getMemberFinances',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/members/' + handle + '/financial');\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getMemberFinances(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getMemberFinances;\n    }()\n\n    /**\n     * Gets public information on a member.\n     *\n     * This method does not require any authorization.\n     *\n     * @param {String} handle Member handle.\n     * @return {Promise} Resolves to the data object.\n     */\n\n  }, {\n    key: 'getMemberInfo',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.private.api.get('/members/' + handle);\n\n              case 2:\n                res = _context2.sent;\n                return _context2.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getMemberInfo(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getMemberInfo;\n    }()\n\n    /**\n     * Gets member external account info.\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getExternalAccounts',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.api.get('/members/' + handle + '/externalAccounts');\n\n              case 2:\n                res = _context3.sent;\n                return _context3.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getExternalAccounts(_x3) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getExternalAccounts;\n    }()\n\n    /**\n     * Gets member external links.\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getExternalLinks',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                _context4.next = 2;\n                return this.private.api.get('/members/' + handle + '/externalLinks');\n\n              case 2:\n                res = _context4.sent;\n                return _context4.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function getExternalLinks(_x4) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return getExternalLinks;\n    }()\n\n    /**\n     * Gets member skills.\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getSkills',\n    value: function () {\n      var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                _context5.next = 2;\n                return this.private.api.get('/members/' + handle + '/skills');\n\n              case 2:\n                res = _context5.sent;\n                return _context5.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function getSkills(_x5) {\n        return _ref5.apply(this, arguments);\n      }\n\n      return getSkills;\n    }()\n\n    /**\n     * Gets member statistics.\n     * @param {String} handle\n     * @param {String} groupIds\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getStats',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(handle, groupIds) {\n        var res;\n        return _regenerator2.default.wrap(function _callee6$(_context6) {\n          while (1) {\n            switch (_context6.prev = _context6.next) {\n              case 0:\n                res = void 0;\n\n                if (!groupIds) {\n                  _context6.next = 7;\n                  break;\n                }\n\n                _context6.next = 4;\n                return this.private.api.get('/members/' + handle + '/stats?groupIds=' + groupIds);\n\n              case 4:\n                res = _context6.sent;\n                _context6.next = 10;\n                break;\n\n              case 7:\n                _context6.next = 9;\n                return this.private.api.get('/members/' + handle + '/stats');\n\n              case 9:\n                res = _context6.sent;\n\n              case 10:\n                return _context6.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 11:\n              case 'end':\n                return _context6.stop();\n            }\n          }\n        }, _callee6, this);\n      }));\n\n      function getStats(_x6, _x7) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return getStats;\n    }()\n\n    /**\n     * Gets member statistics history\n     * @param {String} handle\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getStatsHistory',\n    value: function () {\n      var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee7$(_context7) {\n          while (1) {\n            switch (_context7.prev = _context7.next) {\n              case 0:\n                _context7.next = 2;\n                return this.private.api.get('/members/' + handle + '/stats/history');\n\n              case 2:\n                res = _context7.sent;\n                return _context7.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context7.stop();\n            }\n          }\n        }, _callee7, this);\n      }));\n\n      function getStatsHistory(_x8) {\n        return _ref7.apply(this, arguments);\n      }\n\n      return getStatsHistory;\n    }()\n\n    /**\n     * Gets member statistics distribution\n     * @param {String} handle\n     * @param {String} track\n     * @param {String} subTrack\n     * @return {Promise} Resolves to the stats object.\n     */\n\n  }, {\n    key: 'getStatsDistribution',\n    value: function () {\n      var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(handle, track, subTrack) {\n        var res;\n        return _regenerator2.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                _context8.next = 2;\n                return this.private.api.get('/members/stats/distribution?filter=' + encodeURIComponent(_qs2.default.stringify({\n                  track: track,\n                  subTrack: subTrack\n                })));\n\n              case 2:\n                res = _context8.sent;\n                return _context8.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context8.stop();\n            }\n          }\n        }, _callee8, this);\n      }));\n\n      function getStatsDistribution(_x9, _x10, _x11) {\n        return _ref8.apply(this, arguments);\n      }\n\n      return getStatsDistribution;\n    }()\n\n    /**\n     * Gets a list of suggested member names for the supplied partial.\n     *\n     * WARNING: This method requires v3 authorization.\n     *\n     * @param {String} keyword Partial string to find suggestions for\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'getMemberSuggestions',\n    value: function () {\n      var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(keyword) {\n        var res;\n        return _regenerator2.default.wrap(function _callee9$(_context9) {\n          while (1) {\n            switch (_context9.prev = _context9.next) {\n              case 0:\n                _context9.next = 2;\n                return this.private.api.get('/members/_suggest/' + keyword);\n\n              case 2:\n                res = _context9.sent;\n                return _context9.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context9.stop();\n            }\n          }\n        }, _callee9, this);\n      }));\n\n      function getMemberSuggestions(_x12) {\n        return _ref9.apply(this, arguments);\n      }\n\n      return getMemberSuggestions;\n    }()\n\n    /**\n     * Adds external web link for member.\n     * @param {String} userHandle The user handle\n     * @param {String} webLink The external web link\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'addWebLink',\n    value: function () {\n      var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(userHandle, webLink) {\n        var res;\n        return _regenerator2.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                _context10.next = 2;\n                return this.private.api.postJson('/members/' + userHandle + '/externalLinks', { param: { url: webLink } });\n\n              case 2:\n                res = _context10.sent;\n                return _context10.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context10.stop();\n            }\n          }\n        }, _callee10, this);\n      }));\n\n      function addWebLink(_x13, _x14) {\n        return _ref10.apply(this, arguments);\n      }\n\n      return addWebLink;\n    }()\n\n    /**\n     * Deletes external web link for member.\n     * @param {String} userHandle The user handle\n     * @param {String} webLinkHandle The external web link handle\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'deleteWebLink',\n    value: function () {\n      var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(userHandle, webLinkHandle) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee11$(_context11) {\n          while (1) {\n            switch (_context11.prev = _context11.next) {\n              case 0:\n                body = {\n                  param: {\n                    handle: webLinkHandle\n                  }\n                };\n                _context11.next = 3;\n                return this.private.api.delete('/members/' + userHandle + '/externalLinks/' + webLinkHandle, (0, _stringify2.default)(body));\n\n              case 3:\n                res = _context11.sent;\n                return _context11.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context11.stop();\n            }\n          }\n        }, _callee11, this);\n      }));\n\n      function deleteWebLink(_x15, _x16) {\n        return _ref11.apply(this, arguments);\n      }\n\n      return deleteWebLink;\n    }()\n\n    /**\n     * Adds user skill.\n     * @param {String} handle Topcoder user handle\n     * @param {Number} skillTagId Skill tag id\n     * @return {Promise} Resolves to operation result\n     */\n\n  }, {\n    key: 'addSkill',\n    value: function () {\n      var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(handle, skillTagId) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee12$(_context12) {\n          while (1) {\n            switch (_context12.prev = _context12.next) {\n              case 0:\n                body = {\n                  param: {\n                    skills: (0, _defineProperty3.default)({}, skillTagId, {\n                      hidden: false\n                    })\n                  }\n                };\n                _context12.next = 3;\n                return this.private.api.patchJson('/members/' + handle + '/skills', body);\n\n              case 3:\n                res = _context12.sent;\n                return _context12.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context12.stop();\n            }\n          }\n        }, _callee12, this);\n      }));\n\n      function addSkill(_x17, _x18) {\n        return _ref12.apply(this, arguments);\n      }\n\n      return addSkill;\n    }()\n\n    /**\n     * Hides user skill.\n     * @param {String} handle Topcoder user handle\n     * @param {Number} skillTagId Skill tag id\n     * @return {Promise} Resolves to operation result\n     */\n\n  }, {\n    key: 'hideSkill',\n    value: function () {\n      var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(handle, skillTagId) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee13$(_context13) {\n          while (1) {\n            switch (_context13.prev = _context13.next) {\n              case 0:\n                body = {\n                  param: {\n                    skills: (0, _defineProperty3.default)({}, skillTagId, {\n                      hidden: true\n                    })\n                  }\n                };\n                _context13.next = 3;\n                return this.private.api.fetch('/members/' + handle + '/skills', {\n                  body: (0, _stringify2.default)(body),\n                  method: 'PATCH'\n                });\n\n              case 3:\n                res = _context13.sent;\n                return _context13.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context13.stop();\n            }\n          }\n        }, _callee13, this);\n      }));\n\n      function hideSkill(_x19, _x20) {\n        return _ref13.apply(this, arguments);\n      }\n\n      return hideSkill;\n    }()\n\n    /**\n     * Updates member profile.\n     * @param {Object} profile The profile to update.\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'updateMemberProfile',\n    value: function () {\n      var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(profile) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee14$(_context14) {\n          while (1) {\n            switch (_context14.prev = _context14.next) {\n              case 0:\n                url = profile.verifyUrl ? '/members/' + profile.handle + '?verifyUrl=' + profile.verifyUrl : '/members/' + profile.handle;\n                _context14.next = 3;\n                return this.private.api.putJson(url, { param: profile.verifyUrl ? _lodash2.default.omit(profile, ['verifyUrl']) : profile });\n\n              case 3:\n                res = _context14.sent;\n\n                if (!(profile.verifyUrl && res.status === 409)) {\n                  _context14.next = 6;\n                  break;\n                }\n\n                return _context14.abrupt('return', _promise2.default.resolve((0, _assign2.default)({}, profile, { isEmailConflict: true })));\n\n              case 6:\n                return _context14.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 7:\n              case 'end':\n                return _context14.stop();\n            }\n          }\n        }, _callee14, this);\n      }));\n\n      function updateMemberProfile(_x21) {\n        return _ref14.apply(this, arguments);\n      }\n\n      return updateMemberProfile;\n    }()\n\n    /**\n     * Gets presigned url for member photo file.\n     * @param {String} userHandle The user handle\n     * @param {File} file The file to get its presigned url\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'getPresignedUrl',\n    value: function () {\n      var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(userHandle, file) {\n        var res, payload;\n        return _regenerator2.default.wrap(function _callee15$(_context15) {\n          while (1) {\n            switch (_context15.prev = _context15.next) {\n              case 0:\n                _context15.next = 2;\n                return this.private.api.postJson('/members/' + userHandle + '/photoUploadUrl', { param: { contentType: file.type } });\n\n              case 2:\n                res = _context15.sent;\n                _context15.next = 5;\n                return (0, _tc.getApiResponsePayload)(res);\n\n              case 5:\n                payload = _context15.sent;\n                return _context15.abrupt('return', {\n                  preSignedURL: payload.preSignedURL,\n                  token: payload.token,\n                  file: file,\n                  userHandle: userHandle\n                });\n\n              case 7:\n              case 'end':\n                return _context15.stop();\n            }\n          }\n        }, _callee15, this);\n      }));\n\n      function getPresignedUrl(_x22, _x23) {\n        return _ref15.apply(this, arguments);\n      }\n\n      return getPresignedUrl;\n    }()\n\n    /**\n     * Updates member photo.\n     * @param {Object} S3Response The response from uploadFileToS3() function.\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'updateMemberPhoto',\n    value: function () {\n      var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(S3Response) {\n        var res;\n        return _regenerator2.default.wrap(function _callee16$(_context16) {\n          while (1) {\n            switch (_context16.prev = _context16.next) {\n              case 0:\n                _context16.next = 2;\n                return this.private.api.putJson('/members/' + S3Response.userHandle + '/photo', { param: S3Response.body });\n\n              case 2:\n                res = _context16.sent;\n                return _context16.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context16.stop();\n            }\n          }\n        }, _callee16, this);\n      }));\n\n      function updateMemberPhoto(_x24) {\n        return _ref16.apply(this, arguments);\n      }\n\n      return updateMemberPhoto;\n    }()\n\n    /**\n     * Uploads file to S3.\n     * @param {Object} presignedUrlResponse The presigned url response from\n     *                                      getPresignedUrl() function.\n     * @return {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'uploadFileToS3',\n    value: function uploadFileToS3(presignedUrlResponse) {\n      _lodash2.default.noop(this);\n      return new _promise2.default(function (resolve, reject) {\n        var xhr = new XMLHttpRequest();\n\n        xhr.open('PUT', presignedUrlResponse.preSignedURL, true);\n        xhr.setRequestHeader('Content-Type', presignedUrlResponse.file.type);\n\n        xhr.onreadystatechange = function () {\n          var status = xhr.status;\n\n          if ((status >= 200 && status < 300 || status === 304) && xhr.readyState === 4) {\n            resolve({\n              userHandle: presignedUrlResponse.userHandle,\n              body: {\n                token: presignedUrlResponse.token,\n                contentType: presignedUrlResponse.file.type\n              }\n            });\n          } else if (status >= 400) {\n            var err = new Error('Could not upload image to S3');\n            err.status = status;\n            reject(err);\n          }\n        };\n\n        xhr.onerror = function (err) {\n          _logger2.default.error('Could not upload image to S3', err);\n\n          reject(err);\n        };\n\n        xhr.send(presignedUrlResponse.file);\n      });\n    }\n\n    /**\n     * Verify member new email\n     * @param {String} handle handle Topcoder user handle\n     * @param {String} emailVerifyToken The verify token of new email\n     * @returns {Promise} Resolves to the api response content\n     */\n\n  }, {\n    key: 'verifyMemberNewEmail',\n    value: function () {\n      var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(handle, emailVerifyToken) {\n        var res;\n        return _regenerator2.default.wrap(function _callee17$(_context17) {\n          while (1) {\n            switch (_context17.prev = _context17.next) {\n              case 0:\n                _context17.next = 2;\n                return this.private.api.get('/members/' + handle + '/verify?token=' + emailVerifyToken);\n\n              case 2:\n                res = _context17.sent;\n                return _context17.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context17.stop();\n            }\n          }\n        }, _callee17, this);\n      }));\n\n      function verifyMemberNewEmail(_x25, _x26) {\n        return _ref17.apply(this, arguments);\n      }\n\n      return verifyMemberNewEmail;\n    }()\n\n    /**\n     * Get members information\n     * @param {Array} userIds the member ids\n     */\n\n  }, {\n    key: 'getMembersInformation',\n    value: function () {\n      var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(userIds) {\n        var query, limit, url, res;\n        return _regenerator2.default.wrap(function _callee18$(_context18) {\n          while (1) {\n            switch (_context18.prev = _context18.next) {\n              case 0:\n                query = 'query=' + encodeURI(_lodash2.default.map(userIds, function (id) {\n                  return 'userId:' + id;\n                }).join(' OR '));\n                limit = 'limit=' + userIds.length;\n                url = '/members/_search?fields=userId%2Chandle&' + query + '&' + limit;\n                _context18.next = 5;\n                return this.private.api.get(url);\n\n              case 5:\n                res = _context18.sent;\n                return _context18.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 7:\n              case 'end':\n                return _context18.stop();\n            }\n          }\n        }, _callee18, this);\n      }));\n\n      function getMembersInformation(_x27) {\n        return _ref18.apply(this, arguments);\n      }\n\n      return getMembersInformation;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return MembersService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing members service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {MembersService} Members service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new MembersService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(MembersService, 'MembersService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/members.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/members.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/members.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/members.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/members.js?");
 
 /***/ }),
 
@@ -1006,7 +1006,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getReviewOpportunitiesService = getReviewOpportunitiesService;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.reviewOpportunities\"\n    * @desc This module provides a service for retrieving Review Opportunities and\n    * submitting applications.\n    */\n\n\n/**\n * Service class.\n */\nvar ReviewOpportunitiesService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function ReviewOpportunitiesService(tokenV3) {\n    (0, _classCallCheck3.default)(this, ReviewOpportunitiesService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets a list of currently open Review Opportunities.\n   * @param {Number} limit The max number to return in one call.\n   * @param {Number} offset Offset, used with limit to lazy load.\n   * @return {Promise} Resolves to the api response in JSON.\n   */\n\n\n  (0, _createClass3.default)(ReviewOpportunitiesService, [{\n    key: 'getReviewOpportunities',\n    value: function getReviewOpportunities(limit, offset) {\n      var endpoint = '/reviewOpportunities?limit=' + limit + '&offset=' + offset;\n      return this.private.api.get(endpoint).then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(new Error('Error Code: ' + res.status));\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : _promise2.default.reject(res.result.content);\n      });\n    }\n\n    /**\n     * Gets the details of the review opportunity for the corresponding challenge\n     * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n     * @return {Promise} Resolves to the api response in JSON.\n     */\n\n  }, {\n    key: 'getDetails',\n    value: function getDetails(challengeId) {\n      var endpoint = '/reviewOpportunities/' + challengeId;\n      return this.private.api.get(endpoint).then(function (res) {\n        return res.json();\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : _promise2.default.reject(res.result);\n      });\n    }\n\n    /**\n     * Submits review opportunity application for the specified challenge\n     * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n     * @param {Array} roleIds List of review role IDs to apply for\n     * @return {Promise} Resolves to the api response in JSON.\n     */\n\n  }, {\n    key: 'submitApplications',\n    value: function submitApplications(challengeId, roleIds) {\n      var endpoint = '/reviewOpportunities/' + challengeId + '/applications?reviewApplicationRoleIds=' + roleIds.join(',');\n      return this.private.api.post(endpoint, {}).then(function (res) {\n        return JSON.parse(res);\n      });\n    }\n\n    /**\n     * Cancels review opportunity application for the specified challenge\n     * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n     * @param {Array} roleIds List of review role IDs to cancel applications for\n     * @return {Promise} Resolves to the api response in JSON.\n     */\n\n  }, {\n    key: 'cancelApplications',\n    value: function cancelApplications(challengeId, roleIds) {\n      var endpoint = '/reviewOpportunities/' + challengeId + '/applications?reviewApplicationRoleIds=' + roleIds.join(',');\n      return this.private.api.delete(endpoint, {}).then(function (res) {\n        return JSON.parse(res);\n      });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return ReviewOpportunitiesService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing review opportunities service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {MembersService} Members service object\n */\nfunction getReviewOpportunitiesService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new ReviewOpportunitiesService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ReviewOpportunitiesService, 'ReviewOpportunitiesService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/reviewOpportunities.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/reviewOpportunities.js');\n  reactHotLoader.register(getReviewOpportunitiesService, 'getReviewOpportunitiesService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/reviewOpportunities.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/reviewOpportunities.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/reviewOpportunities.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getReviewOpportunitiesService = getReviewOpportunitiesService;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.reviewOpportunities\"\n    * @desc This module provides a service for retrieving Review Opportunities and\n    * submitting applications.\n    */\n\n\n/**\n * Service class.\n */\nvar ReviewOpportunitiesService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function ReviewOpportunitiesService(tokenV3) {\n    (0, _classCallCheck3.default)(this, ReviewOpportunitiesService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets a list of currently open Review Opportunities.\n   * @param {Number} limit The max number to return in one call.\n   * @param {Number} offset Offset, used with limit to lazy load.\n   * @return {Promise} Resolves to the api response in JSON.\n   */\n\n\n  (0, _createClass3.default)(ReviewOpportunitiesService, [{\n    key: 'getReviewOpportunities',\n    value: function getReviewOpportunities(limit, offset) {\n      var endpoint = '/reviewOpportunities?limit=' + limit + '&offset=' + offset;\n      return this.private.api.get(endpoint).then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(new Error('Error Code: ' + res.status));\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : _promise2.default.reject(res.result.content);\n      });\n    }\n\n    /**\n     * Gets the details of the review opportunity for the corresponding challenge\n     * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n     * @return {Promise} Resolves to the api response in JSON.\n     */\n\n  }, {\n    key: 'getDetails',\n    value: function getDetails(challengeId) {\n      var endpoint = '/reviewOpportunities/' + challengeId;\n      return this.private.api.get(endpoint).then(function (res) {\n        return res.json();\n      }).then(function (res) {\n        return res.result.status === 200 ? res.result.content : _promise2.default.reject(res.result);\n      });\n    }\n\n    /**\n     * Submits review opportunity application for the specified challenge\n     * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n     * @param {Array} roleIds List of review role IDs to apply for\n     * @return {Promise} Resolves to the api response in JSON.\n     */\n\n  }, {\n    key: 'submitApplications',\n    value: function submitApplications(challengeId, roleIds) {\n      var endpoint = '/reviewOpportunities/' + challengeId + '/applications?reviewApplicationRoleIds=' + roleIds.join(',');\n      return this.private.api.post(endpoint, {}).then(function (res) {\n        return JSON.parse(res);\n      });\n    }\n\n    /**\n     * Cancels review opportunity application for the specified challenge\n     * @param {Number} challengeId The ID of the challenge (not the opportunity id)\n     * @param {Array} roleIds List of review role IDs to cancel applications for\n     * @return {Promise} Resolves to the api response in JSON.\n     */\n\n  }, {\n    key: 'cancelApplications',\n    value: function cancelApplications(challengeId, roleIds) {\n      var endpoint = '/reviewOpportunities/' + challengeId + '/applications?reviewApplicationRoleIds=' + roleIds.join(',');\n      return this.private.api.delete(endpoint, {}).then(function (res) {\n        return JSON.parse(res);\n      });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return ReviewOpportunitiesService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing review opportunities service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {MembersService} Members service object\n */\nfunction getReviewOpportunitiesService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new ReviewOpportunitiesService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ReviewOpportunitiesService, 'ReviewOpportunitiesService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/reviewOpportunities.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/reviewOpportunities.js');\n  reactHotLoader.register(getReviewOpportunitiesService, 'getReviewOpportunitiesService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/reviewOpportunities.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/reviewOpportunities.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/reviewOpportunities.js?");
 
 /***/ }),
 
@@ -1018,7 +1018,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.submission\"\n    * @desc This module provides a service for convenient manipulation with\n    *  Topcoder submissions via TC API. Currently only used for MM challenges\n    */\n\n/**\n * Submission service.\n */\nvar SubmissionsService = function () {\n  /**\n   * Creates a new SubmissionService instance.\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function SubmissionsService(tokenV3) {\n    (0, _classCallCheck3.default)(this, SubmissionsService);\n\n    this.private = {\n      broker: (0, _api.getApi)('MM_BROKER', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Get submissions of challenge\n   * @param {Object} challengeId\n   * @return {Promise} Resolves to the api response.\n   */\n\n\n  (0, _createClass3.default)(SubmissionsService, [{\n    key: 'getSubmissions',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(challengeId) {\n        var url;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                url = '/v5/submissions?challengeId=' + challengeId;\n                return _context.abrupt('return', this.private.broker.get(url).then(function (res) {\n                  return res.ok ? res.json() : new Error(res.statusText);\n                }));\n\n              case 2:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getSubmissions(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getSubmissions;\n    }()\n\n    /**\n     * Get submission information by submission id\n     * @param submissionId The submission id\n     * @returns {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getSubmissionInformation',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(submissionId) {\n        var url;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                url = '/v5/submissions/' + submissionId;\n                return _context2.abrupt('return', this.private.broker.get(url).then(function (res) {\n                  return res.ok ? res.json() : new Error(res.statusText);\n                }));\n\n              case 2:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getSubmissionInformation(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getSubmissionInformation;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return SubmissionsService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing submissions service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {SubmissionsService} Submissions service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new SubmissionsService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(SubmissionsService, 'SubmissionsService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/submissions.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/submissions.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/submissions.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/submissions.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/submissions.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _qs = __webpack_require__(/*! qs */ \"qs\");\n\nvar _qs2 = _interopRequireDefault(_qs);\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.submission\"\n    * @desc This module provides a service for convenient manipulation with\n    *  Topcoder submissions via TC API. Currently only used for MM challenges\n    */\n\n\n/**\n * Submission service.\n */\nvar SubmissionsService = function () {\n  /**\n   * Creates a new SubmissionService instance.\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function SubmissionsService(tokenV3) {\n    (0, _classCallCheck3.default)(this, SubmissionsService);\n\n    this.private = {\n      apiV5: (0, _api.getApi)('V5', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Get submissions of challenge\n   * @param {Object} filters\n   * @param {Object} params\n   * @return {Promise} Resolves to the api response.\n   */\n\n\n  (0, _createClass3.default)(SubmissionsService, [{\n    key: 'getSubmissions',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(filters, params) {\n        var query, url;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                query = (0, _extends3.default)({}, filters, params);\n                url = '/submissions?' + _qs2.default.stringify(query, { encode: false });\n                return _context.abrupt('return', this.private.apiV5.get(url).then(function (res) {\n                  return res.ok ? res.json() : new Error(res.statusText);\n                }).then(function (res) {\n                  return res;\n                }));\n\n              case 3:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getSubmissions(_x, _x2) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getSubmissions;\n    }()\n\n    /**\n     * Get submission information by submission id\n     * @param submissionId The submission id\n     * @returns {Promise} Resolves to the api response.\n     */\n\n  }, {\n    key: 'getSubmissionInformation',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(submissionId) {\n        var url;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                url = '/submissions/' + submissionId;\n                return _context2.abrupt('return', this.private.apiV5.get(url).then(function (res) {\n                  return res.ok ? res.json() : new Error(res.statusText);\n                }).then(function (res) {\n                  return res;\n                }));\n\n              case 2:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getSubmissionInformation(_x3) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getSubmissionInformation;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return SubmissionsService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing submissions service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {SubmissionsService} Submissions service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new SubmissionsService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(SubmissionsService, 'SubmissionsService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/submissions.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/submissions.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/submissions.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/submissions.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/submissions.js?");
 
 /***/ }),
 
@@ -1030,7 +1030,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _communities = __webpack_require__(/*! ./communities */ \"./src/services/communities.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.terms\"\n    * @desc This module provides a service for convenient manipulation with\n    * Topcoder challenges' terms via TC API.\n    */\n\n/**\n * Service class.\n */\nvar TermsService = function () {\n  /**\n   * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n   */\n  function TermsService(tokenV2) {\n    (0, _classCallCheck3.default)(this, TermsService);\n\n    this.private = {\n      api: (0, _api.getApi)('V2', tokenV2),\n      tokenV2: tokenV2\n    };\n  }\n\n  /**\n   * get all terms of specified challenge\n   * @param  {Number|String} challengeId id of the challenge\n   * @return {Promise}       promise of the request result\n   */\n\n\n  (0, _createClass3.default)(TermsService, [{\n    key: 'getChallengeTerms',\n    value: function getChallengeTerms(challengeId) {\n      var _this = this;\n\n      if (this.private.tokenV2) {\n        var registered = false;\n        return this.private.api.get('/terms/' + challengeId + '?role=Submitter').then(function (res) {\n          return res.json();\n        }).then(function (res) {\n          if (res.error) {\n            if (res.error.details === 'You are already registered for this challenge.') {\n              registered = true;\n            }\n            return _this.private.api.get('/terms/' + challengeId + '?role=Submitter&noauth=true').then(function (resp) {\n              if (resp.ok) {\n                return resp.json().then(function (result) {\n                  if (registered) {\n                    // eslint-disable-next-line no-param-reassign\n                    _lodash2.default.forEach(result.terms, function (t) {\n                      t.agreed = true;\n                    });\n                  }\n                  return result;\n                });\n              }\n              return new Error(resp.statusText);\n            });\n          }\n          return res;\n        });\n      }\n      return this.private.api.get('/terms/' + challengeId + '?role=Submitter&noauth=true').then(function (resp) {\n        if (resp.ok) {\n          return resp.json();\n        }\n        throw new Error(resp.statusText);\n      });\n    }\n\n    /**\n     * get all terms for community\n     *\n     * NOTE: As there is no specific endpoint to get community terms by one call\n     *       currently we get community term ids from community service and after\n     *       we get community terms using term ids list one by one\n     *\n     * @param {String} communityId community id\n     * @param {String} tokenV3     auth token V3 - we need to get community meta data\n     *\n     * @return {Promise} resolves to the list of community terms\n     */\n\n  }, {\n    key: 'getCommunityTerms',\n    value: function getCommunityTerms(communityId, tokenV3) {\n      var _this2 = this;\n\n      var communityService = (0, _communities.getService)(tokenV3);\n\n      return communityService.getMetadata(communityId).then(function (meta) {\n        if (meta.terms && meta.terms.length) {\n          return _promise2.default.all(meta.terms.map(function (termId) {\n            return _this2.getTermDetails(termId);\n          })).then(function (terms) {\n            return terms.map(function (term) {\n              return _lodash2.default.omit(term, 'text');\n            }) // don't include text as it's big and we need it for list\n            ;\n          });\n        }\n\n        return [];\n      }).then(function (terms) {\n        return {\n          terms: terms\n        };\n      });\n    }\n\n    /**\n     * Get the terms for Review Opportunities.  This will ensure that the\n     * provided terms have all the necessary fields by getting anything missing\n     * from the terms details endpoint\n     *\n     * @param {Object} requiredTerms Required terms for review opportunity\n     *\n     * @return {Promise} resolves to the list of validated terms\n     */\n\n  }, {\n    key: 'getReviewOpportunityTerms',\n    value: function getReviewOpportunityTerms(requiredTerms) {\n      var _this3 = this;\n\n      var promises = requiredTerms.map(function (term) {\n        // Agreed field is present, all the necessary information is present for this term, but will\n        // need to verify if agreed is false as user may have agreed to terms after data was loaded\n        if (term.agreed) {\n          return _promise2.default.resolve(term);\n        }\n        // Otherwise grab new details from terms api\n        return _this3.getTermDetails(term.termsOfUseId).then(function (res) {\n          return _lodash2.default.pick(res, ['termsOfUseId', 'agreed', 'title']);\n        });\n      });\n\n      return _promise2.default.all(promises).then(function (terms) {\n        return { terms: terms };\n      });\n    }\n\n    /**\n     * get details of specified term\n     * @param  {Number|String} termId id of the term\n     * @return {Promise}       promise of the request result\n     */\n\n  }, {\n    key: 'getTermDetails',\n    value: function getTermDetails(termId) {\n      // looks like server cache responses, to prevent it we add nocache param with always new value\n      var nocache = new Date().getTime();\n      return this.private.api.get('/terms/detail/' + termId + '?nocache=' + nocache).then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(res.json());\n      });\n    }\n\n    /**\n     * generate the url of DocuSign term\n     * @param  {Number|String} templateId id of the term's template\n     * @param  {String}        returnUrl  callback url after finishing signing\n     * @return {Promise}       promise of the request result\n     */\n\n  }, {\n    key: 'getDocuSignUrl',\n    value: function getDocuSignUrl(templateId, returnUrl) {\n      return this.private.api.post('/terms/docusign/viewURL?templateId=' + templateId + '&returnUrl=' + returnUrl).then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(res.json());\n      });\n    }\n\n    /**\n     * Agree a term\n     * @param  {Number|String} termId id of the term\n     * @return {Promise}       promise of the request result\n     */\n\n  }, {\n    key: 'agreeTerm',\n    value: function agreeTerm(termId) {\n      return this.private.api.post('/terms/' + termId + '/agree').then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(res.json());\n      });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return TermsService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing terms service.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n * @return {TermsService} Terms service object\n */\nfunction getService(tokenV2) {\n  /* Because of Topcoder backend restrictions, it is not straightforward to test\n   * terms-related functionality in any other way than just providing an option\n   * to run the app against mock terms service. */\n  if (_topcoderReactUtils.config.MOCK_TERMS_SERVICE) {\n    /* eslint-disable global-require */\n    return __webpack_require__(/*! ./__mocks__/terms */ \"./src/services/__mocks__/terms.js\").getService(tokenV2);\n    /* eslint-enable global-require */\n  }\n  if (!lastInstance || tokenV2 && lastInstance.private.tokenV2 !== tokenV2) {\n    lastInstance = new TermsService(tokenV2);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(TermsService, 'TermsService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/terms.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/terms.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/terms.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/terms.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _communities = __webpack_require__(/*! ./communities */ \"./src/services/communities.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.terms\"\n    * @desc This module provides a service for convenient manipulation with\n    * Topcoder challenges' terms via TC API.\n    */\n\n/**\n * Service class.\n */\nvar TermsService = function () {\n  /**\n   * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n   */\n  function TermsService(tokenV2) {\n    (0, _classCallCheck3.default)(this, TermsService);\n\n    this.private = {\n      api: (0, _api.getApi)('V2', tokenV2),\n      tokenV2: tokenV2\n    };\n  }\n\n  /**\n   * get all terms of specified challenge\n   * @param  {Number|String} challengeId id of the challenge\n   * @return {Promise}       promise of the request result\n   */\n\n\n  (0, _createClass3.default)(TermsService, [{\n    key: 'getChallengeTerms',\n    value: function getChallengeTerms(challengeId) {\n      var _this = this;\n\n      if (this.private.tokenV2) {\n        var registered = false;\n        return this.private.api.get('/terms/' + challengeId + '?role=Submitter').then(function (res) {\n          return res.json();\n        }).then(function (res) {\n          if (res.error) {\n            if (res.error.details === 'You are already registered for this challenge.') {\n              registered = true;\n            }\n            return _this.private.api.get('/terms/' + challengeId + '?role=Submitter&noauth=true').then(function (resp) {\n              if (resp.ok) {\n                return resp.json().then(function (result) {\n                  if (registered) {\n                    // eslint-disable-next-line no-param-reassign\n                    _lodash2.default.forEach(result.terms, function (t) {\n                      t.agreed = true;\n                    });\n                  }\n                  return result;\n                });\n              }\n              return new Error(resp.statusText);\n            });\n          }\n          return res;\n        });\n      }\n      return this.private.api.get('/terms/' + challengeId + '?role=Submitter&noauth=true').then(function (resp) {\n        if (resp.ok) {\n          return resp.json();\n        }\n        throw new Error(resp.statusText);\n      });\n    }\n\n    /**\n     * get all terms for community\n     *\n     * NOTE: As there is no specific endpoint to get community terms by one call\n     *       currently we get community term ids from community service and after\n     *       we get community terms using term ids list one by one\n     *\n     * @param {String} communityId community id\n     * @param {String} tokenV3     auth token V3 - we need to get community meta data\n     *\n     * @return {Promise} resolves to the list of community terms\n     */\n\n  }, {\n    key: 'getCommunityTerms',\n    value: function getCommunityTerms(communityId, tokenV3) {\n      var _this2 = this;\n\n      var communityService = (0, _communities.getService)(tokenV3);\n\n      return communityService.getMetadata(communityId).then(function (meta) {\n        if (meta.terms && meta.terms.length) {\n          return _promise2.default.all(meta.terms.map(function (termId) {\n            return _this2.getTermDetails(termId);\n          })).then(function (terms) {\n            return terms.map(function (term) {\n              return _lodash2.default.omit(term, 'text');\n            }) // don't include text as it's big and we need it for list\n            ;\n          });\n        }\n\n        return [];\n      }).then(function (terms) {\n        return {\n          terms: terms\n        };\n      });\n    }\n\n    /**\n     * Get the terms for Review Opportunities.  This will ensure that the\n     * provided terms have all the necessary fields by getting anything missing\n     * from the terms details endpoint\n     *\n     * @param {Object} requiredTerms Required terms for review opportunity\n     *\n     * @return {Promise} resolves to the list of validated terms\n     */\n\n  }, {\n    key: 'getReviewOpportunityTerms',\n    value: function getReviewOpportunityTerms(requiredTerms) {\n      var _this3 = this;\n\n      var promises = requiredTerms.map(function (term) {\n        // Agreed field is present, all the necessary information is present for this term, but will\n        // need to verify if agreed is false as user may have agreed to terms after data was loaded\n        if (term.agreed) {\n          return _promise2.default.resolve(term);\n        }\n        // Otherwise grab new details from terms api\n        return _this3.getTermDetails(term.termsOfUseId).then(function (res) {\n          return _lodash2.default.pick(res, ['termsOfUseId', 'agreed', 'title']);\n        });\n      });\n\n      return _promise2.default.all(promises).then(function (terms) {\n        return { terms: terms };\n      });\n    }\n\n    /**\n     * get details of specified term\n     * @param  {Number|String} termId id of the term\n     * @return {Promise}       promise of the request result\n     */\n\n  }, {\n    key: 'getTermDetails',\n    value: function getTermDetails(termId) {\n      // looks like server cache responses, to prevent it we add nocache param with always new value\n      var nocache = new Date().getTime();\n      return this.private.api.get('/terms/detail/' + termId + '?nocache=' + nocache).then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(res.json());\n      });\n    }\n\n    /**\n     * generate the url of DocuSign term\n     * @param  {Number|String} templateId id of the term's template\n     * @param  {String}        returnUrl  callback url after finishing signing\n     * @return {Promise}       promise of the request result\n     */\n\n  }, {\n    key: 'getDocuSignUrl',\n    value: function getDocuSignUrl(templateId, returnUrl) {\n      return this.private.api.post('/terms/docusign/viewURL?templateId=' + templateId + '&returnUrl=' + returnUrl).then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(res.json());\n      });\n    }\n\n    /**\n     * Agree a term\n     * @param  {Number|String} termId id of the term\n     * @return {Promise}       promise of the request result\n     */\n\n  }, {\n    key: 'agreeTerm',\n    value: function agreeTerm(termId) {\n      return this.private.api.post('/terms/' + termId + '/agree').then(function (res) {\n        return res.ok ? res.json() : _promise2.default.reject(res.json());\n      });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return TermsService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing terms service.\n * @param {String} tokenV2 Optional. Auth token for Topcoder API v2.\n * @return {TermsService} Terms service object\n */\nfunction getService(tokenV2) {\n  /* Because of Topcoder backend restrictions, it is not straightforward to test\n   * terms-related functionality in any other way than just providing an option\n   * to run the app against mock terms service. */\n  if (_topcoderReactUtils.config.MOCK_TERMS_SERVICE) {\n    /* eslint-disable global-require */\n    return __webpack_require__(/*! ./__mocks__/terms */ \"./src/services/__mocks__/terms.js\").getService(tokenV2);\n    /* eslint-enable global-require */\n  }\n  if (!lastInstance || tokenV2 && lastInstance.private.tokenV2 !== tokenV2) {\n    lastInstance = new TermsService(tokenV2);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(TermsService, 'TermsService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/terms.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/terms.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/terms.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/terms.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/terms.js?");
 
 /***/ }),
 
@@ -1042,7 +1042,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getUserSettingsService = getUserSettingsService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar _api2 = _interopRequireDefault(_api);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.user-settings\"\n    * @desc User Settings service. Corresponding part of the backend is\n    * implemented as a separate Heroku App, which is set up only for prod.\n    * Currently, we use it to save user-defined filters in the challenge search.\n    */\n\n/**\n * @static\n * @member default\n * @desc Default export is {@link module:services.user-settings~UserSettings}\n *  class.\n */\n\n/**\n * Service class.\n */\nvar UserSettings = function () {\n  /**\n   * @param {String} tokenV2\n   */\n  function UserSettings(tokenV2) {\n    (0, _classCallCheck3.default)(this, UserSettings);\n\n    this.private = {\n      api: new _api2.default(_topcoderReactUtils.config.URL.USER_SETTINGS, tokenV2),\n      token: tokenV2\n    };\n  }\n\n  /**\n   * Removes the filter specified by ID.\n   * @param {String} id\n   * @return {Promise}\n   */\n\n\n  (0, _createClass3.default)(UserSettings, [{\n    key: 'deleteFilter',\n    value: function deleteFilter(id) {\n      return this.private.api.delete('/saved-searches/' + id).then(function (res) {\n        return res.ok ? null : new Error(res.statusText);\n      });\n    }\n\n    /**\n     * Gets saved filters.\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'getFilters',\n    value: function getFilters() {\n      return this.private.api.get('/saved-searches').then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      }).then(function (res) {\n        return res.map(function (item) {\n          /* NOTE: Previous version of the challenge listing saved filter in\n           * different format (like an URL query string). This try/catch block\n           * effectively differentiate between the old (unsupported) and new\n           * format of the filters. */\n          var filter = void 0;\n          try {\n            filter = JSON.parse(item.filter);\n          } catch (e) {\n            _lodash2.default.noop();\n          }\n          return (0, _extends3.default)({}, item, { filter: filter });\n        });\n      }).then(function (res) {\n        return res.filter(function (item) {\n          return item.filter;\n        });\n      });\n    }\n\n    /**\n     * Saves filter.\n     * @param {String} name\n     * @param {Object} filter\n     */\n\n  }, {\n    key: 'saveFilter',\n    value: function saveFilter(name, filter) {\n      return this.private.api.postJson('/saved-searches', {\n        filter: (0, _stringify2.default)(filter),\n        name: name,\n        type: 'develop'\n      }).then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      });\n    }\n\n    /**\n     * Updates filter.\n     * @param {String} id\n     * @param {String} name\n     * @param {Object} filter\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'updateFilter',\n    value: function updateFilter(id, name, filter) {\n      return this.private.api.putJson('/saved-searches/' + id, {\n        filter: (0, _stringify2.default)(filter),\n        name: name,\n        type: 'develop'\n      }).then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return UserSettings;\n}();\n\nvar lastUserSettings = null;\n\n/**\n * Returns a new or existing instance of UserSettings service.\n * @param {String} tokenV2 Topcoder auth token v2.\n * @return {UserSettings}\n */\nfunction getUserSettingsService(tokenV2) {\n  if (!lastUserSettings || lastUserSettings.private.token !== tokenV2) {\n    lastUserSettings = new UserSettings(tokenV2);\n  }\n  return lastUserSettings;\n}\n\nvar _default = UserSettings;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(UserSettings, 'UserSettings', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-settings.js');\n  reactHotLoader.register(lastUserSettings, 'lastUserSettings', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-settings.js');\n  reactHotLoader.register(getUserSettingsService, 'getUserSettingsService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-settings.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-settings.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/user-settings.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getUserSettingsService = getUserSettingsService;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nvar _api2 = _interopRequireDefault(_api);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.user-settings\"\n    * @desc User Settings service. Corresponding part of the backend is\n    * implemented as a separate Heroku App, which is set up only for prod.\n    * Currently, we use it to save user-defined filters in the challenge search.\n    */\n\n/**\n * @static\n * @member default\n * @desc Default export is {@link module:services.user-settings~UserSettings}\n *  class.\n */\n\n/**\n * Service class.\n */\nvar UserSettings = function () {\n  /**\n   * @param {String} tokenV2\n   */\n  function UserSettings(tokenV2) {\n    (0, _classCallCheck3.default)(this, UserSettings);\n\n    this.private = {\n      api: new _api2.default(_topcoderReactUtils.config.URL.USER_SETTINGS, tokenV2),\n      token: tokenV2\n    };\n  }\n\n  /**\n   * Removes the filter specified by ID.\n   * @param {String} id\n   * @return {Promise}\n   */\n\n\n  (0, _createClass3.default)(UserSettings, [{\n    key: 'deleteFilter',\n    value: function deleteFilter(id) {\n      return this.private.api.delete('/saved-searches/' + id).then(function (res) {\n        return res.ok ? null : new Error(res.statusText);\n      });\n    }\n\n    /**\n     * Gets saved filters.\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'getFilters',\n    value: function getFilters() {\n      return this.private.api.get('/saved-searches').then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      }).then(function (res) {\n        return res.map(function (item) {\n          /* NOTE: Previous version of the challenge listing saved filter in\n           * different format (like an URL query string). This try/catch block\n           * effectively differentiate between the old (unsupported) and new\n           * format of the filters. */\n          var filter = void 0;\n          try {\n            filter = JSON.parse(item.filter);\n          } catch (e) {\n            _lodash2.default.noop();\n          }\n          return (0, _extends3.default)({}, item, { filter: filter });\n        });\n      }).then(function (res) {\n        return res.filter(function (item) {\n          return item.filter;\n        });\n      });\n    }\n\n    /**\n     * Saves filter.\n     * @param {String} name\n     * @param {Object} filter\n     */\n\n  }, {\n    key: 'saveFilter',\n    value: function saveFilter(name, filter) {\n      return this.private.api.postJson('/saved-searches', {\n        filter: (0, _stringify2.default)(filter),\n        name: name,\n        type: 'develop'\n      }).then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      });\n    }\n\n    /**\n     * Updates filter.\n     * @param {String} id\n     * @param {String} name\n     * @param {Object} filter\n     * @return {Promise}\n     */\n\n  }, {\n    key: 'updateFilter',\n    value: function updateFilter(id, name, filter) {\n      return this.private.api.putJson('/saved-searches/' + id, {\n        filter: (0, _stringify2.default)(filter),\n        name: name,\n        type: 'develop'\n      }).then(function (res) {\n        return res.ok ? res.json() : new Error(res.statusText);\n      });\n    }\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return UserSettings;\n}();\n\nvar lastUserSettings = null;\n\n/**\n * Returns a new or existing instance of UserSettings service.\n * @param {String} tokenV2 Topcoder auth token v2.\n * @return {UserSettings}\n */\nfunction getUserSettingsService(tokenV2) {\n  if (!lastUserSettings || lastUserSettings.private.token !== tokenV2) {\n    lastUserSettings = new UserSettings(tokenV2);\n  }\n  return lastUserSettings;\n}\n\nvar _default = UserSettings;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(UserSettings, 'UserSettings', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-settings.js');\n  reactHotLoader.register(lastUserSettings, 'lastUserSettings', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-settings.js');\n  reactHotLoader.register(getUserSettingsService, 'getUserSettingsService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-settings.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-settings.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/user-settings.js?");
 
 /***/ }),
 
@@ -1054,7 +1054,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _toCapitalCase = __webpack_require__(/*! to-capital-case */ \"to-capital-case\");\n\nvar _toCapitalCase2 = _interopRequireDefault(_toCapitalCase);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.userTraits\"\n    * @desc  This module provides a service for user traits crud\n    * via API V3.\n    */\n\n\n/**\n * Service class.\n */\nvar UserTraitsService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function UserTraitsService(tokenV3) {\n    (0, _classCallCheck3.default)(this, UserTraitsService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Get member's all traits.\n   * @param {String} handle User handle.\n   * @return {Promise} Resolves to the member traits.\n   */\n\n\n  (0, _createClass3.default)(UserTraitsService, [{\n    key: 'getAllUserTraits',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/members/' + handle.toLowerCase() + '/traits');\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getAllUserTraits(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getAllUserTraits;\n    }()\n\n    /**\n     * Add member's trait.\n     * @param {String} handle User handle.\n     * @param {String} traitId Trait Id.\n     * @param {Array} data Trait data.\n     * @return {Promise} Resolves to the member traits.\n     */\n\n  }, {\n    key: 'addUserTrait',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle, traitId, data) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                body = {\n                  param: [{\n                    traitId: traitId,\n                    categoryName: (0, _toCapitalCase2.default)(traitId),\n                    traits: {\n                      data: data\n                    }\n                  }]\n                };\n                _context2.next = 3;\n                return this.private.api.postJson('/members/' + handle + '/traits', body);\n\n              case 3:\n                res = _context2.sent;\n                return _context2.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function addUserTrait(_x2, _x3, _x4) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return addUserTrait;\n    }()\n\n    /**\n     * Update member's trait.\n     * @param {String} handle User handle.\n     * @param {String} traitId Trait Id.\n     * @param {Array} data Trait data.\n     * @return {Promise} Resolves to the member traits.\n     */\n\n  }, {\n    key: 'updateUserTrait',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle, traitId, data) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                body = {\n                  param: [{\n                    traitId: traitId,\n                    categoryName: (0, _toCapitalCase2.default)(traitId),\n                    traits: {\n                      data: data\n                    }\n                  }]\n                };\n                _context3.next = 3;\n                return this.private.api.putJson('/members/' + handle + '/traits', body);\n\n              case 3:\n                res = _context3.sent;\n                return _context3.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function updateUserTrait(_x5, _x6, _x7) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return updateUserTrait;\n    }()\n\n    /**\n     * Delete member's trait.\n     * @param {String} handle User handle.\n     * @param {String} traitId Trait Id.\n     * @return {Promise} Resolves to the member traits.\n     */\n\n  }, {\n    key: 'deleteUserTrait',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle, traitId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                _context4.next = 2;\n                return this.private.api.delete('/members/' + handle + '/traits?traitIds=' + traitId);\n\n              case 2:\n                res = _context4.sent;\n                return _context4.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function deleteUserTrait(_x8, _x9) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return deleteUserTrait;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return UserTraitsService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing user trait service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {UserTraitsService} userTraits service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new UserTraitsService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(UserTraitsService, 'UserTraitsService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-traits.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-traits.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-traits.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user-traits.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/user-traits.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nexports.getService = getService;\n\nvar _toCapitalCase = __webpack_require__(/*! to-capital-case */ \"to-capital-case\");\n\nvar _toCapitalCase2 = _interopRequireDefault(_toCapitalCase);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.userTraits\"\n    * @desc  This module provides a service for user traits crud\n    * via API V3.\n    */\n\n\n/**\n * Service class.\n */\nvar UserTraitsService = function () {\n  /**\n   * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n   */\n  function UserTraitsService(tokenV3) {\n    (0, _classCallCheck3.default)(this, UserTraitsService);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Get member's all traits.\n   * @param {String} handle User handle.\n   * @return {Promise} Resolves to the member traits.\n   */\n\n\n  (0, _createClass3.default)(UserTraitsService, [{\n    key: 'getAllUserTraits',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(handle) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.api.get('/members/' + handle.toLowerCase() + '/traits');\n\n              case 2:\n                res = _context.sent;\n                return _context.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getAllUserTraits(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getAllUserTraits;\n    }()\n\n    /**\n     * Add member's trait.\n     * @param {String} handle User handle.\n     * @param {String} traitId Trait Id.\n     * @param {Array} data Trait data.\n     * @return {Promise} Resolves to the member traits.\n     */\n\n  }, {\n    key: 'addUserTrait',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(handle, traitId, data) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                body = {\n                  param: [{\n                    traitId: traitId,\n                    categoryName: (0, _toCapitalCase2.default)(traitId),\n                    traits: {\n                      data: data\n                    }\n                  }]\n                };\n                _context2.next = 3;\n                return this.private.api.postJson('/members/' + handle + '/traits', body);\n\n              case 3:\n                res = _context2.sent;\n                return _context2.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function addUserTrait(_x2, _x3, _x4) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return addUserTrait;\n    }()\n\n    /**\n     * Update member's trait.\n     * @param {String} handle User handle.\n     * @param {String} traitId Trait Id.\n     * @param {Array} data Trait data.\n     * @return {Promise} Resolves to the member traits.\n     */\n\n  }, {\n    key: 'updateUserTrait',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(handle, traitId, data) {\n        var body, res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                body = {\n                  param: [{\n                    traitId: traitId,\n                    categoryName: (0, _toCapitalCase2.default)(traitId),\n                    traits: {\n                      data: data\n                    }\n                  }]\n                };\n                _context3.next = 3;\n                return this.private.api.putJson('/members/' + handle + '/traits', body);\n\n              case 3:\n                res = _context3.sent;\n                return _context3.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function updateUserTrait(_x5, _x6, _x7) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return updateUserTrait;\n    }()\n\n    /**\n     * Delete member's trait.\n     * @param {String} handle User handle.\n     * @param {String} traitId Trait Id.\n     * @return {Promise} Resolves to the member traits.\n     */\n\n  }, {\n    key: 'deleteUserTrait',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(handle, traitId) {\n        var res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                _context4.next = 2;\n                return this.private.api.delete('/members/' + handle + '/traits?traitIds=' + traitId);\n\n              case 2:\n                res = _context4.sent;\n                return _context4.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function deleteUserTrait(_x8, _x9) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return deleteUserTrait;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return UserTraitsService;\n}();\n\nvar lastInstance = null;\n/**\n * Returns a new or existing user trait service.\n * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.\n * @return {UserTraitsService} userTraits service object\n */\nfunction getService(tokenV3) {\n  if (!lastInstance || tokenV3 !== lastInstance.private.tokenV3) {\n    lastInstance = new UserTraitsService(tokenV3);\n  }\n  return lastInstance;\n}\n\n/* Using default export would be confusing in this case. */\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(UserTraitsService, 'UserTraitsService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-traits.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-traits.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-traits.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user-traits.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/user-traits.js?");
 
 /***/ }),
 
@@ -1066,7 +1066,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nexports.getService = getService;\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.user\"\n    * @desc The User service provides functionality related to Topcoder user\n    *  accounts.\n    */\n\n\nvar auth0 = void 0;\n\n/**\n * Returns a new, or cached auth0 instance.\n * @return {Object} Auth0 object.\n */\nfunction getAuth0() {\n  if (!auth0 && _topcoderReactUtils.isomorphy.isClientSide()) {\n    var Auth0 = __webpack_require__(/*! auth0-js */ \"./node_modules/auth0-js/index.js\"); /* eslint-disable-line global-require */\n    auth0 = new Auth0({\n      domain: _topcoderReactUtils.config.AUTH0.DOMAIN,\n      clientID: _topcoderReactUtils.config.AUTH0.CLIENT_ID,\n      callbackOnLocationHash: true,\n      sso: false\n    });\n  }\n  return auth0;\n}\n\n/**\n * Gets social user data.\n * @param {Object} profile The user social profile\n * @param {*} accessToken The access token\n * @returns {Object} Social user data\n */\nfunction getSocialUserData(profile, accessToken) {\n  var socialProvider = profile.identities[0].connection;\n  var firstName = '';\n  var lastName = '';\n  var handle = '';\n  var email = profile.email || '';\n\n  var socialUserId = profile.user_id.substring(profile.user_id.lastIndexOf('|') + 1);\n  var splitName = void 0;\n\n  if (socialProvider === 'google-oauth2') {\n    firstName = profile.given_name;\n    lastName = profile.family_name;\n    handle = profile.nickname;\n  } else if (socialProvider === 'facebook') {\n    firstName = profile.given_name;\n    lastName = profile.family_name;\n    handle = firstName + '.' + lastName;\n  } else if (socialProvider === 'twitter') {\n    splitName = profile.name.split(' ');\n    var _splitName = splitName;\n\n    var _splitName2 = (0, _slicedToArray3.default)(_splitName, 1);\n\n    firstName = _splitName2[0];\n\n    if (splitName.length > 1) {\n      var _splitName3 = splitName;\n\n      var _splitName4 = (0, _slicedToArray3.default)(_splitName3, 2);\n\n      lastName = _splitName4[1];\n    }\n    handle = profile.screen_name;\n  } else if (socialProvider === 'github') {\n    splitName = profile.name.split(' ');\n    var _splitName5 = splitName;\n\n    var _splitName6 = (0, _slicedToArray3.default)(_splitName5, 1);\n\n    firstName = _splitName6[0];\n\n    if (splitName.length > 1) {\n      var _splitName7 = splitName;\n\n      var _splitName8 = (0, _slicedToArray3.default)(_splitName7, 2);\n\n      lastName = _splitName8[1];\n    }\n    handle = profile.nickname;\n  } else if (socialProvider === 'bitbucket') {\n    firstName = profile.first_name;\n    lastName = profile.last_name;\n    handle = profile.username;\n  } else if (socialProvider === 'stackoverflow') {\n    firstName = profile.first_name;\n    lastName = profile.last_name;\n    handle = socialUserId;\n  } else if (socialProvider === 'dribbble') {\n    firstName = profile.first_name;\n    lastName = profile.last_name;\n    handle = socialUserId;\n  }\n\n  var token = accessToken;\n  var tokenSecret = null;\n  if (profile.identities[0].access_token) {\n    token = profile.identities[0].access_token;\n  }\n  if (profile.identities[0].access_token_secret) {\n    tokenSecret = profile.identities[0].access_token_secret;\n  }\n  return {\n    socialUserId: socialUserId,\n    username: handle,\n    firstname: firstName,\n    lastname: lastName,\n    email: email,\n    socialProfile: profile,\n    socialProvider: socialProvider,\n    accessToken: token,\n    accessTokenSecret: tokenSecret\n  };\n}\n\n/**\n * Service class.\n */\n\nvar User = function () {\n  /**\n   * Creates a new User service.\n   * @param {String} tokenV3 Topcoder auth tokenV3.\n   * @param {String} tokenV2 TC auth token v2.\n   */\n  function User(tokenV3, tokenV2) {\n    (0, _classCallCheck3.default)(this, User);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      apiV2: (0, _api.getApi)('V2', tokenV2),\n      tokenV2: tokenV2,\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets user achievements. Does not need auth.\n   * @param {String} username\n   * @return {Object}\n   */\n\n\n  (0, _createClass3.default)(User, [{\n    key: 'getAchievements',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(username) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.apiV2.get('/users/' + username);\n\n              case 2:\n                res = _context.sent;\n\n                if (res.ok) {\n                  _context.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                _context.next = 7;\n                return res.json();\n\n              case 7:\n                _context.t0 = _context.sent.Achievements;\n\n                if (_context.t0) {\n                  _context.next = 10;\n                  break;\n                }\n\n                _context.t0 = [];\n\n              case 10:\n                return _context.abrupt('return', _context.t0);\n\n              case 11:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getAchievements(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getAchievements;\n    }()\n\n    /**\n     * Gets public user info. Does not need auth.\n     * @param {String} username\n     * @return {Object}\n     */\n\n  }, {\n    key: 'getUserPublic',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(username) {\n        var res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.private.apiV2.get('/users/' + username);\n\n              case 2:\n                res = _context2.sent;\n\n                if (res.ok) {\n                  _context2.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                return _context2.abrupt('return', res.json() || null);\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getUserPublic(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getUserPublic;\n    }()\n\n    /**\n     * Gets public user info from v3 API. Does not need auth.\n     * @param {String} username\n     * @return {Object}\n     */\n\n  }, {\n    key: 'getUserPublicV3',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(username) {\n        var res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.api.get('/members/' + username);\n\n              case 2:\n                res = _context3.sent;\n                return _context3.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getUserPublicV3(_x3) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getUserPublicV3;\n    }()\n\n    /**\n     * Gets user data object for the specified username.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {String} username\n     * @return {Promise} Resolves to the user data object.\n     */\n\n  }, {\n    key: 'getUser',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(username) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                url = '/users?filter=handle%3D' + username;\n                _context4.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context4.sent;\n                _context4.next = 6;\n                return (0, _tc.getApiResponsePayload)(res);\n\n              case 6:\n                return _context4.abrupt('return', _context4.sent[0]);\n\n              case 7:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function getUser(_x4) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return getUser;\n    }()\n\n    /**\n     * Gets email preferences.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The TopCoder user id\n     * @returns {Promise} Resolves to the email preferences result\n     */\n\n  }, {\n    key: 'getEmailPreferences',\n    value: function () {\n      var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(userId) {\n        var url, res, x;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                url = '/users/' + userId + '/preferences/email';\n                _context5.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context5.sent;\n                _context5.next = 6;\n                return res.json();\n\n              case 6:\n                x = _context5.sent.result;\n                return _context5.abrupt('return', x.content);\n\n              case 8:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function getEmailPreferences(_x5) {\n        return _ref5.apply(this, arguments);\n      }\n\n      return getEmailPreferences;\n    }()\n\n    /**\n     * Saves email preferences.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Object} user The TopCoder user\n     * @param {Object} preferences The email preferences\n     * @returns {Promise} Resolves to the email preferences result\n     */\n\n  }, {\n    key: 'saveEmailPreferences',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(_ref7, preferences) {\n        var firstName = _ref7.firstName,\n            lastName = _ref7.lastName,\n            userId = _ref7.userId;\n        var settings, url, res;\n        return _regenerator2.default.wrap(function _callee6$(_context6) {\n          while (1) {\n            switch (_context6.prev = _context6.next) {\n              case 0:\n                settings = {\n                  firstName: firstName,\n                  lastName: lastName,\n                  subscriptions: {}\n                };\n\n\n                if (!preferences) {\n                  settings.subscriptions.TOPCODER_NL_GEN = true;\n                } else {\n                  settings.subscriptions = preferences;\n                }\n                url = '/users/' + userId + '/preferences/email';\n                _context6.next = 5;\n                return this.private.api.putJson(url, { param: settings });\n\n              case 5:\n                res = _context6.sent;\n                return _context6.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 7:\n              case 'end':\n                return _context6.stop();\n            }\n          }\n        }, _callee6, this);\n      }));\n\n      function saveEmailPreferences(_x6, _x7) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return saveEmailPreferences;\n    }()\n\n    /**\n     * Gets credential for the specified user id.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The user id\n     * @return {Promise} Resolves to the linked accounts array.\n     */\n\n  }, {\n    key: 'getCredential',\n    value: function () {\n      var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(userId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee7$(_context7) {\n          while (1) {\n            switch (_context7.prev = _context7.next) {\n              case 0:\n                url = '/users/' + userId + '?fields=credential';\n                _context7.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context7.sent;\n                return _context7.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context7.stop();\n            }\n          }\n        }, _callee7, this);\n      }));\n\n      function getCredential(_x8) {\n        return _ref8.apply(this, arguments);\n      }\n\n      return getCredential;\n    }()\n\n    /**\n     * Updates user password.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The user id\n     * @param {String} newPassword The new password\n     * @param {String} oldPassword The old password\n     * @return {Promise} Resolves to the update result.\n     */\n\n  }, {\n    key: 'updatePassword',\n    value: function () {\n      var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(userId, newPassword, oldPassword) {\n        var credential, url, res;\n        return _regenerator2.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                credential = {\n                  password: newPassword,\n                  currentPassword: oldPassword\n                };\n                url = '/users/' + userId;\n                _context8.next = 4;\n                return this.private.api.patchJson(url, { param: { credential: credential } });\n\n              case 4:\n                res = _context8.sent;\n                return _context8.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 6:\n              case 'end':\n                return _context8.stop();\n            }\n          }\n        }, _callee8, this);\n      }));\n\n      function updatePassword(_x9, _x10, _x11) {\n        return _ref9.apply(this, arguments);\n      }\n\n      return updatePassword;\n    }()\n\n    /**\n     * Gets linked accounts for the specified user id.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The user id\n     * @return {Promise} Resolves to the linked accounts array.\n     */\n\n  }, {\n    key: 'getLinkedAccounts',\n    value: function () {\n      var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(userId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee9$(_context9) {\n          while (1) {\n            switch (_context9.prev = _context9.next) {\n              case 0:\n                url = '/users/' + userId + '?fields=profiles';\n                _context9.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context9.sent;\n                return _context9.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context9.stop();\n            }\n          }\n        }, _callee9, this);\n      }));\n\n      function getLinkedAccounts(_x12) {\n        return _ref10.apply(this, arguments);\n      }\n\n      return getLinkedAccounts;\n    }()\n\n    /**\n     * Unlinks external account.\n     * @param {Number} userId The TopCoder user id\n     * @param {String} provider The external account service provider\n     * @returns {Promise} Resolves to the unlink result\n     */\n\n  }, {\n    key: 'unlinkExternalAccount',\n    value: function () {\n      var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(userId, provider) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                url = '/users/' + userId + '/profiles/' + provider;\n                _context10.next = 3;\n                return this.private.api.delete(url);\n\n              case 3:\n                res = _context10.sent;\n                return _context10.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context10.stop();\n            }\n          }\n        }, _callee10, this);\n      }));\n\n      function unlinkExternalAccount(_x13, _x14) {\n        return _ref11.apply(this, arguments);\n      }\n\n      return unlinkExternalAccount;\n    }()\n\n    /**\n     * Links external account.\n     * @param {Number} userId The TopCoder user id\n     * @param {String} provider The external account service provider\n     * @param {String} callbackUrl Optional. The callback url\n     * @returns {Promise} Resolves to the linked account result\n     */\n\n  }, {\n    key: 'linkExternalAccount',\n    value: function () {\n      var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(userId, provider, callbackUrl) {\n        var _this = this;\n\n        return _regenerator2.default.wrap(function _callee11$(_context11) {\n          while (1) {\n            switch (_context11.prev = _context11.next) {\n              case 0:\n                return _context11.abrupt('return', new _promise2.default(function (resolve, reject) {\n                  getAuth0().signin({\n                    popup: true,\n                    connection: provider,\n                    scope: 'openid profile offline_access',\n                    state: callbackUrl\n                  }, function (authError, profile, idToken, accessToken) {\n                    if (authError) {\n                      _logger2.default.error('Error signing in - onSocialLoginFailure', authError);\n                      reject(authError);\n                      return;\n                    }\n\n                    var socialData = getSocialUserData(profile, accessToken);\n\n                    var postData = {\n                      userId: socialData.socialUserId,\n                      name: socialData.username,\n                      email: socialData.email,\n                      emailVerified: false,\n                      providerType: socialData.socialProvider,\n                      context: {\n                        handle: socialData.username,\n                        accessToken: socialData.accessToken,\n                        auth0UserId: profile.user_id\n                      }\n                    };\n                    if (socialData.accessTokenSecret) {\n                      postData.context.accessTokenSecret = socialData.accessTokenSecret;\n                    }\n                    _logger2.default.debug('link API postdata: ' + (0, _stringify2.default)(postData));\n                    _this.private.api.postJson('/users/' + userId + '/profiles', { param: postData }).then(function (resp) {\n                      return (0, _tc.getApiResponsePayload)(resp).then(function (result) {\n                        _logger2.default.debug('Succesfully linked account: ' + (0, _stringify2.default)(result));\n                        resolve(postData);\n                      });\n                    }).catch(function (err) {\n                      _logger2.default.error('Error linking account', err);\n                      reject(err);\n                    });\n                  });\n                }));\n\n              case 1:\n              case 'end':\n                return _context11.stop();\n            }\n          }\n        }, _callee11, this);\n      }));\n\n      function linkExternalAccount(_x15, _x16, _x17) {\n        return _ref12.apply(this, arguments);\n      }\n\n      return linkExternalAccount;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return User;\n}();\n\nvar lastInstance = null;\n\n/**\n * Returns a new or existing User service for the specified tokenV3.\n * @param {String} tokenV3 Optional. Topcoder auth token v3.\n * @param {String} tokenV2 Optional. TC auth token v2.\n * @return {Api} API v3 service object.\n */\nfunction getService(tokenV3, tokenV2) {\n  if (!lastInstance || lastInstance.private.tokenV2 !== tokenV2 || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new User(tokenV3, tokenV2);\n  }\n  return lastInstance;\n}\n\n/**\n * @static\n * @member default\n * @desc Default export is {@link module:services.user~User} class.\n */\nvar _default = User;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(auth0, 'auth0', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(getAuth0, 'getAuth0', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(getSocialUserData, 'getSocialUserData', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(User, 'User', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(getService, 'getService', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/services/user.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/user.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\nvar _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ \"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ \"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _slicedToArray2 = __webpack_require__(/*! babel-runtime/helpers/slicedToArray */ \"babel-runtime/helpers/slicedToArray\");\n\nvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\nexports.getService = getService;\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _logger = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _tc = __webpack_require__(/*! ../utils/tc */ \"./src/utils/tc.js\");\n\nvar _api = __webpack_require__(/*! ./api */ \"./src/services/api.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"services.user\"\n    * @desc The User service provides functionality related to Topcoder user\n    *  accounts.\n    */\n\n\nvar auth0 = void 0;\n\n/**\n * Returns a new, or cached auth0 instance.\n * @return {Object} Auth0 object.\n */\nfunction getAuth0() {\n  if (!auth0 && _topcoderReactUtils.isomorphy.isClientSide()) {\n    var Auth0 = __webpack_require__(/*! auth0-js */ \"./node_modules/auth0-js/index.js\"); /* eslint-disable-line global-require */\n    auth0 = new Auth0({\n      domain: _topcoderReactUtils.config.AUTH0.DOMAIN,\n      clientID: _topcoderReactUtils.config.AUTH0.CLIENT_ID,\n      callbackOnLocationHash: true,\n      sso: false\n    });\n  }\n  return auth0;\n}\n\n/**\n * Gets social user data.\n * @param {Object} profile The user social profile\n * @param {*} accessToken The access token\n * @returns {Object} Social user data\n */\nfunction getSocialUserData(profile, accessToken) {\n  var socialProvider = profile.identities[0].connection;\n  var firstName = '';\n  var lastName = '';\n  var handle = '';\n  var email = profile.email || '';\n\n  var socialUserId = profile.user_id.substring(profile.user_id.lastIndexOf('|') + 1);\n  var splitName = void 0;\n\n  if (socialProvider === 'google-oauth2') {\n    firstName = profile.given_name;\n    lastName = profile.family_name;\n    handle = profile.nickname;\n  } else if (socialProvider === 'facebook') {\n    firstName = profile.given_name;\n    lastName = profile.family_name;\n    handle = firstName + '.' + lastName;\n  } else if (socialProvider === 'twitter') {\n    splitName = profile.name.split(' ');\n    var _splitName = splitName;\n\n    var _splitName2 = (0, _slicedToArray3.default)(_splitName, 1);\n\n    firstName = _splitName2[0];\n\n    if (splitName.length > 1) {\n      var _splitName3 = splitName;\n\n      var _splitName4 = (0, _slicedToArray3.default)(_splitName3, 2);\n\n      lastName = _splitName4[1];\n    }\n    handle = profile.screen_name;\n  } else if (socialProvider === 'github') {\n    splitName = profile.name.split(' ');\n    var _splitName5 = splitName;\n\n    var _splitName6 = (0, _slicedToArray3.default)(_splitName5, 1);\n\n    firstName = _splitName6[0];\n\n    if (splitName.length > 1) {\n      var _splitName7 = splitName;\n\n      var _splitName8 = (0, _slicedToArray3.default)(_splitName7, 2);\n\n      lastName = _splitName8[1];\n    }\n    handle = profile.nickname;\n  } else if (socialProvider === 'bitbucket') {\n    firstName = profile.first_name;\n    lastName = profile.last_name;\n    handle = profile.username;\n  } else if (socialProvider === 'stackoverflow') {\n    firstName = profile.first_name;\n    lastName = profile.last_name;\n    handle = socialUserId;\n  } else if (socialProvider === 'dribbble') {\n    firstName = profile.first_name;\n    lastName = profile.last_name;\n    handle = socialUserId;\n  }\n\n  var token = accessToken;\n  var tokenSecret = null;\n  if (profile.identities[0].access_token) {\n    token = profile.identities[0].access_token;\n  }\n  if (profile.identities[0].access_token_secret) {\n    tokenSecret = profile.identities[0].access_token_secret;\n  }\n  return {\n    socialUserId: socialUserId,\n    username: handle,\n    firstname: firstName,\n    lastname: lastName,\n    email: email,\n    socialProfile: profile,\n    socialProvider: socialProvider,\n    accessToken: token,\n    accessTokenSecret: tokenSecret\n  };\n}\n\n/**\n * Service class.\n */\n\nvar User = function () {\n  /**\n   * Creates a new User service.\n   * @param {String} tokenV3 Topcoder auth tokenV3.\n   * @param {String} tokenV2 TC auth token v2.\n   */\n  function User(tokenV3, tokenV2) {\n    (0, _classCallCheck3.default)(this, User);\n\n    this.private = {\n      api: (0, _api.getApi)('V3', tokenV3),\n      apiV2: (0, _api.getApi)('V2', tokenV2),\n      tokenV2: tokenV2,\n      tokenV3: tokenV3\n    };\n  }\n\n  /**\n   * Gets user achievements. Does not need auth.\n   * @param {String} username\n   * @return {Object}\n   */\n\n\n  (0, _createClass3.default)(User, [{\n    key: 'getAchievements',\n    value: function () {\n      var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(username) {\n        var res;\n        return _regenerator2.default.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                _context.next = 2;\n                return this.private.apiV2.get('/users/' + username);\n\n              case 2:\n                res = _context.sent;\n\n                if (res.ok) {\n                  _context.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                _context.next = 7;\n                return res.json();\n\n              case 7:\n                _context.t0 = _context.sent.Achievements;\n\n                if (_context.t0) {\n                  _context.next = 10;\n                  break;\n                }\n\n                _context.t0 = [];\n\n              case 10:\n                return _context.abrupt('return', _context.t0);\n\n              case 11:\n              case 'end':\n                return _context.stop();\n            }\n          }\n        }, _callee, this);\n      }));\n\n      function getAchievements(_x) {\n        return _ref.apply(this, arguments);\n      }\n\n      return getAchievements;\n    }()\n\n    /**\n     * Gets public user info. Does not need auth.\n     * @param {String} username\n     * @return {Object}\n     */\n\n  }, {\n    key: 'getUserPublic',\n    value: function () {\n      var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(username) {\n        var res;\n        return _regenerator2.default.wrap(function _callee2$(_context2) {\n          while (1) {\n            switch (_context2.prev = _context2.next) {\n              case 0:\n                _context2.next = 2;\n                return this.private.apiV2.get('/users/' + username);\n\n              case 2:\n                res = _context2.sent;\n\n                if (res.ok) {\n                  _context2.next = 5;\n                  break;\n                }\n\n                throw new Error(res.statusText);\n\n              case 5:\n                return _context2.abrupt('return', res.json() || null);\n\n              case 6:\n              case 'end':\n                return _context2.stop();\n            }\n          }\n        }, _callee2, this);\n      }));\n\n      function getUserPublic(_x2) {\n        return _ref2.apply(this, arguments);\n      }\n\n      return getUserPublic;\n    }()\n\n    /**\n     * Gets public user info from v3 API. Does not need auth.\n     * @param {String} username\n     * @return {Object}\n     */\n\n  }, {\n    key: 'getUserPublicV3',\n    value: function () {\n      var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(username) {\n        var res;\n        return _regenerator2.default.wrap(function _callee3$(_context3) {\n          while (1) {\n            switch (_context3.prev = _context3.next) {\n              case 0:\n                _context3.next = 2;\n                return this.private.api.get('/members/' + username);\n\n              case 2:\n                res = _context3.sent;\n                return _context3.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 4:\n              case 'end':\n                return _context3.stop();\n            }\n          }\n        }, _callee3, this);\n      }));\n\n      function getUserPublicV3(_x3) {\n        return _ref3.apply(this, arguments);\n      }\n\n      return getUserPublicV3;\n    }()\n\n    /**\n     * Gets user data object for the specified username.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {String} username\n     * @return {Promise} Resolves to the user data object.\n     */\n\n  }, {\n    key: 'getUser',\n    value: function () {\n      var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(username) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee4$(_context4) {\n          while (1) {\n            switch (_context4.prev = _context4.next) {\n              case 0:\n                url = '/users?filter=handle%3D' + username;\n                _context4.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context4.sent;\n                _context4.next = 6;\n                return (0, _tc.getApiResponsePayload)(res);\n\n              case 6:\n                return _context4.abrupt('return', _context4.sent[0]);\n\n              case 7:\n              case 'end':\n                return _context4.stop();\n            }\n          }\n        }, _callee4, this);\n      }));\n\n      function getUser(_x4) {\n        return _ref4.apply(this, arguments);\n      }\n\n      return getUser;\n    }()\n\n    /**\n     * Gets email preferences.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The TopCoder user id\n     * @returns {Promise} Resolves to the email preferences result\n     */\n\n  }, {\n    key: 'getEmailPreferences',\n    value: function () {\n      var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(userId) {\n        var url, res, x;\n        return _regenerator2.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                url = '/users/' + userId + '/preferences/email';\n                _context5.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context5.sent;\n                _context5.next = 6;\n                return res.json();\n\n              case 6:\n                x = _context5.sent.result;\n                return _context5.abrupt('return', x.content);\n\n              case 8:\n              case 'end':\n                return _context5.stop();\n            }\n          }\n        }, _callee5, this);\n      }));\n\n      function getEmailPreferences(_x5) {\n        return _ref5.apply(this, arguments);\n      }\n\n      return getEmailPreferences;\n    }()\n\n    /**\n     * Saves email preferences.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Object} user The TopCoder user\n     * @param {Object} preferences The email preferences\n     * @returns {Promise} Resolves to the email preferences result\n     */\n\n  }, {\n    key: 'saveEmailPreferences',\n    value: function () {\n      var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(_ref7, preferences) {\n        var firstName = _ref7.firstName,\n            lastName = _ref7.lastName,\n            userId = _ref7.userId;\n        var settings, url, res;\n        return _regenerator2.default.wrap(function _callee6$(_context6) {\n          while (1) {\n            switch (_context6.prev = _context6.next) {\n              case 0:\n                settings = {\n                  firstName: firstName,\n                  lastName: lastName,\n                  subscriptions: {}\n                };\n\n\n                if (!preferences) {\n                  settings.subscriptions.TOPCODER_NL_GEN = true;\n                } else {\n                  settings.subscriptions = preferences;\n                }\n                url = '/users/' + userId + '/preferences/email';\n                _context6.next = 5;\n                return this.private.api.putJson(url, { param: settings });\n\n              case 5:\n                res = _context6.sent;\n                return _context6.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 7:\n              case 'end':\n                return _context6.stop();\n            }\n          }\n        }, _callee6, this);\n      }));\n\n      function saveEmailPreferences(_x6, _x7) {\n        return _ref6.apply(this, arguments);\n      }\n\n      return saveEmailPreferences;\n    }()\n\n    /**\n     * Gets credential for the specified user id.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The user id\n     * @return {Promise} Resolves to the linked accounts array.\n     */\n\n  }, {\n    key: 'getCredential',\n    value: function () {\n      var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(userId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee7$(_context7) {\n          while (1) {\n            switch (_context7.prev = _context7.next) {\n              case 0:\n                url = '/users/' + userId + '?fields=credential';\n                _context7.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context7.sent;\n                return _context7.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context7.stop();\n            }\n          }\n        }, _callee7, this);\n      }));\n\n      function getCredential(_x8) {\n        return _ref8.apply(this, arguments);\n      }\n\n      return getCredential;\n    }()\n\n    /**\n     * Updates user password.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The user id\n     * @param {String} newPassword The new password\n     * @param {String} oldPassword The old password\n     * @return {Promise} Resolves to the update result.\n     */\n\n  }, {\n    key: 'updatePassword',\n    value: function () {\n      var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(userId, newPassword, oldPassword) {\n        var credential, url, res;\n        return _regenerator2.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                credential = {\n                  password: newPassword,\n                  currentPassword: oldPassword\n                };\n                url = '/users/' + userId;\n                _context8.next = 4;\n                return this.private.api.patchJson(url, { param: { credential: credential } });\n\n              case 4:\n                res = _context8.sent;\n                return _context8.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 6:\n              case 'end':\n                return _context8.stop();\n            }\n          }\n        }, _callee8, this);\n      }));\n\n      function updatePassword(_x9, _x10, _x11) {\n        return _ref9.apply(this, arguments);\n      }\n\n      return updatePassword;\n    }()\n\n    /**\n     * Gets linked accounts for the specified user id.\n     *\n     * NOTE: Only admins are authorized to use the underlying endpoint.\n     *\n     * @param {Number} userId The user id\n     * @return {Promise} Resolves to the linked accounts array.\n     */\n\n  }, {\n    key: 'getLinkedAccounts',\n    value: function () {\n      var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(userId) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee9$(_context9) {\n          while (1) {\n            switch (_context9.prev = _context9.next) {\n              case 0:\n                url = '/users/' + userId + '?fields=profiles';\n                _context9.next = 3;\n                return this.private.api.get(url);\n\n              case 3:\n                res = _context9.sent;\n                return _context9.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context9.stop();\n            }\n          }\n        }, _callee9, this);\n      }));\n\n      function getLinkedAccounts(_x12) {\n        return _ref10.apply(this, arguments);\n      }\n\n      return getLinkedAccounts;\n    }()\n\n    /**\n     * Unlinks external account.\n     * @param {Number} userId The TopCoder user id\n     * @param {String} provider The external account service provider\n     * @returns {Promise} Resolves to the unlink result\n     */\n\n  }, {\n    key: 'unlinkExternalAccount',\n    value: function () {\n      var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(userId, provider) {\n        var url, res;\n        return _regenerator2.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                url = '/users/' + userId + '/profiles/' + provider;\n                _context10.next = 3;\n                return this.private.api.delete(url);\n\n              case 3:\n                res = _context10.sent;\n                return _context10.abrupt('return', (0, _tc.getApiResponsePayload)(res));\n\n              case 5:\n              case 'end':\n                return _context10.stop();\n            }\n          }\n        }, _callee10, this);\n      }));\n\n      function unlinkExternalAccount(_x13, _x14) {\n        return _ref11.apply(this, arguments);\n      }\n\n      return unlinkExternalAccount;\n    }()\n\n    /**\n     * Links external account.\n     * @param {Number} userId The TopCoder user id\n     * @param {String} provider The external account service provider\n     * @param {String} callbackUrl Optional. The callback url\n     * @returns {Promise} Resolves to the linked account result\n     */\n\n  }, {\n    key: 'linkExternalAccount',\n    value: function () {\n      var _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(userId, provider, callbackUrl) {\n        var _this = this;\n\n        return _regenerator2.default.wrap(function _callee11$(_context11) {\n          while (1) {\n            switch (_context11.prev = _context11.next) {\n              case 0:\n                return _context11.abrupt('return', new _promise2.default(function (resolve, reject) {\n                  getAuth0().signin({\n                    popup: true,\n                    connection: provider,\n                    scope: 'openid profile offline_access',\n                    state: callbackUrl\n                  }, function (authError, profile, idToken, accessToken) {\n                    if (authError) {\n                      _logger2.default.error('Error signing in - onSocialLoginFailure', authError);\n                      reject(authError);\n                      return;\n                    }\n\n                    var socialData = getSocialUserData(profile, accessToken);\n\n                    var postData = {\n                      userId: socialData.socialUserId,\n                      name: socialData.username,\n                      email: socialData.email,\n                      emailVerified: false,\n                      providerType: socialData.socialProvider,\n                      context: {\n                        handle: socialData.username,\n                        accessToken: socialData.accessToken,\n                        auth0UserId: profile.user_id\n                      }\n                    };\n                    if (socialData.accessTokenSecret) {\n                      postData.context.accessTokenSecret = socialData.accessTokenSecret;\n                    }\n                    _logger2.default.debug('link API postdata: ' + (0, _stringify2.default)(postData));\n                    _this.private.api.postJson('/users/' + userId + '/profiles', { param: postData }).then(function (resp) {\n                      return (0, _tc.getApiResponsePayload)(resp).then(function (result) {\n                        _logger2.default.debug('Succesfully linked account: ' + (0, _stringify2.default)(result));\n                        resolve(postData);\n                      });\n                    }).catch(function (err) {\n                      _logger2.default.error('Error linking account', err);\n                      reject(err);\n                    });\n                  });\n                }));\n\n              case 1:\n              case 'end':\n                return _context11.stop();\n            }\n          }\n        }, _callee11, this);\n      }));\n\n      function linkExternalAccount(_x15, _x16, _x17) {\n        return _ref12.apply(this, arguments);\n      }\n\n      return linkExternalAccount;\n    }()\n  }, {\n    key: '__reactstandin__regenerateByEval',\n    // @ts-ignore\n    value: function __reactstandin__regenerateByEval(key, code) {\n      // @ts-ignore\n      this[key] = eval(code);\n    }\n  }]);\n  return User;\n}();\n\nvar lastInstance = null;\n\n/**\n * Returns a new or existing User service for the specified tokenV3.\n * @param {String} tokenV3 Optional. Topcoder auth token v3.\n * @param {String} tokenV2 Optional. TC auth token v2.\n * @return {Api} API v3 service object.\n */\nfunction getService(tokenV3, tokenV2) {\n  if (!lastInstance || lastInstance.private.tokenV2 !== tokenV2 || lastInstance.private.tokenV3 !== tokenV3) {\n    lastInstance = new User(tokenV3, tokenV2);\n  }\n  return lastInstance;\n}\n\n/**\n * @static\n * @member default\n * @desc Default export is {@link module:services.user~User} class.\n */\nvar _default = User;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(auth0, 'auth0', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(getAuth0, 'getAuth0', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(getSocialUserData, 'getSocialUserData', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(User, 'User', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(lastInstance, 'lastInstance', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(getService, 'getService', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/services/user.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/services/user.js?");
 
 /***/ }),
 
@@ -1078,7 +1078,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.addTrack = addTrack;\nexports.getFilterFunction = getFilterFunction;\nexports.getReviewOpportunitiesFilterFunction = getReviewOpportunitiesFilterFunction;\nexports.combine = combine;\nexports.mapToBackend = mapToBackend;\nexports.removeTrack = removeTrack;\nexports.setEndDate = setEndDate;\nexports.setReviewOpportunityType = setReviewOpportunityType;\nexports.setStartDate = setStartDate;\nexports.setSubtracks = setSubtracks;\nexports.setTags = setTags;\nexports.setText = setText;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _tc = __webpack_require__(/*! ../tc */ \"./src/utils/tc.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"challenge.filter\"\n    *\n    * @desc\n    * Universal challenge filter. Must be used in all places where we need filter\n    * or fetch challenges. This way we keep all related logic in the same place,\n    * which simplifies maintenance and modifications of the code.\n    *\n    * The state of challenge filter is a plain JS object, containing only plain\n    * data fields. It allows to avoid any problems with its storage inside Redux\n    * store; with its serialization into / deserialization from a string. Each\n    * field of the state describes a single rule for filtering the challenges.\n    * The filter allows only those challenges that match all defined rules.\n    * Undefined, null fields are ignored.\n    *\n    * The following fields are supported:\n    *\n    * endDate {Number|String} - Permits only those challenges with submission\n    * deadline before this date.\n    *\n    * groupIds {Array} - Permits only the challenges belonging to at least one\n    * of the groups which IDs are presented as keys in this object.\n    *\n    * or {Object[]} - All other filter fields applied to the challenge with AND\n    * logic, i.e. a challenge must satisfy each specified filter rule to match the\n    * filter as whole. In some cases we want to have OR logic between filter rules,\n    * and this array allows to achieve it: each object in this array is treated as\n    * an additional filter (these object may have all the same fields as the root\n    * filter state object), to be tested with OR logic.\n    *\n    * registrationOpen {Boolean} - Permits only the challenges with open or closed\n    * registration.\n    *\n    * startDate {Number|String} - Permits only those challenges started after this\n    * date.\n    *\n    * status {Array} - Permits only the challenges with status matching one of\n    * the keys of this object.\n    *\n    * started {Boolean} - Matches only the challenges with start date in past.\n    * It turns out that status ACTIVE also includes upcoming activated challenges,\n    * thus we need this additional filter.\n    *\n    * subtracks {Array} - Permits only the challenges belonging to at least one\n    * of the competition subtracks presented as keys of this object.\n    *\n    * tags {Array} - Permits only the challenges that have at least one of the\n    * tags within their platform and technology tags (keywords).\n    *\n    * text {String} - Free-text string which will be matched against challenge\n    * name, its platform and technology tags. If not found anywhere, the challenge\n    * is filtered out. Case-insensitive.\n    *\n    * tracks {Object} - Permits only the challenges belonging to at least one of\n    * the competition tracks presented as keys of this object.\n    *\n    * upcoming {Boolean} - Permits only upcoming challenges.\n    *\n    * users {Array} - Permits only the challenges where the specified (by handles)\n    * users are participating.\n    */\n\n/**\n * Here are many similiar filerBy..(challenge, state) functions. Each of them\n * checks whether the given challenge fulfills the corresponding filtering rule\n * from the filter state object, and returns true or false depending on it.\n */\n\nfunction filterByEndDate(challenge, state) {\n  if (!state.endDate) return true;\n  return (0, _moment2.default)(state.endDate).isAfter(challenge.registrationStartDate);\n}\n\nfunction filterByGroupIds(challenge, state) {\n  if (!state.groupIds) return true;\n  return state.groupIds.some(function (id) {\n    return challenge.groups[id];\n  });\n}\n\nfunction filterByRegistrationOpen(challenge, state) {\n  if (_lodash2.default.isUndefined(state.registrationOpen)) return true;\n  var isRegOpen = function isRegOpen() {\n    if (challenge.registrationOpen) {\n      return challenge.registrationOpen === 'Yes';\n    }\n    if (challenge.subTrack === 'MARATHON_MATCH') {\n      return challenge.status !== 'PAST';\n    }\n    var registrationPhase = challenge.allPhases.find(function (item) {\n      return item.phaseType === 'Registration';\n    });\n    if (!registrationPhase || registrationPhase.phaseStatus !== 'Open') {\n      return false;\n    }\n    if (challenge.track === 'DESIGN') {\n      var checkpointPhase = challenge.allPhases.find(function (item) {\n        return item.phaseType === 'Checkpoint Submission';\n      });\n      return !checkpointPhase || checkpointPhase.phaseStatus !== 'Closed';\n    }\n    return true;\n  };\n  return isRegOpen() === state.registrationOpen;\n}\n\n/**\n * Filter function for Review Opportunity Type, will be used internally in filter.js\n * @param {Object} opp Review Opportunity object\n * @param {Object} state Filter state\n * @return {Boolean} True if opp satifies the filter\n */\nfunction filterByReviewOpportunityType(opp, state) {\n  if (!state.reviewOpportunityType) return true;\n  return opp.type === state.reviewOpportunityType;\n}\n\nfunction filterByStartDate(challenge, state) {\n  if (!state.startDate) return true;\n  return (0, _moment2.default)(state.startDate).isBefore(challenge.submissionEndDate);\n}\n\nfunction filterByStarted(challenge, state) {\n  if (_lodash2.default.isUndefined(state.started)) return true;\n  return (0, _moment2.default)(challenge.registrationStartDate).isBefore(Date.now());\n}\n\nfunction filterByStatus(challenge, state) {\n  if (!state.status) return true;\n  return state.status.includes(challenge.status);\n}\n\nfunction filterBySubtracks(challenge, state) {\n  if (!state.subtracks) return true;\n\n  /* TODO: Although this is taken from the current code in prod,\n   * it probably does not work in all cases. It should be double-checked,\n   * why challenge subtracks in challenge objects are different from those\n   * return from the API as the list of possible subtracks. */\n  var filterSubtracks = state.subtracks.map(function (item) {\n    return item.toLowerCase().replace(/[_ ]/g, '');\n  });\n  var challengeSubtrack = challenge.subTrack.toLowerCase().replace(/[_ ]/g, '');\n  return filterSubtracks.includes(challengeSubtrack);\n}\n\nfunction filterByTags(challenge, state) {\n  if (!state.tags) return true;\n  var platforms = challenge.platforms,\n      technologies = challenge.technologies;\n\n  var str = (platforms + ' ' + technologies).toLowerCase();\n  return state.tags.some(function (tag) {\n    return str.includes(tag.toLowerCase());\n  });\n}\n\nfunction filterByText(challenge, state) {\n  if (!state.text) return true;\n  var str = (challenge.name + ' ' + challenge.platforms + ' ' + challenge.technologies).toLowerCase();\n  return str.includes(state.text.toLowerCase());\n}\n\nfunction filterByTrack(challenge, state) {\n  if (!state.tracks) return true;\n\n  /* Development challenges having Data Science tech tag, still should be\n   * included into data science track. */\n  if (state.tracks[_tc.COMPETITION_TRACKS.DATA_SCIENCE] && _lodash2.default.includes(challenge.technologies, 'Data Science')) {\n    return true;\n  }\n\n  return _lodash2.default.keys(state.tracks).some(function (track) {\n    return challenge.communities.has(track);\n  });\n}\n\nfunction filterByUpcoming(challenge, state) {\n  if (_lodash2.default.isUndefined(state.upcoming)) return true;\n  return (0, _moment2.default)().isBefore(challenge.registrationStartDate);\n}\n\nfunction filterByUsers(challenge, state) {\n  if (!state.users) return true;\n  return state.users.find(function (user) {\n    return challenge.users[user];\n  });\n}\n\n/**\n * Returns clone of the state with the specified competition track added.\n * @param {Object} state\n * @param {String} track\n * @return {Object} Resulting state.\n */\nfunction addTrack(state, track) {\n  /* When state has no tracks field all tracks are allowed, thus no need to\n   * touch the object. */\n  if (!state.tracks) return state;\n\n  var res = _lodash2.default.clone(state);\n  res.tracks = _lodash2.default.clone(res.tracks);\n  res.tracks[track] = true;\n\n  /* Selecting all tracks is the same as having no tracks field. To keep the\n   * state more simple at any time, we remove tracks field in such case. */\n  if (!_lodash2.default.values(_tc.COMPETITION_TRACKS).some(function (item) {\n    return !res.tracks[item];\n  })) {\n    delete res.tracks;\n  }\n\n  return res;\n}\n\n/**\n * Generates filter function for the state.\n * @param {Object} state\n * @return {Function}\n */\nfunction getFilterFunction(state) {\n  return function (challenge) {\n    var test = filterByStatus(challenge, state) && filterByTrack(challenge, state) && filterByUpcoming(challenge, state) && filterByGroupIds(challenge, state) && filterByText(challenge, state) && filterByTags(challenge, state) && filterBySubtracks(challenge, state) && filterByUsers(challenge, state) && filterByEndDate(challenge, state) && filterByStartDate(challenge, state) && filterByStarted(challenge, state) && filterByRegistrationOpen(challenge, state);\n    if (!test && state.or) {\n      var pos = 0;\n      while (!test && pos < state.or.length) {\n        test = getFilterFunction(state.or[pos])(challenge);\n        pos += 1;\n      }\n    }\n    return test;\n  };\n}\n\n/**\n * Generates a Review Opportunities filter function for the provided filter state.\n * @param {Object} state\n * @return {Function}\n */\nfunction getReviewOpportunitiesFilterFunction(state) {\n  return function (opp) {\n    // Review Opportunity objects have a challenge field which\n    // is largely compatible with many of the existing filter functions\n    // especially after a few normalization tweaks\n    var challenge = (0, _extends3.default)({}, opp.challenge, {\n      // This allows filterByText to search for Review Types and Challenge Titles\n      name: opp.challenge.title + ' ' + _tc.REVIEW_OPPORTUNITY_TYPES[opp.type],\n      registrationStartDate: opp.startDate, // startDate of Review, not Challenge\n      subTrack: opp.challenge.subTrack || '', // Sometimes back-end doesn't return this field\n      submissionEndDate: opp.startDate, // Currently uses startDate for both date comparisons\n      communities: new _set2.default([// Used to filter by Track, and communities at a future date\n      opp.challenge.track.toLowerCase()])\n    });\n\n    return filterByTrack(challenge, state) && filterByText(challenge, state) && filterByTags(challenge, state) && filterBySubtracks(challenge, state) && filterByEndDate(challenge, state) && filterByStartDate(challenge, state) && filterByReviewOpportunityType(opp, state);\n  };\n}\n\n/* ************************************************************************** */\n/* Below is a group of functions that allow to combine multiple challenge\n * filters together. If you are not adding a new filter functionality, just\n * look for the exported combine(..) function.\n *\n * All other helper functions in this section take two filter state objects as\n * arguments, and combine some of the filter rules, merging the resulting one\n * into the first filter state object.\n */\n\n/* NOTE: Current implementation ignores plenty of rules when combining filters.\n * It is fine for the only current use case: we use combine just before calling\n * to mapToBackend(..) function, to map several frontend filters to the\n * matching backend one. The way mapToBackend(..) works, this ignoring of\n * some rules is not a big deal (resulting backend filter will be not that\n * specific, as it probably could be, but due to the current api limitations\n * we cannot be too specific anyway). If you are going to use this for anything\n * else - thing twice what are you doing? If you need it for filtering, it is\n * just a lot easier to filter by each frontend filter in turns, rather than\n * combine them into a single filter. */\n\n/* This ESLint rule is disabled for combineXXX(..) functions, as they are\n * intended to be used only internally, with a newly constructed object\n * passed in as the first argument (i.e. we take care that there is no\n * side-effects to mutate it within this module, and these functions\n * are not exported outside of the module). */\n/* eslint-disable no-param-reassign */\n\nfunction combineArrayRules(a, b, ruleName) {\n  var or = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n  if (a[ruleName] && b[ruleName]) {\n    if (or) a[ruleName] = _lodash2.default.uniq(a[ruleName].concat(b[ruleName]));else a[ruleName] = _lodash2.default.intersection(a[ruleName], b[ruleName]);\n  } else if (b[ruleName]) a[ruleName] = b[ruleName];\n}\n\nfunction combineEndDate(a, b) {\n  if (a.endDate && b.endDate) {\n    a.endDate = _moment2.default.min(a.endDate, b.endDate).format();\n  } else if (b.endDate) a.endDate = b.endDate;\n}\n\nfunction combineStartDate(a, b) {\n  if (a.startDate && b.startDate) {\n    a.startDate = _moment2.default.max(a.startDate, b.startDate).format();\n  } else if (b.startDate) a.startDate = b.startDate;\n}\n\nfunction combineTracks(a, b) {\n  if (a.tracks && b.tracks) {\n    _lodash2.default.forIn(a.tracks, function (value, key) {\n      if (!b.tracks[key]) delete a.tracks[key];\n    });\n  } else if (b.tracks) a.tracks = b.tracks;\n}\n\n/* eslint-enable no-param-reassign */\n\n/**\n * Combines multiple filter state objects together. Resulting state describes\n * the filter, which matches only those challenges that satisfy each of the\n * filters passed in as arguments.\n *\n * The main intended use of this function is to combine multiple frontend\n * challenge filters into a single one, that can be mapped into the\n * corresponding backend filter by mapToBackend(..) function.\n *\n * @param {Object} filters Input filter state objects to combine.\n * @return {Object}\n */\nfunction combine() {\n  var res = {};\n\n  for (var _len = arguments.length, filters = Array(_len), _key = 0; _key < _len; _key++) {\n    filters[_key] = arguments[_key];\n  }\n\n  filters.forEach(function (filter) {\n    combineEndDate(res, filter);\n    combineArrayRules(res, filter, 'groupIds');\n    /* TODO: The registrationOpen rule is just ignored for now. */\n    combineStartDate(res, filter);\n    combineArrayRules(res, filter, 'or', true);\n    combineArrayRules(res, filter, 'status');\n    combineArrayRules(res, filter, 'subtracks');\n    combineArrayRules(res, filter, 'tags');\n    /* TODO: The text rule is just ignored for now. */\n    combineTracks(res, filter);\n    /* TODO: The upcoming rule is just ignored for now. */\n    /* TODO: The users rule is just ignored for now. */\n  });\n  return res;\n}\n\n/* ************************************************************************** */\n/* Below is a group of function that allow to map a frontend filter into the\n * corresponding backend (api) one. If you are not adding a new filter\n * functionality, just look for the exported mapToBackend(..) function. */\n\n/**\n * Maps the frontend challenge filter into the corresponding backend (api) one.\n * As there is no 1:1 match between the frontend and backend challenge filters,\n * the resulting backend filter is always equal or broader than the given\n * frontend one; i.e. any challenge that satisfies the original frontend filter\n * will pass the backend one, though some of the challenges that pass the\n * backend filter may fail the frontend one.\n *\n * It is assumed that this function will help us to load challenges from the\n * backend more specifically, though it does not prevent as from the need\n * always perform the final filtering at the frontend side.\n *\n * @param {Object} filter\n * @return {Object}\n */\nfunction mapToBackend(filter) {\n  if (filter.or) return {};\n\n  var res = {};\n  if (filter.groupIds) res.groupIds = filter.groupIds.join(',');\n\n  /* NOTE: Right now the frontend challenge filter by tag works different,\n   * it looks for matches in the challenge name OR in the techs / platforms. */\n  // if (filter.tags) res.technologies = filter.tags.join(',');\n\n  return res;\n}\n\n/**\n * Returns clone of the state with the specified competition track removed.\n * @param {Object} state\n * @param {String} track\n * @return {Object} Resulting state.\n */\nfunction removeTrack(state, track) {\n  var res = _lodash2.default.clone(state);\n  if (res.tracks) res.tracks = _lodash2.default.clone(res.tracks);else {\n    res.tracks = {};\n    _lodash2.default.forIn(_tc.COMPETITION_TRACKS, function (item) {\n      res.tracks[item] = true;\n    });\n  }\n  delete res.tracks[track];\n  return res;\n}\n\n/**\n * Clone the state and sets the end date.\n * @param {Object} state\n * @param {String} date\n * @return {Object}\n */\nfunction setEndDate(state, date) {\n  if (date) return (0, _extends3.default)({}, state, { endDate: date });\n  if (!state.endDate) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.endDate;\n  return res;\n}\n\n/**\n * Clones the state and sets the review opportunity type.\n * @param {Object} state\n * @param {Array} reviewOpportunityType Possible values found in utils/tc REVIEW_OPPORTUNITY_TYPES\n * @return {Object}\n */\nfunction setReviewOpportunityType(state, reviewOpportunityType) {\n  if (reviewOpportunityType) return (0, _extends3.default)({}, state, { reviewOpportunityType: reviewOpportunityType });\n  if (!state.reviewOpportunityType) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.reviewOpportunityType;\n  return res;\n}\n\n/**\n * Clones the state and sets the start date.\n * @param {Object} state\n * @param {String} date ISO date string.\n * @return {Object}\n */\nfunction setStartDate(state, date) {\n  if (date) return (0, _extends3.default)({}, state, { startDate: date });\n  if (!state.startDate) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.startDate;\n  return res;\n}\n\n/**\n * Clones the state and sets the subtracks.\n * @param {Object} state\n * @param {Array} subtracks\n * @return {Object}\n */\nfunction setSubtracks(state, subtracks) {\n  if (subtracks && subtracks.length) return (0, _extends3.default)({}, state, { subtracks: subtracks });\n  if (!state.subtracks) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.subtracks;\n  return res;\n}\n\n/**\n * Clones the state and sets the tags.\n * @param {Object} state\n * @param {Array} tags String array.\n * @return {Object}\n */\nfunction setTags(state, tags) {\n  if (tags && tags.length) return (0, _extends3.default)({}, state, { tags: tags });\n  if (!state.tags) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.tags;\n  return res;\n}\n\n/**\n * Clones fitler state and sets the free-text string for the filtering by\n * challenge name and tags. To clear the string set it to anything evaluating\n * to falst (empty string, null, undefined).\n * @param {Object} state\n * @param {String} text\n * @return {Object} Resulting string.\n */\nfunction setText(state, text) {\n  if (!text && !state.text) return state;\n  var res = _lodash2.default.clone(state);\n  if (text) res.text = text;else delete res.text;\n  return res;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(filterByEndDate, 'filterByEndDate', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByGroupIds, 'filterByGroupIds', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByRegistrationOpen, 'filterByRegistrationOpen', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByReviewOpportunityType, 'filterByReviewOpportunityType', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByStartDate, 'filterByStartDate', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByStarted, 'filterByStarted', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByStatus, 'filterByStatus', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterBySubtracks, 'filterBySubtracks', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByTags, 'filterByTags', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByText, 'filterByText', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByTrack, 'filterByTrack', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByUpcoming, 'filterByUpcoming', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByUsers, 'filterByUsers', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(addTrack, 'addTrack', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(getFilterFunction, 'getFilterFunction', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(getReviewOpportunitiesFilterFunction, 'getReviewOpportunitiesFilterFunction', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineArrayRules, 'combineArrayRules', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineEndDate, 'combineEndDate', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineStartDate, 'combineStartDate', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineTracks, 'combineTracks', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combine, 'combine', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(mapToBackend, 'mapToBackend', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(removeTrack, 'removeTrack', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setEndDate, 'setEndDate', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setReviewOpportunityType, 'setReviewOpportunityType', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setStartDate, 'setStartDate', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setSubtracks, 'setSubtracks', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setTags, 'setTags', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setText, 'setText', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/challenge/filter.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/challenge/filter.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _set = __webpack_require__(/*! babel-runtime/core-js/set */ \"babel-runtime/core-js/set\");\n\nvar _set2 = _interopRequireDefault(_set);\n\nvar _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ \"babel-runtime/helpers/extends\");\n\nvar _extends3 = _interopRequireDefault(_extends2);\n\nexports.addTrack = addTrack;\nexports.getFilterFunction = getFilterFunction;\nexports.getReviewOpportunitiesFilterFunction = getReviewOpportunitiesFilterFunction;\nexports.combine = combine;\nexports.mapToBackend = mapToBackend;\nexports.removeTrack = removeTrack;\nexports.setEndDate = setEndDate;\nexports.setReviewOpportunityType = setReviewOpportunityType;\nexports.setStartDate = setStartDate;\nexports.setSubtracks = setSubtracks;\nexports.setTags = setTags;\nexports.setText = setText;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _tc = __webpack_require__(/*! ../tc */ \"./src/utils/tc.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module \"challenge.filter\"\n    *\n    * @desc\n    * Universal challenge filter. Must be used in all places where we need filter\n    * or fetch challenges. This way we keep all related logic in the same place,\n    * which simplifies maintenance and modifications of the code.\n    *\n    * The state of challenge filter is a plain JS object, containing only plain\n    * data fields. It allows to avoid any problems with its storage inside Redux\n    * store; with its serialization into / deserialization from a string. Each\n    * field of the state describes a single rule for filtering the challenges.\n    * The filter allows only those challenges that match all defined rules.\n    * Undefined, null fields are ignored.\n    *\n    * The following fields are supported:\n    *\n    * endDate {Number|String} - Permits only those challenges with submission\n    * deadline before this date.\n    *\n    * groupIds {Array} - Permits only the challenges belonging to at least one\n    * of the groups which IDs are presented as keys in this object.\n    *\n    * or {Object[]} - All other filter fields applied to the challenge with AND\n    * logic, i.e. a challenge must satisfy each specified filter rule to match the\n    * filter as whole. In some cases we want to have OR logic between filter rules,\n    * and this array allows to achieve it: each object in this array is treated as\n    * an additional filter (these object may have all the same fields as the root\n    * filter state object), to be tested with OR logic.\n    *\n    * registrationOpen {Boolean} - Permits only the challenges with open or closed\n    * registration.\n    *\n    * startDate {Number|String} - Permits only those challenges started after this\n    * date.\n    *\n    * status {Array} - Permits only the challenges with status matching one of\n    * the keys of this object.\n    *\n    * started {Boolean} - Matches only the challenges with start date in past.\n    * It turns out that status ACTIVE also includes upcoming activated challenges,\n    * thus we need this additional filter.\n    *\n    * subtracks {Array} - Permits only the challenges belonging to at least one\n    * of the competition subtracks presented as keys of this object.\n    *\n    * tags {Array} - Permits only the challenges that have at least one of the\n    * tags within their platform and technology tags (keywords).\n    *\n    * text {String} - Free-text string which will be matched against challenge\n    * name, its platform and technology tags. If not found anywhere, the challenge\n    * is filtered out. Case-insensitive.\n    *\n    * tracks {Object} - Permits only the challenges belonging to at least one of\n    * the competition tracks presented as keys of this object.\n    *\n    * upcoming {Boolean} - Permits only upcoming challenges.\n    *\n    * users {Array} - Permits only the challenges where the specified (by handles)\n    * users are participating.\n    */\n\n/**\n * Here are many similiar filerBy..(challenge, state) functions. Each of them\n * checks whether the given challenge fulfills the corresponding filtering rule\n * from the filter state object, and returns true or false depending on it.\n */\n\nfunction filterByEndDate(challenge, state) {\n  if (!state.endDate) return true;\n  return (0, _moment2.default)(state.endDate).isAfter(challenge.registrationStartDate);\n}\n\nfunction filterByGroupIds(challenge, state) {\n  if (!state.groupIds) return true;\n  return state.groupIds.some(function (id) {\n    return challenge.groups[id];\n  });\n}\n\nfunction filterByRegistrationOpen(challenge, state) {\n  if (_lodash2.default.isUndefined(state.registrationOpen)) return true;\n  var isRegOpen = function isRegOpen() {\n    if (challenge.registrationOpen) {\n      return challenge.registrationOpen === 'Yes';\n    }\n    if (challenge.subTrack === 'MARATHON_MATCH') {\n      return challenge.status !== 'PAST';\n    }\n    var registrationPhase = challenge.allPhases.find(function (item) {\n      return item.phaseType === 'Registration';\n    });\n    if (!registrationPhase || registrationPhase.phaseStatus !== 'Open') {\n      return false;\n    }\n    if (challenge.track === 'DESIGN') {\n      var checkpointPhase = challenge.allPhases.find(function (item) {\n        return item.phaseType === 'Checkpoint Submission';\n      });\n      return !checkpointPhase || checkpointPhase.phaseStatus !== 'Closed';\n    }\n    return true;\n  };\n  return isRegOpen() === state.registrationOpen;\n}\n\n/**\n * Filter function for Review Opportunity Type, will be used internally in filter.js\n * @param {Object} opp Review Opportunity object\n * @param {Object} state Filter state\n * @return {Boolean} True if opp satifies the filter\n */\nfunction filterByReviewOpportunityType(opp, state) {\n  if (!state.reviewOpportunityType) return true;\n  return opp.type === state.reviewOpportunityType;\n}\n\nfunction filterByStartDate(challenge, state) {\n  if (!state.startDate) return true;\n  return (0, _moment2.default)(state.startDate).isBefore(challenge.submissionEndDate);\n}\n\nfunction filterByStarted(challenge, state) {\n  if (_lodash2.default.isUndefined(state.started)) return true;\n  return (0, _moment2.default)(challenge.registrationStartDate).isBefore(Date.now());\n}\n\nfunction filterByStatus(challenge, state) {\n  if (!state.status) return true;\n  return state.status.includes(challenge.status);\n}\n\nfunction filterBySubtracks(challenge, state) {\n  if (!state.subtracks) return true;\n\n  /* TODO: Although this is taken from the current code in prod,\n   * it probably does not work in all cases. It should be double-checked,\n   * why challenge subtracks in challenge objects are different from those\n   * return from the API as the list of possible subtracks. */\n  var filterSubtracks = state.subtracks.map(function (item) {\n    return item.toLowerCase().replace(/[_ ]/g, '');\n  });\n  var challengeSubtrack = challenge.subTrack.toLowerCase().replace(/[_ ]/g, '');\n  return filterSubtracks.includes(challengeSubtrack);\n}\n\nfunction filterByTags(challenge, state) {\n  if (!state.tags) return true;\n  var platforms = challenge.platforms,\n      technologies = challenge.technologies;\n\n  var str = (platforms + ' ' + technologies).toLowerCase();\n  return state.tags.some(function (tag) {\n    return str.includes(tag.toLowerCase());\n  });\n}\n\nfunction filterByText(challenge, state) {\n  if (!state.text) return true;\n  var str = (challenge.name + ' ' + challenge.platforms + ' ' + challenge.technologies).toLowerCase();\n  return str.includes(state.text.toLowerCase());\n}\n\nfunction filterByTrack(challenge, state) {\n  if (!state.tracks) return true;\n\n  /* Development challenges having Data Science tech tag, still should be\n   * included into data science track. */\n  if (state.tracks[_tc.COMPETITION_TRACKS.DATA_SCIENCE] && _lodash2.default.includes(challenge.technologies, 'Data Science')) {\n    return true;\n  }\n\n  return _lodash2.default.keys(state.tracks).some(function (track) {\n    return challenge.communities.has(track);\n  });\n}\n\nfunction filterByUpcoming(challenge, state) {\n  if (_lodash2.default.isUndefined(state.upcoming)) return true;\n  return (0, _moment2.default)().isBefore(challenge.registrationStartDate);\n}\n\nfunction filterByUsers(challenge, state) {\n  if (!state.users) return true;\n  return state.users.find(function (user) {\n    return challenge.users[user];\n  });\n}\n\n/**\n * Returns clone of the state with the specified competition track added.\n * @param {Object} state\n * @param {String} track\n * @return {Object} Resulting state.\n */\nfunction addTrack(state, track) {\n  /* When state has no tracks field all tracks are allowed, thus no need to\n   * touch the object. */\n  if (!state.tracks) return state;\n\n  var res = _lodash2.default.clone(state);\n  res.tracks = _lodash2.default.clone(res.tracks);\n  res.tracks[track] = true;\n\n  /* Selecting all tracks is the same as having no tracks field. To keep the\n   * state more simple at any time, we remove tracks field in such case. */\n  if (!_lodash2.default.values(_tc.COMPETITION_TRACKS).some(function (item) {\n    return !res.tracks[item];\n  })) {\n    delete res.tracks;\n  }\n\n  return res;\n}\n\n/**\n * Generates filter function for the state.\n * @param {Object} state\n * @return {Function}\n */\nfunction getFilterFunction(state) {\n  return function (challenge) {\n    var test = filterByStatus(challenge, state) && filterByTrack(challenge, state) && filterByUpcoming(challenge, state) && filterByGroupIds(challenge, state) && filterByText(challenge, state) && filterByTags(challenge, state) && filterBySubtracks(challenge, state) && filterByUsers(challenge, state) && filterByEndDate(challenge, state) && filterByStartDate(challenge, state) && filterByStarted(challenge, state) && filterByRegistrationOpen(challenge, state);\n    if (!test && state.or) {\n      var pos = 0;\n      while (!test && pos < state.or.length) {\n        test = getFilterFunction(state.or[pos])(challenge);\n        pos += 1;\n      }\n    }\n    return test;\n  };\n}\n\n/**\n * Generates a Review Opportunities filter function for the provided filter state.\n * @param {Object} state\n * @return {Function}\n */\nfunction getReviewOpportunitiesFilterFunction(state) {\n  return function (opp) {\n    // Review Opportunity objects have a challenge field which\n    // is largely compatible with many of the existing filter functions\n    // especially after a few normalization tweaks\n    var challenge = (0, _extends3.default)({}, opp.challenge, {\n      // This allows filterByText to search for Review Types and Challenge Titles\n      name: opp.challenge.title + ' ' + _tc.REVIEW_OPPORTUNITY_TYPES[opp.type],\n      registrationStartDate: opp.startDate, // startDate of Review, not Challenge\n      subTrack: opp.challenge.subTrack || '', // Sometimes back-end doesn't return this field\n      submissionEndDate: opp.startDate, // Currently uses startDate for both date comparisons\n      communities: new _set2.default([// Used to filter by Track, and communities at a future date\n      opp.challenge.track.toLowerCase()])\n    });\n\n    return filterByTrack(challenge, state) && filterByText(challenge, state) && filterByTags(challenge, state) && filterBySubtracks(challenge, state) && filterByEndDate(challenge, state) && filterByStartDate(challenge, state) && filterByReviewOpportunityType(opp, state);\n  };\n}\n\n/* ************************************************************************** */\n/* Below is a group of functions that allow to combine multiple challenge\n * filters together. If you are not adding a new filter functionality, just\n * look for the exported combine(..) function.\n *\n * All other helper functions in this section take two filter state objects as\n * arguments, and combine some of the filter rules, merging the resulting one\n * into the first filter state object.\n */\n\n/* NOTE: Current implementation ignores plenty of rules when combining filters.\n * It is fine for the only current use case: we use combine just before calling\n * to mapToBackend(..) function, to map several frontend filters to the\n * matching backend one. The way mapToBackend(..) works, this ignoring of\n * some rules is not a big deal (resulting backend filter will be not that\n * specific, as it probably could be, but due to the current api limitations\n * we cannot be too specific anyway). If you are going to use this for anything\n * else - thing twice what are you doing? If you need it for filtering, it is\n * just a lot easier to filter by each frontend filter in turns, rather than\n * combine them into a single filter. */\n\n/* This ESLint rule is disabled for combineXXX(..) functions, as they are\n * intended to be used only internally, with a newly constructed object\n * passed in as the first argument (i.e. we take care that there is no\n * side-effects to mutate it within this module, and these functions\n * are not exported outside of the module). */\n/* eslint-disable no-param-reassign */\n\nfunction combineArrayRules(a, b, ruleName) {\n  var or = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n  if (a[ruleName] && b[ruleName]) {\n    if (or) a[ruleName] = _lodash2.default.uniq(a[ruleName].concat(b[ruleName]));else a[ruleName] = _lodash2.default.intersection(a[ruleName], b[ruleName]);\n  } else if (b[ruleName]) a[ruleName] = b[ruleName];\n}\n\nfunction combineEndDate(a, b) {\n  if (a.endDate && b.endDate) {\n    a.endDate = _moment2.default.min(a.endDate, b.endDate).format();\n  } else if (b.endDate) a.endDate = b.endDate;\n}\n\nfunction combineStartDate(a, b) {\n  if (a.startDate && b.startDate) {\n    a.startDate = _moment2.default.max(a.startDate, b.startDate).format();\n  } else if (b.startDate) a.startDate = b.startDate;\n}\n\nfunction combineTracks(a, b) {\n  if (a.tracks && b.tracks) {\n    _lodash2.default.forIn(a.tracks, function (value, key) {\n      if (!b.tracks[key]) delete a.tracks[key];\n    });\n  } else if (b.tracks) a.tracks = b.tracks;\n}\n\n/* eslint-enable no-param-reassign */\n\n/**\n * Combines multiple filter state objects together. Resulting state describes\n * the filter, which matches only those challenges that satisfy each of the\n * filters passed in as arguments.\n *\n * The main intended use of this function is to combine multiple frontend\n * challenge filters into a single one, that can be mapped into the\n * corresponding backend filter by mapToBackend(..) function.\n *\n * @param {Object} filters Input filter state objects to combine.\n * @return {Object}\n */\nfunction combine() {\n  var res = {};\n\n  for (var _len = arguments.length, filters = Array(_len), _key = 0; _key < _len; _key++) {\n    filters[_key] = arguments[_key];\n  }\n\n  filters.forEach(function (filter) {\n    combineEndDate(res, filter);\n    combineArrayRules(res, filter, 'groupIds');\n    /* TODO: The registrationOpen rule is just ignored for now. */\n    combineStartDate(res, filter);\n    combineArrayRules(res, filter, 'or', true);\n    combineArrayRules(res, filter, 'status');\n    combineArrayRules(res, filter, 'subtracks');\n    combineArrayRules(res, filter, 'tags');\n    /* TODO: The text rule is just ignored for now. */\n    combineTracks(res, filter);\n    /* TODO: The upcoming rule is just ignored for now. */\n    /* TODO: The users rule is just ignored for now. */\n  });\n  return res;\n}\n\n/* ************************************************************************** */\n/* Below is a group of function that allow to map a frontend filter into the\n * corresponding backend (api) one. If you are not adding a new filter\n * functionality, just look for the exported mapToBackend(..) function. */\n\n/**\n * Maps the frontend challenge filter into the corresponding backend (api) one.\n * As there is no 1:1 match between the frontend and backend challenge filters,\n * the resulting backend filter is always equal or broader than the given\n * frontend one; i.e. any challenge that satisfies the original frontend filter\n * will pass the backend one, though some of the challenges that pass the\n * backend filter may fail the frontend one.\n *\n * It is assumed that this function will help us to load challenges from the\n * backend more specifically, though it does not prevent as from the need\n * always perform the final filtering at the frontend side.\n *\n * @param {Object} filter\n * @return {Object}\n */\nfunction mapToBackend(filter) {\n  if (filter.or) return {};\n\n  var res = {};\n  if (filter.groupIds) res.groupIds = filter.groupIds.join(',');\n\n  /* NOTE: Right now the frontend challenge filter by tag works different,\n   * it looks for matches in the challenge name OR in the techs / platforms. */\n  // if (filter.tags) res.technologies = filter.tags.join(',');\n\n  return res;\n}\n\n/**\n * Returns clone of the state with the specified competition track removed.\n * @param {Object} state\n * @param {String} track\n * @return {Object} Resulting state.\n */\nfunction removeTrack(state, track) {\n  var res = _lodash2.default.clone(state);\n  if (res.tracks) res.tracks = _lodash2.default.clone(res.tracks);else {\n    res.tracks = {};\n    _lodash2.default.forIn(_tc.COMPETITION_TRACKS, function (item) {\n      res.tracks[item] = true;\n    });\n  }\n  delete res.tracks[track];\n  return res;\n}\n\n/**\n * Clone the state and sets the end date.\n * @param {Object} state\n * @param {String} date\n * @return {Object}\n */\nfunction setEndDate(state, date) {\n  if (date) return (0, _extends3.default)({}, state, { endDate: date });\n  if (!state.endDate) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.endDate;\n  return res;\n}\n\n/**\n * Clones the state and sets the review opportunity type.\n * @param {Object} state\n * @param {Array} reviewOpportunityType Possible values found in utils/tc REVIEW_OPPORTUNITY_TYPES\n * @return {Object}\n */\nfunction setReviewOpportunityType(state, reviewOpportunityType) {\n  if (reviewOpportunityType) return (0, _extends3.default)({}, state, { reviewOpportunityType: reviewOpportunityType });\n  if (!state.reviewOpportunityType) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.reviewOpportunityType;\n  return res;\n}\n\n/**\n * Clones the state and sets the start date.\n * @param {Object} state\n * @param {String} date ISO date string.\n * @return {Object}\n */\nfunction setStartDate(state, date) {\n  if (date) return (0, _extends3.default)({}, state, { startDate: date });\n  if (!state.startDate) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.startDate;\n  return res;\n}\n\n/**\n * Clones the state and sets the subtracks.\n * @param {Object} state\n * @param {Array} subtracks\n * @return {Object}\n */\nfunction setSubtracks(state, subtracks) {\n  if (subtracks && subtracks.length) return (0, _extends3.default)({}, state, { subtracks: subtracks });\n  if (!state.subtracks) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.subtracks;\n  return res;\n}\n\n/**\n * Clones the state and sets the tags.\n * @param {Object} state\n * @param {Array} tags String array.\n * @return {Object}\n */\nfunction setTags(state, tags) {\n  if (tags && tags.length) return (0, _extends3.default)({}, state, { tags: tags });\n  if (!state.tags) return state;\n  var res = _lodash2.default.clone(state);\n  delete res.tags;\n  return res;\n}\n\n/**\n * Clones fitler state and sets the free-text string for the filtering by\n * challenge name and tags. To clear the string set it to anything evaluating\n * to falst (empty string, null, undefined).\n * @param {Object} state\n * @param {String} text\n * @return {Object} Resulting string.\n */\nfunction setText(state, text) {\n  if (!text && !state.text) return state;\n  var res = _lodash2.default.clone(state);\n  if (text) res.text = text;else delete res.text;\n  return res;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(filterByEndDate, 'filterByEndDate', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByGroupIds, 'filterByGroupIds', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByRegistrationOpen, 'filterByRegistrationOpen', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByReviewOpportunityType, 'filterByReviewOpportunityType', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByStartDate, 'filterByStartDate', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByStarted, 'filterByStarted', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByStatus, 'filterByStatus', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterBySubtracks, 'filterBySubtracks', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByTags, 'filterByTags', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByText, 'filterByText', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByTrack, 'filterByTrack', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByUpcoming, 'filterByUpcoming', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(filterByUsers, 'filterByUsers', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(addTrack, 'addTrack', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(getFilterFunction, 'getFilterFunction', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(getReviewOpportunitiesFilterFunction, 'getReviewOpportunitiesFilterFunction', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineArrayRules, 'combineArrayRules', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineEndDate, 'combineEndDate', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineStartDate, 'combineStartDate', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combineTracks, 'combineTracks', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(combine, 'combine', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(mapToBackend, 'mapToBackend', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(removeTrack, 'removeTrack', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setEndDate, 'setEndDate', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setReviewOpportunityType, 'setReviewOpportunityType', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setStartDate, 'setStartDate', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setSubtracks, 'setSubtracks', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setTags, 'setTags', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(setText, 'setText', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/challenge/filter.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/challenge/filter.js?");
 
 /***/ }),
 
@@ -1090,7 +1090,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ERROR_ICON_TYPES = undefined;\n\nvar _setImmediate2 = __webpack_require__(/*! babel-runtime/core-js/set-immediate */ \"babel-runtime/core-js/set-immediate\");\n\nvar _setImmediate3 = _interopRequireDefault(_setImmediate2);\n\nexports.setErrorsStore = setErrorsStore;\nexports.fireErrorMessage = fireErrorMessage;\nexports.clearAllErrorIcons = clearAllErrorIcons;\nexports.setErrorIcon = setErrorIcon;\nexports.clearErrorIcon = clearErrorIcon;\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _errors = __webpack_require__(/*! ../actions/errors */ \"./src/actions/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module errors\n    * @desc Utility functions for the standard error handling.\n    * @todo They will be moved to `topcoder-react-utils` soon.\n    */\n\nvar ERROR_ICON_TYPES = exports.ERROR_ICON_TYPES = {\n  NETWORK: 'network',\n  API: 'api'\n};\n\nvar store = void 0; // Will be set only when rendering client-side\n\nfunction setErrorsStore(s) {\n  store = s;\n}\n\n/**\n * The function behaves similarly to javascript alert()\n * it will show a modal error diaglog with styling until the user clicks OK.\n */\nfunction fireErrorMessage(title, details) {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.newError(title, details));\n    });\n  }\n}\n\n/**\n * clear all error icons\n */\nfunction clearAllErrorIcons() {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.clearAllErrorIcons());\n    });\n  }\n}\n\n/**\n * add error message to error icon in bottom left in the screen.\n * @param id  id of error icon type (ERROR_ICON_TYPES.NETWORK or ERROR_ICON_TYPES.API)\n * @param title icon hover title\n * @param message icon hover message\n */\nfunction setErrorIcon(id, title, message) {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.setErrorIcon(id, title, message));\n    });\n  }\n}\n\n/**\n * clear all error message for an error icon.\n * @param id  id of error icon type to clear\n */\nfunction clearErrorIcon(id) {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.clearErrorIcon(id));\n    });\n  }\n}\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ERROR_ICON_TYPES, 'ERROR_ICON_TYPES', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(store, 'store', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(setErrorsStore, 'setErrorsStore', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(fireErrorMessage, 'fireErrorMessage', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(clearAllErrorIcons, 'clearAllErrorIcons', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(setErrorIcon, 'setErrorIcon', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(clearErrorIcon, 'clearErrorIcon', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/errors.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/errors.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ERROR_ICON_TYPES = undefined;\n\nvar _setImmediate2 = __webpack_require__(/*! babel-runtime/core-js/set-immediate */ \"babel-runtime/core-js/set-immediate\");\n\nvar _setImmediate3 = _interopRequireDefault(_setImmediate2);\n\nexports.setErrorsStore = setErrorsStore;\nexports.fireErrorMessage = fireErrorMessage;\nexports.clearAllErrorIcons = clearAllErrorIcons;\nexports.setErrorIcon = setErrorIcon;\nexports.clearErrorIcon = clearErrorIcon;\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nvar _errors = __webpack_require__(/*! ../actions/errors */ \"./src/actions/errors.js\");\n\nvar _errors2 = _interopRequireDefault(_errors);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module errors\n    * @desc Utility functions for the standard error handling.\n    * @todo They will be moved to `topcoder-react-utils` soon.\n    */\n\nvar ERROR_ICON_TYPES = exports.ERROR_ICON_TYPES = {\n  NETWORK: 'network',\n  API: 'api'\n};\n\nvar store = void 0; // Will be set only when rendering client-side\n\nfunction setErrorsStore(s) {\n  store = s;\n}\n\n/**\n * The function behaves similarly to javascript alert()\n * it will show a modal error diaglog with styling until the user clicks OK.\n */\nfunction fireErrorMessage(title, details) {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.newError(title, details));\n    });\n  }\n}\n\n/**\n * clear all error icons\n */\nfunction clearAllErrorIcons() {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.clearAllErrorIcons());\n    });\n  }\n}\n\n/**\n * add error message to error icon in bottom left in the screen.\n * @param id  id of error icon type (ERROR_ICON_TYPES.NETWORK or ERROR_ICON_TYPES.API)\n * @param title icon hover title\n * @param message icon hover message\n */\nfunction setErrorIcon(id, title, message) {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.setErrorIcon(id, title, message));\n    });\n  }\n}\n\n/**\n * clear all error message for an error icon.\n * @param id  id of error icon type to clear\n */\nfunction clearErrorIcon(id) {\n  if (_topcoderReactUtils.isomorphy.isClientSide() && store) {\n    (0, _setImmediate3.default)(function () {\n      store.dispatch(_errors2.default.errors.clearErrorIcon(id));\n    });\n  }\n}\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(ERROR_ICON_TYPES, 'ERROR_ICON_TYPES', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(store, 'store', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(setErrorsStore, 'setErrorsStore', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(fireErrorMessage, 'fireErrorMessage', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(clearAllErrorIcons, 'clearAllErrorIcons', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(setErrorIcon, 'setErrorIcon', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n  reactHotLoader.register(clearErrorIcon, 'clearErrorIcon', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/errors.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/errors.js?");
 
 /***/ }),
 
@@ -1102,7 +1102,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.submission = exports.errors = exports.mock = exports.time = exports.tc = exports.logger = exports.challenge = undefined;\n\nvar _logger = __webpack_require__(/*! ./logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _tc = __webpack_require__(/*! ./tc */ \"./src/utils/tc.js\");\n\nvar tc = _interopRequireWildcard(_tc);\n\nvar _time = __webpack_require__(/*! ./time */ \"./src/utils/time.js\");\n\nvar time = _interopRequireWildcard(_time);\n\nvar _mock = __webpack_require__(/*! ./mock */ \"./src/utils/mock.js\");\n\nvar mock = _interopRequireWildcard(_mock);\n\nvar _errors = __webpack_require__(/*! ./errors */ \"./src/utils/errors.js\");\n\nvar errors = _interopRequireWildcard(_errors);\n\nvar _filter = __webpack_require__(/*! ./challenge/filter */ \"./src/utils/challenge/filter.js\");\n\nvar filter = _interopRequireWildcard(_filter);\n\nvar _submission = __webpack_require__(/*! ./submission */ \"./src/utils/submission.js\");\n\nvar submission = _interopRequireWildcard(_submission);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Export utils.\n    */\n\n\nvar challenge = {\n  filter: filter\n};\n\nexports.challenge = challenge;\nexports.logger = _logger2.default;\nexports.tc = tc;\nexports.time = time;\nexports.mock = mock;\nexports.errors = errors;\nexports.submission = submission;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(challenge, 'challenge', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/index.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.submission = exports.errors = exports.mock = exports.time = exports.tc = exports.logger = exports.challenge = undefined;\n\nvar _logger = __webpack_require__(/*! ./logger */ \"./src/utils/logger.js\");\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _tc = __webpack_require__(/*! ./tc */ \"./src/utils/tc.js\");\n\nvar tc = _interopRequireWildcard(_tc);\n\nvar _time = __webpack_require__(/*! ./time */ \"./src/utils/time.js\");\n\nvar time = _interopRequireWildcard(_time);\n\nvar _mock = __webpack_require__(/*! ./mock */ \"./src/utils/mock.js\");\n\nvar mock = _interopRequireWildcard(_mock);\n\nvar _errors = __webpack_require__(/*! ./errors */ \"./src/utils/errors.js\");\n\nvar errors = _interopRequireWildcard(_errors);\n\nvar _filter = __webpack_require__(/*! ./challenge/filter */ \"./src/utils/challenge/filter.js\");\n\nvar filter = _interopRequireWildcard(_filter);\n\nvar _submission = __webpack_require__(/*! ./submission */ \"./src/utils/submission.js\");\n\nvar submission = _interopRequireWildcard(_submission);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Export utils.\n    */\n\n\nvar challenge = {\n  filter: filter\n};\n\nexports.challenge = challenge;\nexports.logger = _logger2.default;\nexports.tc = tc;\nexports.time = time;\nexports.mock = mock;\nexports.errors = errors;\nexports.submission = submission;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(challenge, 'challenge', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/index.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/index.js?");
 
 /***/ }),
 
@@ -1114,7 +1114,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module logger\n    *\n    * @desc\n    * Isomorphic logger.\n    *\n    * At the server-side it outputs log messages to the console, and also sends\n    * them to the https://logentries.com service (only if LOG_ENTRIES_TOKEN is\n    * set).\n    *\n    * At the front-end side it outputs log messages to the console (only when\n    * development build of the frontend is used), and sends them to the\n    * https://logentries.com service (both dev and prod build of the frontend\n    * send messages to the service, proxying them through the App's server;\n    * the proxy will forward them to the service only if LOG_ENTRIES_TOKEN is set).\n    *\n    * In all case, interface of the logger matches that of the standard JS console.\n    *\n    * @todo This module does not belong here, it should be moved to\n    * `topcoder-react-utils`.\n    */\n/* eslint-disable global-require */\n/* eslint-disable no-console */\n\n/* global fetch */\n\n\nvar logger = {};\n_lodash2.default.functions(console).forEach(function (func) {\n  logger[func] = _topcoderReactUtils.isomorphy.isDevBuild() || _topcoderReactUtils.isomorphy.isServerSide() ? console[func] : _lodash2.default.noop;\n});\n\nvar leLogger = void 0;\nif (_topcoderReactUtils.isomorphy.isServerSide()) {\n  var token = _topcoderReactUtils.config.LOG_ENTRIES_TOKEN;\n  if (token) {\n    var LeLogger = __webpack_require__(/*! le_node */ \"le_node\");\n    leLogger = new LeLogger({ token: token });\n  }\n} else {\n  var _log = function _log(type) {\n    for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      rest[_key - 1] = arguments[_key];\n    }\n\n    fetch('/community-app-assets/api/logger', {\n      body: (0, _stringify2.default)({\n        data: rest,\n        type: type\n      }),\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: 'ApiKey ' + _topcoderReactUtils.config.SERVER_API_KEY\n      },\n      method: 'POST'\n    }).catch(function () {\n      /* TODO: Network or server are down. We should msg it to the user somehow\n       */\n    });\n  };\n  leLogger = {\n    err: function err() {\n      for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        rest[_key2] = arguments[_key2];\n      }\n\n      return _log.apply(undefined, ['err'].concat(rest));\n    },\n    info: function info() {\n      for (var _len3 = arguments.length, rest = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        rest[_key3] = arguments[_key3];\n      }\n\n      return _log.apply(undefined, ['info'].concat(rest));\n    },\n    log: function log() {\n      for (var _len4 = arguments.length, rest = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        rest[_key4] = arguments[_key4];\n      }\n\n      return _log.apply(undefined, ['log'].concat(rest));\n    },\n    warning: function warning() {\n      for (var _len5 = arguments.length, rest = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        rest[_key5] = arguments[_key5];\n      }\n\n      return _log.apply(undefined, ['warn'].concat(rest));\n    }\n  };\n}\n\nif (leLogger) {\n  var extend = function extend(base, le) {\n    logger[base] = function () {\n      for (var _len6 = arguments.length, rest = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        rest[_key6] = arguments[_key6];\n      }\n\n      if (_topcoderReactUtils.isomorphy.isDevBuild() || _topcoderReactUtils.isomorphy.isServerSide()) {\n        var _console;\n\n        (_console = console)[base].apply(_console, rest);\n      }\n      var msg = '';\n      rest.forEach(function (item) {\n        var it = item;\n        if (!_lodash2.default.isString(it)) {\n          it = (0, _stringify2.default)(it);\n          if (!_lodash2.default.isString(it)) it = String(it);\n        }\n        msg = '' + msg + it + ' ';\n      });\n      leLogger[le](msg);\n    };\n  };\n  extend('error', 'err');\n  extend('info', 'info');\n  extend('log', 'log');\n  extend('warn', 'warning');\n}\n\nvar _default = logger;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(logger, 'logger', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/logger.js');\n  reactHotLoader.register(leLogger, 'leLogger', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/logger.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/logger.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/logger.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ \"babel-runtime/core-js/json/stringify\");\n\nvar _stringify2 = _interopRequireDefault(_stringify);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _topcoderReactUtils = __webpack_require__(/*! topcoder-react-utils */ \"topcoder-react-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module logger\n    *\n    * @desc\n    * Isomorphic logger.\n    *\n    * At the server-side it outputs log messages to the console, and also sends\n    * them to the https://logentries.com service (only if LOG_ENTRIES_TOKEN is\n    * set).\n    *\n    * At the front-end side it outputs log messages to the console (only when\n    * development build of the frontend is used), and sends them to the\n    * https://logentries.com service (both dev and prod build of the frontend\n    * send messages to the service, proxying them through the App's server;\n    * the proxy will forward them to the service only if LOG_ENTRIES_TOKEN is set).\n    *\n    * In all case, interface of the logger matches that of the standard JS console.\n    *\n    * @todo This module does not belong here, it should be moved to\n    * `topcoder-react-utils`.\n    */\n/* eslint-disable global-require */\n/* eslint-disable no-console */\n\n/* global fetch */\n\n\nvar logger = {};\n_lodash2.default.functions(console).forEach(function (func) {\n  logger[func] = _topcoderReactUtils.isomorphy.isDevBuild() || _topcoderReactUtils.isomorphy.isServerSide() ? console[func] : _lodash2.default.noop;\n});\n\nvar leLogger = void 0;\nif (_topcoderReactUtils.isomorphy.isServerSide()) {\n  var token = _topcoderReactUtils.config.LOG_ENTRIES_TOKEN;\n  if (token) {\n    var LeLogger = __webpack_require__(/*! le_node */ \"le_node\");\n    leLogger = new LeLogger({ token: token });\n  }\n} else {\n  var _log = function _log(type) {\n    for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      rest[_key - 1] = arguments[_key];\n    }\n\n    fetch('/community-app-assets/api/logger', {\n      body: (0, _stringify2.default)({\n        data: rest,\n        type: type\n      }),\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: 'ApiKey ' + _topcoderReactUtils.config.SERVER_API_KEY\n      },\n      method: 'POST'\n    }).catch(function () {\n      /* TODO: Network or server are down. We should msg it to the user somehow\n       */\n    });\n  };\n  leLogger = {\n    err: function err() {\n      for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        rest[_key2] = arguments[_key2];\n      }\n\n      return _log.apply(undefined, ['err'].concat(rest));\n    },\n    info: function info() {\n      for (var _len3 = arguments.length, rest = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        rest[_key3] = arguments[_key3];\n      }\n\n      return _log.apply(undefined, ['info'].concat(rest));\n    },\n    log: function log() {\n      for (var _len4 = arguments.length, rest = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        rest[_key4] = arguments[_key4];\n      }\n\n      return _log.apply(undefined, ['log'].concat(rest));\n    },\n    warning: function warning() {\n      for (var _len5 = arguments.length, rest = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        rest[_key5] = arguments[_key5];\n      }\n\n      return _log.apply(undefined, ['warn'].concat(rest));\n    }\n  };\n}\n\nif (leLogger) {\n  var extend = function extend(base, le) {\n    logger[base] = function () {\n      for (var _len6 = arguments.length, rest = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        rest[_key6] = arguments[_key6];\n      }\n\n      if (_topcoderReactUtils.isomorphy.isDevBuild() || _topcoderReactUtils.isomorphy.isServerSide()) {\n        var _console;\n\n        (_console = console)[base].apply(_console, rest);\n      }\n      var msg = '';\n      rest.forEach(function (item) {\n        var it = item;\n        if (!_lodash2.default.isString(it)) {\n          it = (0, _stringify2.default)(it);\n          if (!_lodash2.default.isString(it)) it = String(it);\n        }\n        msg = '' + msg + it + ' ';\n      });\n      leLogger[le](msg);\n    };\n  };\n  extend('error', 'err');\n  extend('info', 'info');\n  extend('log', 'log');\n  extend('warn', 'warning');\n}\n\nvar _default = logger;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(logger, 'logger', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/logger.js');\n  reactHotLoader.register(leLogger, 'leLogger', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/logger.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/logger.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/logger.js?");
 
 /***/ }),
 
@@ -1126,7 +1126,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.mockAction = mockAction;\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\n/**\n * @module mock\n * @desc Collection of functions useful in unit tests.\n * @todo This will be moved to Jest utils in `topcoder-react-utils` soon.\n */\n\n/**\n * Creates a mock Flux Standard Action creator.\n * TODO: Additional options to set errors, etc. should be added.\n * TODO: It may be handier to return action created wrapped into Jest mock\n *  function.\n * @param {String} type Action type.\n * @param {Any} payload Action payload.\n * @param {Any} error Has error or not.\n */\nfunction mockAction(type, payload, error) {\n  var res = function res() {\n    return { type: type, payload: payload, error: error };\n  };\n  res.toString = function () {\n    return type;\n  };\n  return res;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(mockAction, \"mockAction\", \"/Work/Projects/Topcoder/topcoder-react-lib/src/utils/mock.js\");\n  reactHotLoader.register(_default, \"default\", \"/Work/Projects/Topcoder/topcoder-react-lib/src/utils/mock.js\");\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/mock.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.mockAction = mockAction;\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\n/**\n * @module mock\n * @desc Collection of functions useful in unit tests.\n * @todo This will be moved to Jest utils in `topcoder-react-utils` soon.\n */\n\n/**\n * Creates a mock Flux Standard Action creator.\n * TODO: Additional options to set errors, etc. should be added.\n * TODO: It may be handier to return action created wrapped into Jest mock\n *  function.\n * @param {String} type Action type.\n * @param {Any} payload Action payload.\n * @param {Any} error Has error or not.\n */\nfunction mockAction(type, payload, error) {\n  var res = function res() {\n    return { type: type, payload: payload, error: error };\n  };\n  res.toString = function () {\n    return type;\n  };\n  return res;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(mockAction, \"mockAction\", \"/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/mock.js\");\n  reactHotLoader.register(_default, \"default\", \"/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/mock.js\");\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/mock.js?");
 
 /***/ }),
 
@@ -1138,7 +1138,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getProvisionalScore = getProvisionalScore;\nexports.getFinalScore = getFinalScore;\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\n/**\n * Various submissions functions.\n */\n\n/**\n * Get provisional score of submission\n * @param submission\n */\nfunction getProvisionalScore(submission) {\n  var subs = submission.submissions;\n\n  if (!subs || subs.length === 0) {\n    return 0;\n  }\n  var provisionalScore = subs[0].provisionalScore;\n\n  if (!provisionalScore || provisionalScore < 0) {\n    return 0;\n  }\n  return provisionalScore;\n}\n\n/**\n * Get final score of submission\n * @param submission\n */\nfunction getFinalScore(submission) {\n  var subs = submission.submissions;\n\n  if (!subs || subs.length === 0) {\n    return 0;\n  }\n  var finalScore = subs[0].finalScore;\n\n  if (!finalScore || finalScore < 0) {\n    return 0;\n  }\n  return finalScore;\n}\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(getProvisionalScore, \"getProvisionalScore\", \"/Work/Projects/Topcoder/topcoder-react-lib/src/utils/submission.js\");\n  reactHotLoader.register(getFinalScore, \"getFinalScore\", \"/Work/Projects/Topcoder/topcoder-react-lib/src/utils/submission.js\");\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/submission.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ \"babel-runtime/helpers/toConsumableArray\");\n\nvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\nexports.getProvisionalScore = getProvisionalScore;\nexports.getFinalScore = getFinalScore;\nexports.processMMSubmissions = processMMSubmissions;\n\nvar _lodash = __webpack_require__(/*! lodash */ \"lodash\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * Various submissions functions.\n    */\n/* global CONFIG */\n/* eslint-disable no-param-reassign */\n\n\nvar _CONFIG = {\"AV_SCAN_SCORER_REVIEW_TYPE_ID\":\"68c5a381-c8ab-48af-92a7-7a869a4ee6c3\",\"PAGE_SIZE\":50,\"REVIEW_OPPORTUNITY_PAGE_SIZE\":1000},\n    AV_SCAN_SCORER_REVIEW_TYPE_ID = _CONFIG.AV_SCAN_SCORER_REVIEW_TYPE_ID;\n\n\nfunction removeDecimal(num) {\n  var re = new RegExp('^-?\\\\d+');\n  return num.toString().match(re)[0];\n}\n\nfunction toAcurateFixed(num, decimal) {\n  var re = new RegExp('^-?\\\\d+(?:.\\\\d{0,' + decimal + '})?');\n  return num.toString().match(re)[0];\n}\n\nfunction toFixed(num, decimal) {\n  if (_lodash2.default.isNaN(parseFloat(num))) return num;\n  num = parseFloat(num);\n\n  var result = _lodash2.default.toFinite(toAcurateFixed(num, decimal));\n  var integerResult = _lodash2.default.toFinite(removeDecimal(num));\n\n  if (_lodash2.default.isInteger(result)) {\n    return integerResult;\n  }\n  return result;\n}\n\nfunction getMMChallengeHandleStyle(handle, registrants) {\n  var style = _lodash2.default.get(_lodash2.default.find(registrants, function (m) {\n    return m.handle === handle;\n  }), 'colorStyle', null);\n  if (style) return JSON.parse(style.replace(/(\\w+):\\s*([^;]*)/g, '{\"$1\": \"$2\"}'));\n  return {};\n}\n\n/**\n * Process each submission rank of MM challenge\n * @param submissions the array of submissions\n */\nfunction processRanks(submissions) {\n  var maxFinalScore = 0;\n  submissions.sort(function (a, b) {\n    var pA = _lodash2.default.get(a, 'submissions[0]', { provisionalScore: 0 }).provisionalScore;\n    var pB = _lodash2.default.get(b, 'submissions[0]', { provisionalScore: 0 }).provisionalScore;\n    if (pA === '-') pA = 0;\n    if (pB === '-') pB = 0;\n    if (pA === pB) {\n      var timeA = new Date(_lodash2.default.get(a, 'submissions[0].submissionTime'));\n      var timeB = new Date(_lodash2.default.get(b, 'submissions[0].submissionTime'));\n      return timeA - timeB;\n    }\n    return pB - pA;\n  });\n  _lodash2.default.each(submissions, function (submission, i) {\n    submissions[i].provisionalRank = i + 1;\n  });\n\n  submissions.sort(function (a, b) {\n    var pA = _lodash2.default.get(a, 'submissions[0]', { finalScore: 0 }).finalScore;\n    var pB = _lodash2.default.get(b, 'submissions[0]', { finalScore: 0 }).finalScore;\n    if (pA === '-') pA = 0;\n    if (pB === '-') pB = 0;\n    if (pA > 0) maxFinalScore = pA;\n    if (pB > 0) maxFinalScore = pB;\n    if (pA === pB) {\n      var timeA = new Date(_lodash2.default.get(a, 'submissions[0].submissionTime'));\n      var timeB = new Date(_lodash2.default.get(b, 'submissions[0].submissionTime'));\n      return timeA - timeB;\n    }\n    return pB - pA;\n  });\n  if (maxFinalScore > 0) {\n    _lodash2.default.each(submissions, function (submission, i) {\n      submissions[i].finalRank = i + 1;\n    });\n  }\n  return { submissions: submissions, maxFinalScore: maxFinalScore };\n}\n\n/**\n * Get provisional score of submission\n * @param submission\n */\nfunction getProvisionalScore(submission) {\n  var subs = submission.submissions;\n\n  if (!subs || subs.length === 0) {\n    return 0;\n  }\n  var provisionalScore = subs[0].provisionalScore;\n\n  if (!provisionalScore || provisionalScore < 0) {\n    return 0;\n  }\n  return provisionalScore;\n}\n\n/**\n * Get final score of submission\n * @param submission\n */\nfunction getFinalScore(submission) {\n  var subs = submission.submissions;\n\n  if (!subs || subs.length === 0) {\n    return 0;\n  }\n  var finalScore = subs[0].finalScore;\n\n  if (!finalScore || finalScore < 0) {\n    return 0;\n  }\n  return finalScore;\n}\n\n/**\n * Process submissions of MM challenge\n * @param submissions the array of submissions\n * @param resources the challenge resources\n * @param registrants the challenge registrants\n */\nfunction processMMSubmissions(submissions, resources, registrants) {\n  var data = {};\n  var result = [];\n\n  _lodash2.default.each(submissions, function (submission) {\n    var memberId = submission.memberId;\n\n    var memberHandle = void 0;\n    var resource = _lodash2.default.find(resources, function (r) {\n      return _lodash2.default.get(r, 'userId').toString() === memberId.toString();\n    });\n    if (_lodash2.default.isEmpty(resource)) {\n      memberHandle = memberId;\n    } else {\n      memberHandle = _lodash2.default.has(resource, 'handle') ? _lodash2.default.get(resource, 'handle') : memberId.toString();\n    }\n    if (!data[memberHandle]) {\n      data[memberHandle] = [];\n    }\n    var validReviews = _lodash2.default.filter(submission.review, function (r) {\n      return !_lodash2.default.isEmpty(r) && r.typeId !== AV_SCAN_SCORER_REVIEW_TYPE_ID;\n    });\n    validReviews.sort(function (a, b) {\n      var dateA = new Date(a.created);\n      var dateB = new Date(b.created);\n      return dateB - dateA;\n    });\n\n    var provisionalScore = toFixed(_lodash2.default.get(validReviews, '[0].score', '-'), 5);\n    var finalScore = toFixed(_lodash2.default.get(submission, 'reviewSummation[0].aggregateScore', '-'), 5);\n\n    data[memberHandle].push({\n      submissionId: submission.id,\n      submissionTime: submission.created,\n      provisionalScore: provisionalScore,\n      finalScore: finalScore\n    });\n  });\n\n  _lodash2.default.each(data, function (value, key) {\n    result.push({\n      submissions: [].concat((0, _toConsumableArray3.default)(value.sort(function (a, b) {\n        return new Date(b.submissionTime).getTime() - new Date(a.submissionTime).getTime();\n      }))),\n      member: key,\n      colorStyle: getMMChallengeHandleStyle(key, registrants)\n    });\n  });\n\n  var _processRanks = processRanks(result),\n      finalSubmissions = _processRanks.submissions,\n      maxFinalScore = _processRanks.maxFinalScore;\n\n  finalSubmissions.sort(function (a, b) {\n    if (maxFinalScore === 0) {\n      return a.provisionalRank - b.provisionalRank;\n    }\n    return a.finalRank - b.finalRank;\n  });\n\n  return finalSubmissions;\n}\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(AV_SCAN_SCORER_REVIEW_TYPE_ID, 'AV_SCAN_SCORER_REVIEW_TYPE_ID', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(removeDecimal, 'removeDecimal', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(toAcurateFixed, 'toAcurateFixed', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(toFixed, 'toFixed', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(getMMChallengeHandleStyle, 'getMMChallengeHandleStyle', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(processRanks, 'processRanks', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(getProvisionalScore, 'getProvisionalScore', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(getFinalScore, 'getFinalScore', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(processMMSubmissions, 'processMMSubmissions', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/submission.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/submission.js?");
 
 /***/ }),
 
@@ -1150,7 +1150,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLookerApiResponsePayload = exports.getApiResponsePayload = exports.REVIEW_OPPORTUNITY_TYPES = exports.COMPETITION_TRACKS = undefined;\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Gets payload from a standard success response from TC API; or throws\n * an error in case of a failure response.\n * @param {Object} res\n * @return {Promise} Resolves to the payload.\n */\nvar getApiResponsePayload = exports.getApiResponsePayload = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(res) {\n    var x;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            if (res.ok) {\n              _context.next = 2;\n              break;\n            }\n\n            throw new Error(res.statusText);\n\n          case 2:\n            _context.next = 4;\n            return res.json();\n\n          case 4:\n            x = _context.sent.result;\n\n            if (x.success) {\n              _context.next = 7;\n              break;\n            }\n\n            throw new Error(x.content);\n\n          case 7:\n            return _context.abrupt('return', x.content);\n\n          case 8:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getApiResponsePayload(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * Gets payload from a standard success response from TC LOOKER API; or throws\n * an error in case of a failure response.\n * @param {Object} res\n * @return {Promise} Resolves to the payload.\n */\n\n\nvar getLookerApiResponsePayload = exports.getLookerApiResponsePayload = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(res) {\n    var resJson, x;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return res.json();\n\n          case 2:\n            resJson = _context2.sent;\n\n            if (!Array.isArray(resJson)) {\n              _context2.next = 5;\n              break;\n            }\n\n            return _context2.abrupt('return', {\n              res: resJson,\n              error: false\n            });\n\n          case 5:\n            x = resJson.result;\n            return _context2.abrupt('return', {\n              res: x.content,\n              error: !x.success,\n              status: x.status\n            });\n\n          case 7:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n\n  return function getLookerApiResponsePayload(_x2) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\n/**\n * @module tc\n * @desc Collection of small Topcoder-related functions.\n * @todo More TC-related utils should be moved here from Community-app.\n */\n\n/**\n * Codes of the Topcoder communities.\n */\n/* TODO: These are originally motivated by Topcoder API v2. Topcoder API v3\n * uses upper-case literals to encode the tracks. At some point, we should\n * update it in this code as well! */\nvar COMPETITION_TRACKS = exports.COMPETITION_TRACKS = {\n  DATA_SCIENCE: 'data_science',\n  DESIGN: 'design',\n  DEVELOP: 'develop'\n};\n\n/**\n * Review Opportunity types\n */\nvar REVIEW_OPPORTUNITY_TYPES = exports.REVIEW_OPPORTUNITY_TYPES = {\n  'Contest Review': 'Review',\n  'Spec Review': 'Specification Review',\n  'Iterative Review': 'Iterative Review'\n};;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(COMPETITION_TRACKS, 'COMPETITION_TRACKS', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/tc.js');\n  reactHotLoader.register(REVIEW_OPPORTUNITY_TYPES, 'REVIEW_OPPORTUNITY_TYPES', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/tc.js');\n  reactHotLoader.register(getApiResponsePayload, 'getApiResponsePayload', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/tc.js');\n  reactHotLoader.register(getLookerApiResponsePayload, 'getLookerApiResponsePayload', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/tc.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/tc.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLookerApiResponsePayload = exports.getApiResponsePayload = exports.REVIEW_OPPORTUNITY_TYPES = exports.COMPETITION_TRACKS = undefined;\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Gets payload from a standard success response from TC API; or throws\n * an error in case of a failure response.\n * @param {Object} res\n * @param {Boolean} shouldThrowError should throw error if request fail\n * @return {Promise} Resolves to the payload.\n */\nvar getApiResponsePayload = exports.getApiResponsePayload = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(res) {\n    var shouldThrowError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var x;\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            if (res.ok) {\n              _context.next = 6;\n              break;\n            }\n\n            if (!shouldThrowError) {\n              _context.next = 5;\n              break;\n            }\n\n            throw new Error(res.statusText);\n\n          case 5:\n            return _context.abrupt('return', null);\n\n          case 6:\n            _context.next = 8;\n            return res.json();\n\n          case 8:\n            x = _context.sent.result;\n\n            if (x.success) {\n              _context.next = 15;\n              break;\n            }\n\n            if (!shouldThrowError) {\n              _context.next = 14;\n              break;\n            }\n\n            throw new Error(x.content);\n\n          case 14:\n            return _context.abrupt('return', null);\n\n          case 15:\n            return _context.abrupt('return', x.content);\n\n          case 16:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function getApiResponsePayload(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * Gets payload from a standard success response from TC LOOKER API; or throws\n * an error in case of a failure response.\n * @param {Object} res\n * @return {Promise} Resolves to the payload.\n */\n\n\nvar getLookerApiResponsePayload = exports.getLookerApiResponsePayload = function () {\n  var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(res) {\n    var resJson, x;\n    return _regenerator2.default.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return res.json();\n\n          case 2:\n            resJson = _context2.sent;\n\n            if (!Array.isArray(resJson)) {\n              _context2.next = 5;\n              break;\n            }\n\n            return _context2.abrupt('return', {\n              res: resJson,\n              error: false\n            });\n\n          case 5:\n            x = resJson.result;\n            return _context2.abrupt('return', {\n              res: x.content,\n              error: !x.success,\n              status: x.status\n            });\n\n          case 7:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n\n  return function getLookerApiResponsePayload(_x3) {\n    return _ref2.apply(this, arguments);\n  };\n}();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n};\n\n/**\n * @module tc\n * @desc Collection of small Topcoder-related functions.\n * @todo More TC-related utils should be moved here from Community-app.\n */\n\n/**\n * Codes of the Topcoder communities.\n */\n/* TODO: These are originally motivated by Topcoder API v2. Topcoder API v3\n * uses upper-case literals to encode the tracks. At some point, we should\n * update it in this code as well! */\nvar COMPETITION_TRACKS = exports.COMPETITION_TRACKS = {\n  DATA_SCIENCE: 'data_science',\n  DESIGN: 'design',\n  DEVELOP: 'develop'\n};\n\n/**\n * Review Opportunity types\n */\nvar REVIEW_OPPORTUNITY_TYPES = exports.REVIEW_OPPORTUNITY_TYPES = {\n  'Contest Review': 'Review',\n  'Spec Review': 'Specification Review',\n  'Iterative Review': 'Iterative Review'\n};;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(COMPETITION_TRACKS, 'COMPETITION_TRACKS', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/tc.js');\n  reactHotLoader.register(REVIEW_OPPORTUNITY_TYPES, 'REVIEW_OPPORTUNITY_TYPES', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/tc.js');\n  reactHotLoader.register(getApiResponsePayload, 'getApiResponsePayload', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/tc.js');\n  reactHotLoader.register(getLookerApiResponsePayload, 'getLookerApiResponsePayload', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/tc.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/tc.js?");
 
 /***/ }),
 
@@ -1162,7 +1162,7 @@ eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(ex
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.formatDuration = exports.delay = undefined;\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Returns a Promise that resolves after the specified delay.\n * @param {Number} time Delay [ms].\n * @return {Promise}\n */\nvar delay = exports.delay = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(time) {\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            return _context.abrupt('return', new _promise2.default(function (resolve) {\n              return setTimeout(function () {\n                return resolve();\n              }, time);\n            }));\n\n          case 1:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function delay(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * Standard duration formatting for listings and details\n *\n * @param {Number} time Time in milliseconds\n * @return {String} Formatted duration\n */\n\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\n__webpack_require__(/*! moment-duration-format */ \"moment-duration-format\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module time\n    * @desc Utility functions for time/date related stuff\n    */\n\n\nvar HOUR_MS = 60 * 60 * 1000;\nvar DAY_MS = 24 * HOUR_MS;var formatDuration = exports.formatDuration = function formatDuration(time) {\n  var format = void 0;\n  if (time > DAY_MS) format = 'D[d] H[h]';else if (time > HOUR_MS) format = 'H[h] m[min]';else format = 'm[min] s[s]';\n\n  return _moment2.default.duration(time).format(format);\n};\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(HOUR_MS, 'HOUR_MS', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(DAY_MS, 'DAY_MS', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(delay, 'delay', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(formatDuration, 'formatDuration', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(_default, 'default', '/Work/Projects/Topcoder/topcoder-react-lib/src/utils/time.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/time.js?");
+eval("/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.formatDuration = exports.delay = undefined;\n\nvar _regenerator = __webpack_require__(/*! babel-runtime/regenerator */ \"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _promise = __webpack_require__(/*! babel-runtime/core-js/promise */ \"babel-runtime/core-js/promise\");\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nvar _asyncToGenerator2 = __webpack_require__(/*! babel-runtime/helpers/asyncToGenerator */ \"babel-runtime/helpers/asyncToGenerator\");\n\nvar _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);\n\n/**\n * Returns a Promise that resolves after the specified delay.\n * @param {Number} time Delay [ms].\n * @return {Promise}\n */\nvar delay = exports.delay = function () {\n  var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(time) {\n    return _regenerator2.default.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            return _context.abrupt('return', new _promise2.default(function (resolve) {\n              return setTimeout(function () {\n                return resolve();\n              }, time);\n            }));\n\n          case 1:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n\n  return function delay(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\n/**\n * Standard duration formatting for listings and details\n *\n * @param {Number} time Time in milliseconds\n * @return {String} Formatted duration\n */\n\n\nvar _moment = __webpack_require__(/*! moment */ \"moment\");\n\nvar _moment2 = _interopRequireDefault(_moment);\n\n__webpack_require__(/*! moment-duration-format */ \"moment-duration-format\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n  var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;\n  enterModule && enterModule(module);\n})();\n\nvar __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {\n  return a;\n}; /**\n    * @module time\n    * @desc Utility functions for time/date related stuff\n    */\n\n\nvar HOUR_MS = 60 * 60 * 1000;\nvar DAY_MS = 24 * HOUR_MS;var formatDuration = exports.formatDuration = function formatDuration(time) {\n  var format = void 0;\n  if (time > DAY_MS) format = 'D[d] H[h]';else if (time > HOUR_MS) format = 'H[h] m[min]';else format = 'm[min] s[s]';\n\n  return _moment2.default.duration(time).format(format);\n};\n\nvar _default = undefined;\nexports.default = _default;\n;\n\n(function () {\n  var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;\n\n  if (!reactHotLoader) {\n    return;\n  }\n\n  reactHotLoader.register(HOUR_MS, 'HOUR_MS', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(DAY_MS, 'DAY_MS', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(delay, 'delay', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(formatDuration, 'formatDuration', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/time.js');\n  reactHotLoader.register(_default, 'default', '/Users/gurmeetb/Desktop/topcoder/private_tasks/appirio-tech/community-apps/topcoder-react-lib/src/utils/time.js');\n})();\n\n;\n\n(function () {\n  var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;\n  leaveModule && leaveModule(module);\n})();\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://topcoder-react-lib/./src/utils/time.js?");
 
 /***/ }),
 
diff --git a/docs/actions.lookup.md b/docs/actions.lookup.md
index 7d0b385d..4f41f5d5 100644
--- a/docs/actions.lookup.md
+++ b/docs/actions.lookup.md
@@ -9,22 +9,34 @@ Actions related to lookup data.
     * [.getSkillTagsDone()](#module_actions.lookup.getSkillTagsDone) ⇒ <code>Action</code>
     * [.getCountriesInit()](#module_actions.lookup.getCountriesInit) ⇒ <code>Action</code>
     * [.getCountriesDone()](#module_actions.lookup.getCountriesDone) ⇒ <code>Action</code>
+    * [.getAllCountriesInit()](#module_actions.lookup.getCountriesInit) ⇒ <code>Action</code>
+    * [.getAllCountriesDone(tokenV3)](#module_actions.lookup.getCountriesDone) ⇒ <code>Action</code>
 
 <a name="module_actions.lookup.getSkillTagsInit"></a>
 
 ### actions.lookup.getSkillTagsInit() ⇒ <code>Action</code>
 Creates an action that signals beginning of getting all skill tags.
 
-**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)  
+**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)
 <a name="module_actions.lookup.getSkillTagsDone"></a>
 
 ### actions.lookup.getSkillTagsDone() ⇒ <code>Action</code>
 Creates an action that gets all skill tags.
 
-**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)  
+**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)
 <a name="module_actions.lookup.getCountriesDone"></a>
 
 ### actions.lookup.getCountriesDone() ⇒ <code>Action</code>
 Creates an action that gets all countries.
 
-**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)  
+**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)
+<a name="module_actions.lookup.getCountriesDone"></a>
+
+### actions.lookup.getAllCountriesDone(tokenV3) ⇒ <code>Action</code>
+Creates an action that gets all countries new version.
+
+**Kind**: static method of [<code>actions.lookup</code>](#module_actions.lookup)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| tokenV3 | <code>String</code> | Topcoder v3 auth token. |
diff --git a/docs/services.members.md b/docs/services.members.md
index e13b9a46..856b90ce 100644
--- a/docs/services.members.md
+++ b/docs/services.members.md
@@ -114,7 +114,7 @@ Gets member external account info.
 
 | Param | Type |
 | --- | --- |
-| handle | <code>String</code> | 
+| handle | <code>String</code> |
 
 <a name="module_services.members..MembersService+getExternalLinks"></a>
 
@@ -126,7 +126,7 @@ Gets member external links.
 
 | Param | Type |
 | --- | --- |
-| handle | <code>String</code> | 
+| handle | <code>String</code> |
 
 <a name="module_services.members..MembersService+getSkills"></a>
 
@@ -138,7 +138,7 @@ Gets member skills.
 
 | Param | Type |
 | --- | --- |
-| handle | <code>String</code> | 
+| handle | <code>String</code> |
 
 <a name="module_services.members..MembersService+getStats"></a>
 
@@ -150,7 +150,7 @@ Gets member statistics.
 
 | Param | Type |
 | --- | --- |
-| handle | <code>String</code> | 
+| handle | <code>String</code> |
 
 <a name="module_services.members..MembersService+getStatsHistory"></a>
 
@@ -162,7 +162,7 @@ Gets member statistics history
 
 | Param | Type |
 | --- | --- |
-| handle | <code>String</code> | 
+| handle | <code>String</code> |
 
 <a name="module_services.members..MembersService+getStatsDistribution"></a>
 
@@ -174,9 +174,9 @@ Gets member statistics distribution
 
 | Param | Type |
 | --- | --- |
-| handle | <code>String</code> | 
-| track | <code>String</code> | 
-| subTrack | <code>String</code> | 
+| handle | <code>String</code> |
+| track | <code>String</code> |
+| subTrack | <code>String</code> |
 
 <a name="module_services.members..MembersService+getMemberSuggestions"></a>
 
diff --git a/package-lock.json b/package-lock.json
index 2a19c991..1f35c473 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "topcoder-react-lib",
-  "version": "0.8.0",
+  "version": "0.8.3",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -18034,7 +18034,7 @@
       }
     },
     "tc-accounts": {
-      "version": "git+https://github.com/appirio-tech/accounts-app.git#d4743ba945ced283d27667af91cd844bf8db562d",
+      "version": "git+https://github.com/appirio-tech/accounts-app.git#4f11c2bf865751a18f795e6689c267cb24bacdf2",
       "requires": {
         "@uirouter/angularjs": "1.0.18",
         "angucomplete-alt": "2.5.0",
@@ -18044,7 +18044,7 @@
         "angular-messages": "1.7.2",
         "appirio-tech-ng-iso-constants": "1.0.6",
         "appirio-tech-ng-ui-components": "2.2.5",
-        "appirio-tech-react-components": "github:appirio-tech/react-components#767db77401edbee8ec6ff955b5a72a51ba93c755",
+        "appirio-tech-react-components": "github:appirio-tech/react-components#a471d4f9d1a4cd5a1a2f53aea3d1cc5dd6d78aea",
         "auth0-js": "9.6.1",
         "babel-polyfill": "6.26.0",
         "filestack-js": "1.14.6",
@@ -18059,9 +18059,9 @@
       },
       "dependencies": {
         "@babel/runtime": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz",
-          "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==",
+          "version": "7.6.3",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+          "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
           "requires": {
             "regenerator-runtime": "^0.13.2"
           },
@@ -18117,12 +18117,14 @@
         "abbrev": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-          "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+          "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+          "dev": true
         },
         "accepts": {
           "version": "1.3.5",
           "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
           "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+          "dev": true,
           "requires": {
             "mime-types": "~2.1.18",
             "negotiator": "0.6.1"
@@ -18137,6 +18139,7 @@
           "version": "1.0.9",
           "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
           "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
+          "dev": true,
           "requires": {
             "acorn": "^2.1.0"
           },
@@ -18144,7 +18147,8 @@
             "acorn": {
               "version": "2.7.0",
               "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
-              "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
+              "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+              "dev": true
             }
           }
         },
@@ -18152,6 +18156,7 @@
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
           "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+          "dev": true,
           "requires": {
             "acorn": "^3.0.4"
           },
@@ -18159,7 +18164,8 @@
             "acorn": {
               "version": "3.3.0",
               "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-              "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+              "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+              "dev": true
             }
           }
         },
@@ -18182,6 +18188,7 @@
           "version": "4.11.8",
           "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
           "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+          "dev": true,
           "requires": {
             "co": "^4.6.0",
             "json-stable-stringify": "^1.0.1"
@@ -18190,7 +18197,8 @@
         "ajv-keywords": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
-          "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw="
+          "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
+          "dev": true
         },
         "align-text": {
           "version": "0.1.4",
@@ -18205,7 +18213,8 @@
         "alphanum-sort": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
-          "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+          "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+          "dev": true
         },
         "amdefine": {
           "version": "1.0.1",
@@ -18244,7 +18253,8 @@
         "angular-mocks": {
           "version": "1.7.2",
           "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.7.2.tgz",
-          "integrity": "sha512-yj9eWPG0usXX2eDTWM6YOmAGKraT7qHwuD+NrNyaR+mtrNr2ls77WuWXTjE1hZpmxTaGj4+R1nMY696XZn740Q=="
+          "integrity": "sha512-yj9eWPG0usXX2eDTWM6YOmAGKraT7qHwuD+NrNyaR+mtrNr2ls77WuWXTjE1hZpmxTaGj4+R1nMY696XZn740Q==",
+          "dev": true
         },
         "angular-scroll": {
           "version": "1.0.2",
@@ -18254,22 +18264,26 @@
         "ansi-escapes": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
-          "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+          "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+          "dev": true
         },
         "ansi-regex": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
         },
         "ansi-styles": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
         },
         "anymatch": {
           "version": "1.3.2",
           "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
           "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+          "dev": true,
           "requires": {
             "micromatch": "^2.1.5",
             "normalize-path": "^2.0.0"
@@ -18279,6 +18293,7 @@
           "version": "0.0.30",
           "resolved": "https://registry.npmjs.org/appirio-styles/-/appirio-styles-0.0.30.tgz",
           "integrity": "sha1-VZx5umDjDW/2Ib2r+RvUeRTTzGE=",
+          "dev": true,
           "requires": {
             "node-neat": "~1.7.1-beta1"
           }
@@ -18524,7 +18539,7 @@
           }
         },
         "appirio-tech-react-components": {
-          "version": "github:appirio-tech/react-components#767db77401edbee8ec6ff955b5a72a51ba93c755",
+          "version": "github:appirio-tech/react-components#a471d4f9d1a4cd5a1a2f53aea3d1cc5dd6d78aea",
           "requires": {
             "appirio-tech-api-schemas": "5.0.70",
             "appirio-tech-client-app-layer": "0.1.3",
@@ -18533,7 +18548,7 @@
             "coffeescript": "1.12.7",
             "formsy-react": "0.19.5",
             "isomorphic-fetch": "2.2.1",
-            "libphonenumber-js": "1.7.23",
+            "libphonenumber-js": "1.7.26",
             "lodash": "4.17.10",
             "material-ui": "0.20.2",
             "moment": "2.24.0",
@@ -18546,6 +18561,7 @@
             "react-dom": "15.6.2",
             "react-dropzone": "3.13.4",
             "react-popper": "0.7.5",
+            "react-portal": "4.2.0",
             "react-redux": "4.4.9",
             "react-router-dom": "4.3.1",
             "react-select": "0.9.1",
@@ -18596,6 +18612,7 @@
           "version": "0.3.20",
           "resolved": "https://registry.npmjs.org/appirio-tech-webpack-config/-/appirio-tech-webpack-config-0.3.20.tgz",
           "integrity": "sha1-6Z+WPo2AW0dqiSGQuooOTvINu1U=",
+          "dev": true,
           "requires": {
             "angular-mocks": "^1.4.8",
             "appirio-styles": "0.x.x",
@@ -18632,12 +18649,14 @@
         "aproba": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-          "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+          "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+          "dev": true
         },
         "are-we-there-yet": {
           "version": "1.1.5",
           "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
           "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+          "dev": true,
           "requires": {
             "delegates": "^1.0.0",
             "readable-stream": "^2.0.6"
@@ -18647,6 +18666,7 @@
           "version": "1.0.10",
           "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
           "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "dev": true,
           "requires": {
             "sprintf-js": "~1.0.2"
           }
@@ -18655,6 +18675,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
           "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+          "dev": true,
           "requires": {
             "arr-flatten": "^1.0.1"
           }
@@ -18662,22 +18683,26 @@
         "arr-flatten": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-          "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+          "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+          "dev": true
         },
         "array-find-index": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-          "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
+          "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+          "dev": true
         },
         "array-flatten": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+          "dev": true
         },
         "array-union": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
           "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "dev": true,
           "requires": {
             "array-uniq": "^1.0.1"
           }
@@ -18685,17 +18710,20 @@
         "array-uniq": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-          "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+          "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+          "dev": true
         },
         "array-unique": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+          "dev": true
         },
         "arrify": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+          "dev": true
         },
         "asap": {
           "version": "2.0.6",
@@ -18705,12 +18733,14 @@
         "asn1": {
           "version": "0.2.3",
           "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
-          "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
+          "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+          "dev": true
         },
         "assert": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
           "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+          "dev": true,
           "requires": {
             "util": "0.10.3"
           },
@@ -18718,12 +18748,14 @@
             "inherits": {
               "version": "2.0.1",
               "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-              "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+              "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+              "dev": true
             },
             "util": {
               "version": "0.10.3",
               "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
               "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+              "dev": true,
               "requires": {
                 "inherits": "2.0.1"
               }
@@ -18733,7 +18765,8 @@
         "assert-plus": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
-          "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
+          "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+          "dev": true
         },
         "ast-types": {
           "version": "0.9.6",
@@ -18748,12 +18781,14 @@
         "async-each": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-          "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+          "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+          "dev": true
         },
         "async-foreach": {
           "version": "0.1.3",
           "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
-          "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
+          "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+          "dev": true
         },
         "asynckit": {
           "version": "0.4.0",
@@ -18769,9 +18804,9 @@
           },
           "dependencies": {
             "core-js": {
-              "version": "2.6.9",
-              "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
-              "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
+              "version": "2.6.10",
+              "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
+              "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA=="
             }
           }
         },
@@ -18801,6 +18836,7 @@
           "version": "6.7.7",
           "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
           "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+          "dev": true,
           "requires": {
             "browserslist": "^1.7.6",
             "caniuse-db": "^1.0.30000634",
@@ -18814,6 +18850,7 @@
           "version": "2.0.31",
           "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.0.31.tgz",
           "integrity": "sha1-5yzx/caQFb2f0r3z07iMFlB9Jo4=",
+          "dev": true,
           "requires": {
             "xml2js": "0.2.6",
             "xmlbuilder": "0.4.2"
@@ -18822,12 +18859,14 @@
         "aws-sign2": {
           "version": "0.6.0",
           "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
-          "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
+          "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+          "dev": true
         },
         "aws4": {
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
-          "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
+          "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
+          "dev": true
         },
         "axios": {
           "version": "0.8.1",
@@ -18860,6 +18899,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
           "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+          "dev": true,
           "requires": {
             "chalk": "^1.1.3",
             "esutils": "^2.0.2",
@@ -18870,6 +18910,7 @@
           "version": "6.26.3",
           "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
           "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+          "dev": true,
           "requires": {
             "babel-code-frame": "^6.26.0",
             "babel-generator": "^6.26.0",
@@ -18896,6 +18937,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -18903,7 +18945,8 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             }
           }
         },
@@ -18911,6 +18954,7 @@
           "version": "6.26.1",
           "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
           "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+          "dev": true,
           "requires": {
             "babel-messages": "^6.23.0",
             "babel-runtime": "^6.26.0",
@@ -18925,7 +18969,8 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             }
           }
         },
@@ -18933,6 +18978,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
           "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-traverse": "^6.24.1",
@@ -18943,6 +18989,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
           "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+          "dev": true,
           "requires": {
             "babel-helper-explode-assignable-expression": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -18953,6 +19000,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
           "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.26.0",
             "babel-types": "^6.26.0",
@@ -18963,6 +19011,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
           "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+          "dev": true,
           "requires": {
             "babel-helper-hoist-variables": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -18974,6 +19023,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
           "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+          "dev": true,
           "requires": {
             "babel-helper-function-name": "^6.24.1",
             "babel-runtime": "^6.26.0",
@@ -18985,6 +19035,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
           "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-traverse": "^6.24.1",
@@ -18995,6 +19046,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
           "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+          "dev": true,
           "requires": {
             "babel-helper-bindify-decorators": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19006,6 +19058,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
           "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+          "dev": true,
           "requires": {
             "babel-helper-get-function-arity": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19018,6 +19071,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
           "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-types": "^6.24.1"
@@ -19027,6 +19081,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
           "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-types": "^6.24.1"
@@ -19036,6 +19091,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
           "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-types": "^6.24.1"
@@ -19045,6 +19101,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
           "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.26.0",
             "babel-types": "^6.26.0",
@@ -19055,6 +19112,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
           "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+          "dev": true,
           "requires": {
             "babel-helper-function-name": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19067,6 +19125,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
           "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+          "dev": true,
           "requires": {
             "babel-helper-optimise-call-expression": "^6.24.1",
             "babel-messages": "^6.23.0",
@@ -19080,6 +19139,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
           "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-template": "^6.24.1"
@@ -19089,6 +19149,7 @@
           "version": "6.4.1",
           "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz",
           "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=",
+          "dev": true,
           "requires": {
             "find-cache-dir": "^0.1.1",
             "loader-utils": "^0.2.16",
@@ -19099,7 +19160,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -19107,6 +19169,7 @@
           "version": "6.23.0",
           "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
           "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19115,6 +19178,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
           "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19123,6 +19187,7 @@
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-2.3.0.tgz",
           "integrity": "sha1-QWbI88pSqpW+nhg50kWD5wqFfsI=",
+          "dev": true,
           "requires": {
             "lodash": "^4.0.0"
           }
@@ -19130,57 +19195,68 @@
         "babel-plugin-syntax-async-functions": {
           "version": "6.13.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
-          "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU="
+          "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+          "dev": true
         },
         "babel-plugin-syntax-async-generators": {
           "version": "6.13.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
-          "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o="
+          "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+          "dev": true
         },
         "babel-plugin-syntax-class-properties": {
           "version": "6.13.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
-          "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94="
+          "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
+          "dev": true
         },
         "babel-plugin-syntax-decorators": {
           "version": "6.13.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
-          "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs="
+          "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
+          "dev": true
         },
         "babel-plugin-syntax-dynamic-import": {
           "version": "6.18.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
-          "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo="
+          "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+          "dev": true
         },
         "babel-plugin-syntax-exponentiation-operator": {
           "version": "6.13.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
-          "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4="
+          "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+          "dev": true
         },
         "babel-plugin-syntax-flow": {
           "version": "6.18.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
-          "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0="
+          "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=",
+          "dev": true
         },
         "babel-plugin-syntax-jsx": {
           "version": "6.18.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
-          "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+          "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
+          "dev": true
         },
         "babel-plugin-syntax-object-rest-spread": {
           "version": "6.13.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
-          "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+          "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+          "dev": true
         },
         "babel-plugin-syntax-trailing-function-commas": {
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
-          "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM="
+          "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+          "dev": true
         },
         "babel-plugin-transform-async-generator-functions": {
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
           "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+          "dev": true,
           "requires": {
             "babel-helper-remap-async-to-generator": "^6.24.1",
             "babel-plugin-syntax-async-generators": "^6.5.0",
@@ -19191,6 +19267,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
           "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+          "dev": true,
           "requires": {
             "babel-helper-remap-async-to-generator": "^6.24.1",
             "babel-plugin-syntax-async-functions": "^6.8.0",
@@ -19201,6 +19278,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
           "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+          "dev": true,
           "requires": {
             "babel-helper-function-name": "^6.24.1",
             "babel-plugin-syntax-class-properties": "^6.8.0",
@@ -19212,6 +19290,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
           "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+          "dev": true,
           "requires": {
             "babel-helper-explode-class": "^6.24.1",
             "babel-plugin-syntax-decorators": "^6.13.0",
@@ -19224,6 +19303,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
           "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19232,6 +19312,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
           "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19240,6 +19321,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
           "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.26.0",
             "babel-template": "^6.26.0",
@@ -19252,6 +19334,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
           "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+          "dev": true,
           "requires": {
             "babel-helper-define-map": "^6.24.1",
             "babel-helper-function-name": "^6.24.1",
@@ -19268,6 +19351,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
           "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-template": "^6.24.1"
@@ -19277,6 +19361,7 @@
           "version": "6.23.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
           "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19285,6 +19370,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
           "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-types": "^6.24.1"
@@ -19294,6 +19380,7 @@
           "version": "6.23.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
           "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19302,6 +19389,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
           "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+          "dev": true,
           "requires": {
             "babel-helper-function-name": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19312,6 +19400,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
           "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19320,6 +19409,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
           "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+          "dev": true,
           "requires": {
             "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19330,6 +19420,7 @@
           "version": "6.26.2",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
           "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+          "dev": true,
           "requires": {
             "babel-plugin-transform-strict-mode": "^6.24.1",
             "babel-runtime": "^6.26.0",
@@ -19341,6 +19432,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
           "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+          "dev": true,
           "requires": {
             "babel-helper-hoist-variables": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19351,6 +19443,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
           "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+          "dev": true,
           "requires": {
             "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19361,6 +19454,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
           "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+          "dev": true,
           "requires": {
             "babel-helper-replace-supers": "^6.24.1",
             "babel-runtime": "^6.22.0"
@@ -19370,6 +19464,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
           "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+          "dev": true,
           "requires": {
             "babel-helper-call-delegate": "^6.24.1",
             "babel-helper-get-function-arity": "^6.24.1",
@@ -19383,6 +19478,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
           "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-types": "^6.24.1"
@@ -19392,6 +19488,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
           "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19400,6 +19497,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
           "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+          "dev": true,
           "requires": {
             "babel-helper-regex": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19410,6 +19508,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
           "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19418,6 +19517,7 @@
           "version": "6.23.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
           "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19426,6 +19526,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
           "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+          "dev": true,
           "requires": {
             "babel-helper-regex": "^6.24.1",
             "babel-runtime": "^6.22.0",
@@ -19436,6 +19537,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
           "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+          "dev": true,
           "requires": {
             "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
             "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
@@ -19446,6 +19548,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
           "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-flow": "^6.18.0",
             "babel-runtime": "^6.22.0"
@@ -19455,6 +19558,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
           "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-object-rest-spread": "^6.8.0",
             "babel-runtime": "^6.26.0"
@@ -19464,6 +19568,7 @@
           "version": "6.25.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
           "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0"
           }
@@ -19472,6 +19577,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
           "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+          "dev": true,
           "requires": {
             "babel-helper-builder-react-jsx": "^6.24.1",
             "babel-plugin-syntax-jsx": "^6.8.0",
@@ -19482,6 +19588,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
           "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-jsx": "^6.8.0",
             "babel-runtime": "^6.22.0"
@@ -19491,6 +19598,7 @@
           "version": "6.22.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
           "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-jsx": "^6.8.0",
             "babel-runtime": "^6.22.0"
@@ -19500,6 +19608,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
           "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+          "dev": true,
           "requires": {
             "regenerator-transform": "^0.10.0"
           }
@@ -19508,6 +19617,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
           "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.22.0",
             "babel-types": "^6.24.1"
@@ -19534,6 +19644,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
           "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+          "dev": true,
           "requires": {
             "babel-plugin-check-es2015-constants": "^6.22.0",
             "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
@@ -19565,6 +19676,7 @@
           "version": "6.23.0",
           "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
           "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
+          "dev": true,
           "requires": {
             "babel-plugin-transform-flow-strip-types": "^6.22.0"
           }
@@ -19573,6 +19685,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
           "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-jsx": "^6.3.13",
             "babel-plugin-transform-react-display-name": "^6.23.0",
@@ -19586,6 +19699,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
           "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-dynamic-import": "^6.18.0",
             "babel-plugin-transform-class-properties": "^6.24.1",
@@ -19597,6 +19711,7 @@
           "version": "6.24.1",
           "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
           "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+          "dev": true,
           "requires": {
             "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
             "babel-plugin-transform-async-generator-functions": "^6.24.1",
@@ -19609,6 +19724,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
           "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+          "dev": true,
           "requires": {
             "babel-core": "^6.26.0",
             "babel-runtime": "^6.26.0",
@@ -19622,7 +19738,8 @@
             "core-js": {
               "version": "2.5.7",
               "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
-              "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
+              "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
+              "dev": true
             }
           }
         },
@@ -19651,6 +19768,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
           "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.26.0",
             "babel-traverse": "^6.26.0",
@@ -19663,6 +19781,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
           "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+          "dev": true,
           "requires": {
             "babel-code-frame": "^6.26.0",
             "babel-messages": "^6.23.0",
@@ -19679,6 +19798,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -19689,6 +19809,7 @@
           "version": "6.26.0",
           "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
           "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.26.0",
             "esutils": "^2.0.2",
@@ -19699,7 +19820,8 @@
         "babylon": {
           "version": "6.18.0",
           "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-          "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+          "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+          "dev": true
         },
         "balanced-match": {
           "version": "1.0.0",
@@ -19719,12 +19841,14 @@
         "batch": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
-          "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
+          "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+          "dev": true
         },
         "bcrypt-pbkdf": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
           "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+          "dev": true,
           "optional": true,
           "requires": {
             "tweetnacl": "^0.14.3"
@@ -19733,17 +19857,20 @@
         "big.js": {
           "version": "3.2.0",
           "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
-          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
+          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+          "dev": true
         },
         "binary-extensions": {
           "version": "1.11.0",
           "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
-          "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
+          "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+          "dev": true
         },
         "block-stream": {
           "version": "0.0.9",
           "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
           "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+          "dev": true,
           "requires": {
             "inherits": "~2.0.0"
           }
@@ -19762,6 +19889,7 @@
           "version": "1.18.2",
           "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
           "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+          "dev": true,
           "requires": {
             "bytes": "3.0.0",
             "content-type": "~1.0.4",
@@ -19779,6 +19907,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -19786,24 +19915,28 @@
             "iconv-lite": {
               "version": "0.4.19",
               "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
-              "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+              "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+              "dev": true
             },
             "qs": {
               "version": "6.5.1",
               "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-              "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+              "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+              "dev": true
             }
           }
         },
         "boolbase": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-          "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+          "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+          "dev": true
         },
         "boom": {
           "version": "2.10.1",
           "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
           "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+          "dev": true,
           "requires": {
             "hoek": "2.x.x"
           }
@@ -19836,6 +19969,7 @@
           "version": "1.8.5",
           "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
           "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+          "dev": true,
           "requires": {
             "expand-range": "^1.8.1",
             "preserve": "^0.2.0",
@@ -19846,6 +19980,7 @@
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz",
           "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=",
+          "dev": true,
           "requires": {
             "inherits": "^2.0.1"
           }
@@ -19854,6 +19989,7 @@
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
           "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+          "dev": true,
           "requires": {
             "pako": "~0.2.0"
           }
@@ -19862,6 +19998,7 @@
           "version": "1.7.7",
           "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
           "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
           "requires": {
             "caniuse-db": "^1.0.30000639",
             "electron-to-chromium": "^1.2.7"
@@ -19871,6 +20008,7 @@
           "version": "4.9.1",
           "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
           "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+          "dev": true,
           "requires": {
             "base64-js": "^1.0.2",
             "ieee754": "^1.1.4",
@@ -19880,27 +20018,32 @@
         "buffer-from": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
-          "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ=="
+          "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
+          "dev": true
         },
         "builtin-modules": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-          "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+          "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+          "dev": true
         },
         "builtin-status-codes": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-          "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+          "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+          "dev": true
         },
         "bytes": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+          "dev": true
         },
         "caller-path": {
           "version": "0.1.0",
           "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
           "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+          "dev": true,
           "requires": {
             "callsites": "^0.2.0"
           }
@@ -19908,12 +20051,14 @@
         "callsites": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
-          "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
+          "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+          "dev": true
         },
         "camel-case": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
           "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+          "dev": true,
           "requires": {
             "no-case": "^2.2.0",
             "upper-case": "^1.1.1"
@@ -19928,6 +20073,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
           "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+          "dev": true,
           "requires": {
             "camelcase": "^2.0.0",
             "map-obj": "^1.0.0"
@@ -19936,7 +20082,8 @@
             "camelcase": {
               "version": "2.1.1",
               "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-              "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
+              "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+              "dev": true
             }
           }
         },
@@ -19944,6 +20091,7 @@
           "version": "1.6.1",
           "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
           "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+          "dev": true,
           "requires": {
             "browserslist": "^1.3.6",
             "caniuse-db": "^1.0.30000529",
@@ -19954,17 +20102,20 @@
         "caniuse-db": {
           "version": "1.0.30000861",
           "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000861.tgz",
-          "integrity": "sha1-byeEChMMEMCx4A+rdynB+vj0zNM="
+          "integrity": "sha1-byeEChMMEMCx4A+rdynB+vj0zNM=",
+          "dev": true
         },
         "caseless": {
           "version": "0.12.0",
           "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-          "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+          "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+          "dev": true
         },
         "cdnizer": {
           "version": "1.1.6",
           "resolved": "https://registry.npmjs.org/cdnizer/-/cdnizer-1.1.6.tgz",
           "integrity": "sha1-wVGF0b7UKwPppFqp+lWObYcr0Sw=",
+          "dev": true,
           "requires": {
             "cdnjs-cdn-data": "^0.1.1",
             "google-cdn-data": "^0.1.6",
@@ -19977,7 +20128,8 @@
             "lodash": {
               "version": "2.4.2",
               "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
-              "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4="
+              "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
+              "dev": true
             }
           }
         },
@@ -19985,6 +20137,7 @@
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/cdnjs-cdn-data/-/cdnjs-cdn-data-0.1.2.tgz",
           "integrity": "sha1-hl00uk5I3Rtz/WaOJKYaWt+biyE=",
+          "dev": true,
           "requires": {
             "semver": "~5.0.1"
           },
@@ -19992,7 +20145,8 @@
             "semver": {
               "version": "5.0.3",
               "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
-              "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no="
+              "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+              "dev": true
             }
           }
         },
@@ -20014,6 +20168,7 @@
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
           "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
           "requires": {
             "ansi-styles": "^2.2.1",
             "escape-string-regexp": "^1.0.2",
@@ -20072,7 +20227,8 @@
         "character-parser": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz",
-          "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY="
+          "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=",
+          "dev": true
         },
         "charenc": {
           "version": "0.0.2",
@@ -20083,6 +20239,7 @@
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
           "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+          "dev": true,
           "requires": {
             "anymatch": "^1.3.0",
             "async-each": "^1.0.0",
@@ -20098,12 +20255,14 @@
         "circular-json": {
           "version": "0.3.3",
           "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
-          "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
+          "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+          "dev": true
         },
         "cjsx-loader": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/cjsx-loader/-/cjsx-loader-2.1.0.tgz",
           "integrity": "sha1-14OVnJfX4dN0tE2qvvZcoIs6Ozs=",
+          "dev": true,
           "requires": {
             "coffee-react-transform": "^3.0.0",
             "loader-utils": "0.2.x"
@@ -20113,6 +20272,7 @@
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
           "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
+          "dev": true,
           "requires": {
             "chalk": "^1.1.3"
           }
@@ -20126,6 +20286,7 @@
           "version": "4.1.11",
           "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
           "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+          "dev": true,
           "requires": {
             "source-map": "0.5.x"
           },
@@ -20133,7 +20294,8 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             }
           }
         },
@@ -20141,6 +20303,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
           "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+          "dev": true,
           "requires": {
             "restore-cursor": "^1.0.1"
           }
@@ -20148,7 +20311,8 @@
         "cli-width": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-          "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+          "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+          "dev": true
         },
         "cliui": {
           "version": "2.1.0",
@@ -20170,17 +20334,20 @@
         "clone": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+          "dev": true
         },
         "co": {
           "version": "4.6.0",
           "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-          "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+          "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+          "dev": true
         },
         "coa": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
           "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+          "dev": true,
           "requires": {
             "q": "^1.1.2"
           }
@@ -20188,12 +20355,14 @@
         "code-point-at": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-          "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+          "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+          "dev": true
         },
         "coffee-loader": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/coffee-loader/-/coffee-loader-0.7.3.tgz",
           "integrity": "sha1-+tvG79b8fsyIxbMEaiwpIGa8tUo=",
+          "dev": true,
           "requires": {
             "loader-utils": "^1.0.2"
           },
@@ -20202,6 +20371,7 @@
               "version": "1.1.0",
               "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
               "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+              "dev": true,
               "requires": {
                 "big.js": "^3.1.3",
                 "emojis-list": "^2.0.0",
@@ -20213,7 +20383,8 @@
         "coffee-react-transform": {
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/coffee-react-transform/-/coffee-react-transform-3.3.0.tgz",
-          "integrity": "sha1-8fkPoi3o12f8onk+O3Dw99ei5Gc="
+          "integrity": "sha1-8fkPoi3o12f8onk+O3Dw99ei5Gc=",
+          "dev": true
         },
         "coffee-script": {
           "version": "1.12.7",
@@ -20224,6 +20395,7 @@
           "version": "0.11.4",
           "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
           "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+          "dev": true,
           "requires": {
             "clone": "^1.0.2",
             "color-convert": "^1.3.0",
@@ -20234,6 +20406,7 @@
           "version": "1.9.2",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
           "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
+          "dev": true,
           "requires": {
             "color-name": "1.1.1"
           }
@@ -20241,12 +20414,14 @@
         "color-name": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
-          "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok="
+          "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
+          "dev": true
         },
         "color-string": {
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
           "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+          "dev": true,
           "requires": {
             "color-name": "^1.0.0"
           }
@@ -20255,6 +20430,7 @@
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
           "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+          "dev": true,
           "requires": {
             "color": "^0.11.0",
             "css-color-names": "0.0.4",
@@ -20264,7 +20440,8 @@
         "colors": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-          "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
+          "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+          "dev": true
         },
         "combined-stream": {
           "version": "1.0.6",
@@ -20282,7 +20459,8 @@
         "commondir": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-          "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+          "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+          "dev": true
         },
         "commoner": {
           "version": "0.10.8",
@@ -20322,6 +20500,7 @@
           "version": "2.0.14",
           "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz",
           "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=",
+          "dev": true,
           "requires": {
             "mime-db": ">= 1.34.0 < 2"
           },
@@ -20329,7 +20508,8 @@
             "mime-db": {
               "version": "1.34.0",
               "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz",
-              "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o="
+              "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=",
+              "dev": true
             }
           }
         },
@@ -20337,6 +20517,7 @@
           "version": "1.7.2",
           "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
           "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
+          "dev": true,
           "requires": {
             "accepts": "~1.3.4",
             "bytes": "3.0.0",
@@ -20351,6 +20532,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -20358,7 +20540,8 @@
             "safe-buffer": {
               "version": "5.1.1",
               "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-              "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+              "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+              "dev": true
             }
           }
         },
@@ -20366,6 +20549,7 @@
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-0.2.0.tgz",
           "integrity": "sha1-zkVTpHitScvVN0yqopLJ8WvrBV8=",
+          "dev": true,
           "requires": {
             "async": "0.2.x"
           }
@@ -20379,6 +20563,7 @@
           "version": "1.6.2",
           "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
           "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+          "dev": true,
           "requires": {
             "buffer-from": "^1.0.0",
             "inherits": "^2.0.3",
@@ -20389,12 +20574,14 @@
         "connect-history-api-fallback": {
           "version": "1.5.0",
           "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
-          "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo="
+          "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
+          "dev": true
         },
         "console-browserify": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
           "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+          "dev": true,
           "requires": {
             "date-now": "^0.1.4"
           }
@@ -20402,7 +20589,8 @@
         "console-control-strings": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-          "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+          "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+          "dev": true
         },
         "constant-case": {
           "version": "1.1.2",
@@ -20417,6 +20605,7 @@
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz",
           "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=",
+          "dev": true,
           "requires": {
             "acorn": "^2.1.0"
           },
@@ -20424,39 +20613,46 @@
             "acorn": {
               "version": "2.7.0",
               "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
-              "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
+              "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+              "dev": true
             }
           }
         },
         "constants-browserify": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-          "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+          "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+          "dev": true
         },
         "content-disposition": {
           "version": "0.5.2",
           "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
-          "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
+          "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+          "dev": true
         },
         "content-type": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-          "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+          "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+          "dev": true
         },
         "convert-source-map": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
-          "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
+          "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+          "dev": true
         },
         "cookie": {
           "version": "0.3.1",
           "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-          "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+          "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+          "dev": true
         },
         "cookie-signature": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-          "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+          "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+          "dev": true
         },
         "cookiejar": {
           "version": "2.1.2",
@@ -20508,6 +20704,7 @@
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
           "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+          "dev": true,
           "requires": {
             "lru-cache": "^4.0.1",
             "which": "^1.2.9"
@@ -20522,6 +20719,7 @@
           "version": "2.0.5",
           "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
           "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+          "dev": true,
           "requires": {
             "boom": "2.x.x"
           }
@@ -20530,6 +20728,7 @@
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz",
           "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=",
+          "dev": true,
           "requires": {
             "browserify-aes": "0.4.0",
             "pbkdf2-compat": "2.0.1",
@@ -20546,6 +20745,7 @@
           "version": "1.0.8",
           "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz",
           "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=",
+          "dev": true,
           "requires": {
             "css-parse": "1.0.4",
             "css-stringify": "1.0.5"
@@ -20563,7 +20763,8 @@
         "css-color-names": {
           "version": "0.0.4",
           "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
-          "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+          "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+          "dev": true
         },
         "css-in-js-utils": {
           "version": "2.0.1",
@@ -20585,6 +20786,7 @@
           "version": "0.23.1",
           "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz",
           "integrity": "sha1-n6I/K1wJZSNZEK1ezvO4o2OQ/lA=",
+          "dev": true,
           "requires": {
             "css-selector-tokenizer": "^0.5.1",
             "cssnano": ">=2.6.1 <4",
@@ -20602,19 +20804,22 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
         "css-parse": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz",
-          "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90="
+          "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=",
+          "dev": true
         },
         "css-select": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
           "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+          "dev": true,
           "requires": {
             "boolbase": "~1.0.0",
             "css-what": "2.1",
@@ -20626,6 +20831,7 @@
           "version": "0.5.4",
           "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz",
           "integrity": "sha1-E5uv00o1/QwUKEhwSeBpnm9qLCE=",
+          "dev": true,
           "requires": {
             "cssesc": "^0.1.0",
             "fastparse": "^1.1.1"
@@ -20634,22 +20840,26 @@
         "css-stringify": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz",
-          "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE="
+          "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=",
+          "dev": true
         },
         "css-what": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
-          "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0="
+          "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+          "dev": true
         },
         "cssesc": {
           "version": "0.1.0",
           "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
-          "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q="
+          "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+          "dev": true
         },
         "cssnano": {
           "version": "3.10.0",
           "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
           "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+          "dev": true,
           "requires": {
             "autoprefixer": "^6.3.1",
             "decamelize": "^1.1.2",
@@ -20688,7 +20898,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -20696,6 +20907,7 @@
           "version": "2.3.2",
           "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
           "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+          "dev": true,
           "requires": {
             "clap": "^1.0.9",
             "source-map": "^0.5.3"
@@ -20704,7 +20916,8 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             }
           }
         },
@@ -20712,6 +20925,7 @@
           "version": "0.4.1",
           "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
           "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+          "dev": true,
           "requires": {
             "array-find-index": "^1.0.1"
           }
@@ -20720,6 +20934,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
           "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+          "dev": true,
           "requires": {
             "es5-ext": "^0.10.9"
           }
@@ -20728,6 +20943,7 @@
           "version": "1.14.1",
           "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
           "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+          "dev": true,
           "requires": {
             "assert-plus": "^1.0.0"
           },
@@ -20735,14 +20951,16 @@
             "assert-plus": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+              "dev": true
             }
           }
         },
         "date-now": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-          "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+          "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+          "dev": true
         },
         "debug": {
           "version": "3.1.0",
@@ -20785,7 +21003,8 @@
         "deep-is": {
           "version": "0.1.3",
           "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-          "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+          "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+          "dev": true
         },
         "define-properties": {
           "version": "1.1.3",
@@ -20804,6 +21023,7 @@
           "version": "2.2.2",
           "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
           "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+          "dev": true,
           "requires": {
             "globby": "^5.0.0",
             "is-path-cwd": "^1.0.0",
@@ -20817,7 +21037,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -20829,22 +21050,26 @@
         "delegates": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-          "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+          "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+          "dev": true
         },
         "depd": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+          "dev": true
         },
         "destroy": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-          "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+          "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+          "dev": true
         },
         "detect-indent": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
           "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+          "dev": true,
           "requires": {
             "repeating": "^2.0.0"
           }
@@ -20862,6 +21087,7 @@
           "version": "1.5.0",
           "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
           "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+          "dev": true,
           "requires": {
             "esutils": "^2.0.2",
             "isarray": "^1.0.0"
@@ -20876,6 +21102,7 @@
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
           "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
+          "dev": true,
           "requires": {
             "utila": "~0.3"
           },
@@ -20883,7 +21110,8 @@
             "utila": {
               "version": "0.3.3",
               "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
-              "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY="
+              "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
+              "dev": true
             }
           }
         },
@@ -20899,6 +21127,7 @@
           "version": "0.1.0",
           "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
           "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+          "dev": true,
           "requires": {
             "domelementtype": "~1.1.1",
             "entities": "~1.1.1"
@@ -20907,24 +21136,28 @@
             "domelementtype": {
               "version": "1.1.3",
               "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
-              "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
+              "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+              "dev": true
             }
           }
         },
         "domain-browser": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-          "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
+          "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+          "dev": true
         },
         "domelementtype": {
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
-          "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
+          "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+          "dev": true
         },
         "domhandler": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
           "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+          "dev": true,
           "requires": {
             "domelementtype": "1"
           }
@@ -20933,6 +21166,7 @@
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
           "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+          "dev": true,
           "requires": {
             "dom-serializer": "0",
             "domelementtype": "1"
@@ -20950,6 +21184,7 @@
           "version": "0.0.2",
           "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
           "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+          "dev": true,
           "requires": {
             "readable-stream": "~1.1.9"
           },
@@ -20957,12 +21192,14 @@
             "isarray": {
               "version": "0.0.1",
               "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+              "dev": true
             },
             "readable-stream": {
               "version": "1.1.14",
               "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
               "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+              "dev": true,
               "requires": {
                 "core-util-is": "~1.0.0",
                 "inherits": "~2.0.1",
@@ -20973,7 +21210,8 @@
             "string_decoder": {
               "version": "0.10.31",
               "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+              "dev": true
             }
           }
         },
@@ -20981,6 +21219,7 @@
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
           "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+          "dev": true,
           "optional": true,
           "requires": {
             "jsbn": "~0.1.0"
@@ -20989,22 +21228,26 @@
         "ee-first": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-          "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+          "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+          "dev": true
         },
         "electron-to-chromium": {
           "version": "1.3.50",
           "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.50.tgz",
-          "integrity": "sha1-dDi3b5K0G5GfP73TUPvQdX2s3fc="
+          "integrity": "sha1-dDi3b5K0G5GfP73TUPvQdX2s3fc=",
+          "dev": true
         },
         "emojis-list": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+          "dev": true
         },
         "encodeurl": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+          "dev": true
         },
         "encoding": {
           "version": "0.1.12",
@@ -21018,6 +21261,7 @@
           "version": "0.9.1",
           "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
           "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
+          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
             "memory-fs": "^0.2.0",
@@ -21027,19 +21271,22 @@
             "memory-fs": {
               "version": "0.2.0",
               "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
-              "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA="
+              "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=",
+              "dev": true
             }
           }
         },
         "ent": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
-          "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0="
+          "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+          "dev": true
         },
         "entities": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
-          "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
+          "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+          "dev": true
         },
         "envify": {
           "version": "3.4.1",
@@ -21054,6 +21301,7 @@
           "version": "0.1.7",
           "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
           "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+          "dev": true,
           "requires": {
             "prr": "~1.0.1"
           }
@@ -21062,14 +21310,55 @@
           "version": "1.3.2",
           "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
           "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+          "dev": true,
           "requires": {
             "is-arrayish": "^0.2.1"
           }
         },
+        "es-abstract": {
+          "version": "1.16.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
+          "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+          "requires": {
+            "es-to-primitive": "^1.2.0",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.0",
+            "is-callable": "^1.1.4",
+            "is-regex": "^1.0.4",
+            "object-inspect": "^1.6.0",
+            "object-keys": "^1.1.1",
+            "string.prototype.trimleft": "^2.1.0",
+            "string.prototype.trimright": "^2.1.0"
+          },
+          "dependencies": {
+            "object-inspect": {
+              "version": "1.6.0",
+              "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
+              "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ=="
+            },
+            "object-keys": {
+              "version": "1.1.1",
+              "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+              "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+            }
+          }
+        },
+        "es-to-primitive": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+          "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+          "requires": {
+            "is-callable": "^1.1.4",
+            "is-date-object": "^1.0.1",
+            "is-symbol": "^1.0.2"
+          }
+        },
         "es5-ext": {
           "version": "0.10.45",
           "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz",
           "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==",
+          "dev": true,
           "requires": {
             "es6-iterator": "~2.0.3",
             "es6-symbol": "~3.1.1",
@@ -21080,6 +21369,7 @@
           "version": "2.0.3",
           "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
           "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+          "dev": true,
           "requires": {
             "d": "1",
             "es5-ext": "^0.10.35",
@@ -21090,6 +21380,7 @@
           "version": "0.1.5",
           "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
           "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+          "dev": true,
           "requires": {
             "d": "1",
             "es5-ext": "~0.10.14",
@@ -21103,6 +21394,7 @@
           "version": "0.1.5",
           "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
           "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+          "dev": true,
           "requires": {
             "d": "1",
             "es5-ext": "~0.10.14",
@@ -21115,6 +21407,7 @@
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
           "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+          "dev": true,
           "requires": {
             "d": "1",
             "es5-ext": "~0.10.14"
@@ -21124,6 +21417,7 @@
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
           "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+          "dev": true,
           "requires": {
             "d": "1",
             "es5-ext": "^0.10.14",
@@ -21134,17 +21428,20 @@
         "escape-html": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-          "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+          "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+          "dev": true
         },
         "escape-string-regexp": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
         },
         "escodegen": {
           "version": "1.3.3",
           "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz",
           "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=",
+          "dev": true,
           "requires": {
             "esprima": "~1.1.1",
             "estraverse": "~1.5.0",
@@ -21155,17 +21452,20 @@
             "esprima": {
               "version": "1.1.1",
               "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz",
-              "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk="
+              "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=",
+              "dev": true
             },
             "esutils": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz",
-              "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA="
+              "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=",
+              "dev": true
             },
             "source-map": {
               "version": "0.1.43",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
               "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+              "dev": true,
               "optional": true,
               "requires": {
                 "amdefine": ">=0.0.4"
@@ -21177,6 +21477,7 @@
           "version": "3.6.0",
           "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
           "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+          "dev": true,
           "requires": {
             "es6-map": "^0.1.3",
             "es6-weak-map": "^2.0.1",
@@ -21187,7 +21488,8 @@
             "estraverse": {
               "version": "4.2.0",
               "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-              "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+              "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+              "dev": true
             }
           }
         },
@@ -21195,6 +21497,7 @@
           "version": "2.13.1",
           "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz",
           "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=",
+          "dev": true,
           "requires": {
             "chalk": "^1.1.3",
             "concat-stream": "^1.4.6",
@@ -21235,6 +21538,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -21242,12 +21546,14 @@
             "estraverse": {
               "version": "4.2.0",
               "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-              "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+              "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+              "dev": true
             },
             "glob": {
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -21263,6 +21569,7 @@
           "version": "3.5.4",
           "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
           "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+          "dev": true,
           "requires": {
             "acorn": "^5.5.0",
             "acorn-jsx": "^3.0.0"
@@ -21277,6 +21584,7 @@
           "version": "4.2.1",
           "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
           "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+          "dev": true,
           "requires": {
             "estraverse": "^4.1.0"
           },
@@ -21284,29 +21592,34 @@
             "estraverse": {
               "version": "4.2.0",
               "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-              "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+              "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+              "dev": true
             }
           }
         },
         "estraverse": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz",
-          "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E="
+          "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=",
+          "dev": true
         },
         "esutils": {
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+          "dev": true
         },
         "etag": {
           "version": "1.8.1",
           "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-          "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+          "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+          "dev": true
         },
         "event-emitter": {
           "version": "0.3.5",
           "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
           "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+          "dev": true,
           "requires": {
             "d": "1",
             "es5-ext": "~0.10.14"
@@ -21315,17 +21628,20 @@
         "eventemitter3": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
-          "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA=="
+          "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+          "dev": true
         },
         "events": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
-          "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
+          "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+          "dev": true
         },
         "eventsource": {
           "version": "0.1.6",
           "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
           "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+          "dev": true,
           "requires": {
             "original": ">=0.0.5"
           }
@@ -21333,12 +21649,14 @@
         "exit-hook": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
-          "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
+          "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+          "dev": true
         },
         "expand-brackets": {
           "version": "0.1.5",
           "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
           "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+          "dev": true,
           "requires": {
             "is-posix-bracket": "^0.1.0"
           }
@@ -21347,6 +21665,7 @@
           "version": "1.8.2",
           "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
           "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+          "dev": true,
           "requires": {
             "fill-range": "^2.1.0"
           }
@@ -21355,6 +21674,7 @@
           "version": "4.16.3",
           "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
           "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+          "dev": true,
           "requires": {
             "accepts": "~1.3.5",
             "array-flatten": "1.1.1",
@@ -21392,6 +21712,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -21399,12 +21720,14 @@
             "qs": {
               "version": "6.5.1",
               "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-              "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+              "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+              "dev": true
             },
             "safe-buffer": {
               "version": "5.1.1",
               "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-              "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+              "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+              "dev": true
             }
           }
         },
@@ -21417,6 +21740,7 @@
           "version": "0.3.2",
           "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
           "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+          "dev": true,
           "requires": {
             "is-extglob": "^1.0.0"
           }
@@ -21425,6 +21749,7 @@
           "version": "0.9.1",
           "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-0.9.1.tgz",
           "integrity": "sha1-723FCMs17Q3PikAJq76FP3p2IrU=",
+          "dev": true,
           "requires": {
             "async": "^1.5.0",
             "loader-utils": "^0.2.3"
@@ -21433,19 +21758,22 @@
             "async": {
               "version": "1.5.2",
               "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-              "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+              "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+              "dev": true
             }
           }
         },
         "extsprintf": {
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-          "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+          "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+          "dev": true
         },
         "falafel": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
           "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
+          "dev": true,
           "requires": {
             "acorn": "^5.0.0",
             "foreach": "^2.0.5",
@@ -21456,14 +21784,16 @@
             "isarray": {
               "version": "0.0.1",
               "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+              "dev": true
             }
           }
         },
         "fast-deep-equal": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
+          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+          "dev": true
         },
         "fast-json-stable-stringify": {
           "version": "2.0.0",
@@ -21473,17 +21803,20 @@
         "fast-levenshtein": {
           "version": "2.0.6",
           "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-          "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+          "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+          "dev": true
         },
         "fastparse": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
-          "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg="
+          "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+          "dev": true
         },
         "faye-websocket": {
           "version": "0.10.0",
           "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
           "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+          "dev": true,
           "requires": {
             "websocket-driver": ">=0.5.1"
           }
@@ -21513,6 +21846,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
           "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+          "dev": true,
           "requires": {
             "pend": "~1.2.0"
           }
@@ -21521,6 +21855,7 @@
           "version": "1.7.0",
           "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
           "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
           "requires": {
             "escape-string-regexp": "^1.0.5",
             "object-assign": "^4.1.0"
@@ -21529,7 +21864,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -21537,6 +21873,7 @@
           "version": "1.3.1",
           "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz",
           "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=",
+          "dev": true,
           "requires": {
             "flat-cache": "^1.2.1",
             "object-assign": "^4.0.1"
@@ -21545,7 +21882,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -21553,6 +21891,7 @@
           "version": "0.8.5",
           "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.8.5.tgz",
           "integrity": "sha1-knXQMf54DyfUf19K8CvUNxPMFRs=",
+          "dev": true,
           "requires": {
             "loader-utils": "~0.2.5"
           }
@@ -21565,7 +21904,8 @@
         "filename-regex": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
-          "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+          "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+          "dev": true
         },
         "filestack-js": {
           "version": "1.14.6",
@@ -21624,6 +21964,7 @@
           "version": "2.2.4",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
           "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+          "dev": true,
           "requires": {
             "is-number": "^2.1.0",
             "isobject": "^2.0.0",
@@ -21636,6 +21977,7 @@
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
           "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+          "dev": true,
           "requires": {
             "debug": "2.6.9",
             "encodeurl": "~1.0.2",
@@ -21650,6 +21992,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -21660,6 +22003,7 @@
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
           "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+          "dev": true,
           "requires": {
             "commondir": "^1.0.1",
             "mkdirp": "^0.5.1",
@@ -21670,6 +22014,7 @@
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
           "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
           "requires": {
             "path-exists": "^2.0.0",
             "pinkie-promise": "^2.0.0"
@@ -21678,12 +22023,14 @@
         "findit2": {
           "version": "2.2.3",
           "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz",
-          "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY="
+          "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=",
+          "dev": true
         },
         "flat-cache": {
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
           "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+          "dev": true,
           "requires": {
             "circular-json": "^0.3.1",
             "del": "^2.0.2",
@@ -21694,12 +22041,14 @@
         "flatten": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
-          "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I="
+          "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
+          "dev": true
         },
         "follow-redirects": {
           "version": "1.5.0",
           "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz",
           "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==",
+          "dev": true,
           "requires": {
             "debug": "^3.1.0"
           }
@@ -21707,12 +22056,14 @@
         "for-in": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-          "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+          "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+          "dev": true
         },
         "for-own": {
           "version": "0.1.5",
           "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
           "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+          "dev": true,
           "requires": {
             "for-in": "^1.0.1"
           }
@@ -21720,12 +22071,14 @@
         "foreach": {
           "version": "2.0.5",
           "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-          "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+          "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+          "dev": true
         },
         "forever-agent": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-          "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+          "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+          "dev": true
         },
         "form-data": {
           "version": "2.3.2",
@@ -21766,22 +22119,26 @@
         "forwarded": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-          "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+          "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+          "dev": true
         },
         "fresh": {
           "version": "0.5.2",
           "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-          "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+          "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+          "dev": true
         },
         "fs.realpath": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+          "dev": true
         },
         "fsevents": {
           "version": "1.2.9",
           "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
           "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
+          "dev": true,
           "optional": true,
           "requires": {
             "nan": "^2.12.1",
@@ -21792,24 +22149,27 @@
               "version": "1.1.1",
               "resolved": false,
               "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+              "dev": true,
               "optional": true
             },
             "ansi-regex": {
               "version": "2.1.1",
               "resolved": false,
               "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-              "optional": true
+              "dev": true
             },
             "aproba": {
               "version": "1.2.0",
               "resolved": false,
               "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+              "dev": true,
               "optional": true
             },
             "are-we-there-yet": {
               "version": "1.1.5",
               "resolved": false,
               "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "delegates": "^1.0.0",
@@ -21820,13 +22180,13 @@
               "version": "1.0.0",
               "resolved": false,
               "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-              "optional": true
+              "dev": true
             },
             "brace-expansion": {
               "version": "1.1.11",
               "resolved": false,
               "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "balanced-match": "^1.0.0",
                 "concat-map": "0.0.1"
@@ -21836,36 +22196,39 @@
               "version": "1.1.1",
               "resolved": false,
               "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+              "dev": true,
               "optional": true
             },
             "code-point-at": {
               "version": "1.1.0",
               "resolved": false,
               "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-              "optional": true
+              "dev": true
             },
             "concat-map": {
               "version": "0.0.1",
               "resolved": false,
               "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-              "optional": true
+              "dev": true
             },
             "console-control-strings": {
               "version": "1.1.0",
               "resolved": false,
               "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-              "optional": true
+              "dev": true
             },
             "core-util-is": {
               "version": "1.0.2",
               "resolved": false,
               "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+              "dev": true,
               "optional": true
             },
             "debug": {
               "version": "4.1.1",
               "resolved": false,
               "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "ms": "^2.1.1"
@@ -21875,24 +22238,28 @@
               "version": "0.6.0",
               "resolved": false,
               "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+              "dev": true,
               "optional": true
             },
             "delegates": {
               "version": "1.0.0",
               "resolved": false,
               "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+              "dev": true,
               "optional": true
             },
             "detect-libc": {
               "version": "1.0.3",
               "resolved": false,
               "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
+              "dev": true,
               "optional": true
             },
             "fs-minipass": {
               "version": "1.2.5",
               "resolved": false,
               "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "minipass": "^2.2.1"
@@ -21902,12 +22269,14 @@
               "version": "1.0.0",
               "resolved": false,
               "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+              "dev": true,
               "optional": true
             },
             "gauge": {
               "version": "2.7.4",
               "resolved": false,
               "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+              "dev": true,
               "optional": true,
               "requires": {
                 "aproba": "^1.0.3",
@@ -21924,6 +22293,7 @@
               "version": "7.1.3",
               "resolved": false,
               "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
@@ -21938,12 +22308,14 @@
               "version": "2.0.1",
               "resolved": false,
               "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+              "dev": true,
               "optional": true
             },
             "iconv-lite": {
               "version": "0.4.24",
               "resolved": false,
               "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "safer-buffer": ">= 2.1.2 < 3"
@@ -21953,6 +22325,7 @@
               "version": "3.0.1",
               "resolved": false,
               "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "minimatch": "^3.0.4"
@@ -21962,6 +22335,7 @@
               "version": "1.0.6",
               "resolved": false,
               "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+              "dev": true,
               "optional": true,
               "requires": {
                 "once": "^1.3.0",
@@ -21972,19 +22346,20 @@
               "version": "2.0.3",
               "resolved": false,
               "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-              "optional": true
+              "dev": true
             },
             "ini": {
               "version": "1.3.5",
               "resolved": false,
               "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+              "dev": true,
               "optional": true
             },
             "is-fullwidth-code-point": {
               "version": "1.0.0",
               "resolved": false,
               "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "number-is-nan": "^1.0.0"
               }
@@ -21993,13 +22368,14 @@
               "version": "1.0.0",
               "resolved": false,
               "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+              "dev": true,
               "optional": true
             },
             "minimatch": {
               "version": "3.0.4",
               "resolved": false,
               "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "brace-expansion": "^1.1.7"
               }
@@ -22008,13 +22384,13 @@
               "version": "0.0.8",
               "resolved": false,
               "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-              "optional": true
+              "dev": true
             },
             "minipass": {
               "version": "2.3.5",
               "resolved": false,
               "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "safe-buffer": "^5.1.2",
                 "yallist": "^3.0.0"
@@ -22024,6 +22400,7 @@
               "version": "1.2.1",
               "resolved": false,
               "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "minipass": "^2.2.1"
@@ -22033,7 +22410,7 @@
               "version": "0.5.1",
               "resolved": false,
               "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "minimist": "0.0.8"
               }
@@ -22042,18 +22419,21 @@
               "version": "2.1.1",
               "resolved": false,
               "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+              "dev": true,
               "optional": true
             },
             "nan": {
               "version": "2.14.0",
               "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
               "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+              "dev": true,
               "optional": true
             },
             "needle": {
               "version": "2.3.0",
               "resolved": false,
               "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "debug": "^4.1.0",
@@ -22065,6 +22445,7 @@
               "version": "0.12.0",
               "resolved": false,
               "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "detect-libc": "^1.0.2",
@@ -22083,6 +22464,7 @@
               "version": "4.0.1",
               "resolved": false,
               "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+              "dev": true,
               "optional": true,
               "requires": {
                 "abbrev": "1",
@@ -22093,12 +22475,14 @@
               "version": "1.0.6",
               "resolved": false,
               "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
+              "dev": true,
               "optional": true
             },
             "npm-packlist": {
               "version": "1.4.1",
               "resolved": false,
               "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "ignore-walk": "^3.0.1",
@@ -22109,6 +22493,7 @@
               "version": "4.1.2",
               "resolved": false,
               "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "are-we-there-yet": "~1.1.2",
@@ -22121,19 +22506,20 @@
               "version": "1.0.1",
               "resolved": false,
               "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-              "optional": true
+              "dev": true
             },
             "object-assign": {
               "version": "4.1.1",
               "resolved": false,
               "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true,
               "optional": true
             },
             "once": {
               "version": "1.4.0",
               "resolved": false,
               "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "wrappy": "1"
               }
@@ -22142,18 +22528,21 @@
               "version": "1.0.2",
               "resolved": false,
               "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+              "dev": true,
               "optional": true
             },
             "os-tmpdir": {
               "version": "1.0.2",
               "resolved": false,
               "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+              "dev": true,
               "optional": true
             },
             "osenv": {
               "version": "0.1.5",
               "resolved": false,
               "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "os-homedir": "^1.0.0",
@@ -22164,18 +22553,21 @@
               "version": "1.0.1",
               "resolved": false,
               "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+              "dev": true,
               "optional": true
             },
             "process-nextick-args": {
               "version": "2.0.0",
               "resolved": false,
               "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+              "dev": true,
               "optional": true
             },
             "rc": {
               "version": "1.2.8",
               "resolved": false,
               "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "deep-extend": "^0.6.0",
@@ -22188,6 +22580,7 @@
                   "version": "1.2.0",
                   "resolved": false,
                   "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+                  "dev": true,
                   "optional": true
                 }
               }
@@ -22196,6 +22589,7 @@
               "version": "2.3.6",
               "resolved": false,
               "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "core-util-is": "~1.0.0",
@@ -22211,6 +22605,7 @@
               "version": "2.6.3",
               "resolved": false,
               "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "glob": "^7.1.3"
@@ -22220,43 +22615,48 @@
               "version": "5.1.2",
               "resolved": false,
               "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-              "optional": true
+              "dev": true
             },
             "safer-buffer": {
               "version": "2.1.2",
               "resolved": false,
               "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+              "dev": true,
               "optional": true
             },
             "sax": {
               "version": "1.2.4",
               "resolved": false,
               "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+              "dev": true,
               "optional": true
             },
             "semver": {
               "version": "5.7.0",
               "resolved": false,
               "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+              "dev": true,
               "optional": true
             },
             "set-blocking": {
               "version": "2.0.0",
               "resolved": false,
               "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+              "dev": true,
               "optional": true
             },
             "signal-exit": {
               "version": "3.0.2",
               "resolved": false,
               "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+              "dev": true,
               "optional": true
             },
             "string-width": {
               "version": "1.0.2",
               "resolved": false,
               "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "code-point-at": "^1.0.0",
                 "is-fullwidth-code-point": "^1.0.0",
@@ -22267,6 +22667,7 @@
               "version": "1.1.1",
               "resolved": false,
               "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "safe-buffer": "~5.1.0"
@@ -22276,7 +22677,7 @@
               "version": "3.0.1",
               "resolved": false,
               "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-              "optional": true,
+              "dev": true,
               "requires": {
                 "ansi-regex": "^2.0.0"
               }
@@ -22285,12 +22686,14 @@
               "version": "2.0.1",
               "resolved": false,
               "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+              "dev": true,
               "optional": true
             },
             "tar": {
               "version": "4.4.8",
               "resolved": false,
               "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "chownr": "^1.1.1",
@@ -22306,12 +22709,14 @@
               "version": "1.0.2",
               "resolved": false,
               "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+              "dev": true,
               "optional": true
             },
             "wide-align": {
               "version": "1.1.3",
               "resolved": false,
               "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+              "dev": true,
               "optional": true,
               "requires": {
                 "string-width": "^1.0.2 || 2"
@@ -22321,13 +22726,13 @@
               "version": "1.0.2",
               "resolved": false,
               "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-              "optional": true
+              "dev": true
             },
             "yallist": {
               "version": "3.0.3",
               "resolved": false,
               "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
-              "optional": true
+              "dev": true
             }
           }
         },
@@ -22335,6 +22740,7 @@
           "version": "1.0.11",
           "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
           "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
             "inherits": "~2.0.0",
@@ -22351,6 +22757,7 @@
           "version": "2.7.4",
           "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
           "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+          "dev": true,
           "requires": {
             "aproba": "^1.0.3",
             "console-control-strings": "^1.0.0",
@@ -22365,7 +22772,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -22373,6 +22781,7 @@
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
           "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+          "dev": true,
           "requires": {
             "globule": "^1.0.0"
           }
@@ -22380,12 +22789,14 @@
         "generate-function": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
-          "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ="
+          "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+          "dev": true
         },
         "generate-object-property": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
           "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+          "dev": true,
           "requires": {
             "is-property": "^1.0.0"
           }
@@ -22393,17 +22804,20 @@
         "get-caller-file": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
-          "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
+          "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+          "dev": true
         },
         "get-stdin": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-          "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
+          "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+          "dev": true
         },
         "getpass": {
           "version": "0.1.7",
           "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
           "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+          "dev": true,
           "requires": {
             "assert-plus": "^1.0.0"
           },
@@ -22411,7 +22825,8 @@
             "assert-plus": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+              "dev": true
             }
           }
         },
@@ -22431,6 +22846,7 @@
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
           "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+          "dev": true,
           "requires": {
             "glob-parent": "^2.0.0",
             "is-glob": "^2.0.0"
@@ -22440,6 +22856,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
           "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+          "dev": true,
           "requires": {
             "is-glob": "^2.0.0"
           }
@@ -22447,12 +22864,14 @@
         "globals": {
           "version": "9.18.0",
           "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+          "dev": true
         },
         "globby": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
           "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
           "requires": {
             "array-union": "^1.0.1",
             "arrify": "^1.0.0",
@@ -22466,6 +22885,7 @@
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -22478,7 +22898,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -22486,6 +22907,7 @@
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
           "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+          "dev": true,
           "requires": {
             "glob": "~7.1.1",
             "lodash": "~4.17.10",
@@ -22496,6 +22918,7 @@
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -22510,7 +22933,8 @@
         "google-cdn-data": {
           "version": "0.1.25",
           "resolved": "https://registry.npmjs.org/google-cdn-data/-/google-cdn-data-0.1.25.tgz",
-          "integrity": "sha1-nDwxSasYp8LV7V8PC07ovEWZK3E="
+          "integrity": "sha1-nDwxSasYp8LV7V8PC07ovEWZK3E=",
+          "dev": true
         },
         "graceful-fs": {
           "version": "4.1.11",
@@ -22525,12 +22949,14 @@
         "har-schema": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
-          "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4="
+          "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+          "dev": true
         },
         "har-validator": {
           "version": "4.2.1",
           "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
           "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+          "dev": true,
           "requires": {
             "ajv": "^4.9.1",
             "har-schema": "^1.0.5"
@@ -22548,6 +22974,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
           "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+          "dev": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -22555,22 +22982,31 @@
         "has-color": {
           "version": "0.1.7",
           "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
-          "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8="
+          "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+          "dev": true
         },
         "has-flag": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "has-symbols": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+          "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
         },
         "has-unicode": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-          "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+          "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+          "dev": true
         },
         "hawk": {
           "version": "3.1.3",
           "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
           "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+          "dev": true,
           "requires": {
             "boom": "2.x.x",
             "cryptiles": "2.x.x",
@@ -22581,7 +23017,8 @@
         "he": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-          "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+          "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+          "dev": true
         },
         "history": {
           "version": "1.17.0",
@@ -22607,7 +23044,8 @@
         "hoek": {
           "version": "2.16.3",
           "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
-          "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
+          "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+          "dev": true
         },
         "hoist-non-react-statics": {
           "version": "2.5.5",
@@ -22618,6 +23056,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
           "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+          "dev": true,
           "requires": {
             "os-homedir": "^1.0.0",
             "os-tmpdir": "^1.0.1"
@@ -22626,7 +23065,8 @@
         "hosted-git-info": {
           "version": "2.6.1",
           "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz",
-          "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A=="
+          "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==",
+          "dev": true
         },
         "html-comment-regex": {
           "version": "1.1.1",
@@ -22637,6 +23077,7 @@
           "version": "3.5.17",
           "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.17.tgz",
           "integrity": "sha512-O+StuKL0UWfwX5Zv4rFxd60DPcT5DVjGq1AlnP6VQ8wzudft/W4hx5Wl98aSYNwFBHY6XWJreRw/BehX4l+diQ==",
+          "dev": true,
           "requires": {
             "camel-case": "3.0.x",
             "clean-css": "4.1.x",
@@ -22650,7 +23091,8 @@
             "commander": {
               "version": "2.15.1",
               "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-              "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+              "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+              "dev": true
             }
           }
         },
@@ -22658,6 +23100,7 @@
           "version": "2.30.1",
           "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz",
           "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=",
+          "dev": true,
           "requires": {
             "bluebird": "^3.4.7",
             "html-minifier": "^3.2.3",
@@ -22671,6 +23114,7 @@
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
           "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+          "dev": true,
           "requires": {
             "domelementtype": "1",
             "domhandler": "2.1",
@@ -22682,6 +23126,7 @@
               "version": "1.1.6",
               "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
               "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+              "dev": true,
               "requires": {
                 "domelementtype": "1"
               }
@@ -22689,12 +23134,14 @@
             "isarray": {
               "version": "0.0.1",
               "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+              "dev": true
             },
             "readable-stream": {
               "version": "1.0.34",
               "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
               "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+              "dev": true,
               "requires": {
                 "core-util-is": "~1.0.0",
                 "inherits": "~2.0.1",
@@ -22705,7 +23152,8 @@
             "string_decoder": {
               "version": "0.10.31",
               "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+              "dev": true
             }
           }
         },
@@ -22713,6 +23161,7 @@
           "version": "1.6.3",
           "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
           "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
           "requires": {
             "depd": "~1.1.2",
             "inherits": "2.0.3",
@@ -22723,12 +23172,14 @@
         "http-parser-js": {
           "version": "0.4.13",
           "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz",
-          "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc="
+          "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=",
+          "dev": true
         },
         "http-proxy": {
           "version": "1.17.0",
           "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
           "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+          "dev": true,
           "requires": {
             "eventemitter3": "^3.0.0",
             "follow-redirects": "^1.0.0",
@@ -22739,6 +23190,7 @@
           "version": "0.17.4",
           "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
           "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+          "dev": true,
           "requires": {
             "http-proxy": "^1.16.2",
             "is-glob": "^3.1.0",
@@ -22749,12 +23201,14 @@
             "is-extglob": {
               "version": "2.1.1",
               "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-              "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+              "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+              "dev": true
             },
             "is-glob": {
               "version": "3.1.0",
               "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
               "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
               "requires": {
                 "is-extglob": "^2.1.0"
               }
@@ -22765,6 +23219,7 @@
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
           "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+          "dev": true,
           "requires": {
             "assert-plus": "^0.2.0",
             "jsprim": "^1.2.2",
@@ -22774,7 +23229,8 @@
         "https-browserify": {
           "version": "0.0.1",
           "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
-          "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI="
+          "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=",
+          "dev": true
         },
         "humps": {
           "version": "0.6.0",
@@ -22797,7 +23253,8 @@
         "icss-replace-symbols": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
-          "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0="
+          "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+          "dev": true
         },
         "idtoken-verifier": {
           "version": "1.2.0",
@@ -22814,27 +23271,32 @@
         "ieee754": {
           "version": "1.1.12",
           "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
-          "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="
+          "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
+          "dev": true
         },
         "ignore": {
           "version": "3.3.10",
           "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-          "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
+          "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+          "dev": true
         },
         "imurmurhash": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-          "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+          "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+          "dev": true
         },
         "in-publish": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
-          "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E="
+          "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+          "dev": true
         },
         "indent-string": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
           "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+          "dev": true,
           "requires": {
             "repeating": "^2.0.0"
           }
@@ -22842,12 +23304,14 @@
         "indexes-of": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
-          "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+          "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+          "dev": true
         },
         "indexof": {
           "version": "0.0.1",
           "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
-          "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+          "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+          "dev": true
         },
         "inflight": {
           "version": "1.0.6",
@@ -22876,6 +23340,7 @@
           "version": "0.12.0",
           "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
           "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
+          "dev": true,
           "requires": {
             "ansi-escapes": "^1.1.0",
             "ansi-regex": "^2.0.0",
@@ -22895,7 +23360,8 @@
         "interpret": {
           "version": "0.6.6",
           "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz",
-          "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls="
+          "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=",
+          "dev": true
         },
         "invariant": {
           "version": "2.2.4",
@@ -22908,17 +23374,20 @@
         "invert-kv": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-          "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+          "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+          "dev": true
         },
         "ipaddr.js": {
           "version": "1.6.0",
           "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
-          "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs="
+          "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
+          "dev": true
         },
         "is-absolute-url": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
-          "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+          "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+          "dev": true
         },
         "is-arguments": {
           "version": "1.0.4",
@@ -22928,12 +23397,14 @@
         "is-arrayish": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+          "dev": true
         },
         "is-binary-path": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
           "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "dev": true,
           "requires": {
             "binary-extensions": "^1.0.0"
           }
@@ -22947,10 +23418,16 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
           "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+          "dev": true,
           "requires": {
             "builtin-modules": "^1.0.0"
           }
         },
+        "is-callable": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+          "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="
+        },
         "is-date-object": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
@@ -22959,12 +23436,14 @@
         "is-dotfile": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
-          "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+          "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+          "dev": true
         },
         "is-equal-shallow": {
           "version": "0.1.3",
           "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
           "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+          "dev": true,
           "requires": {
             "is-primitive": "^2.0.0"
           }
@@ -22972,17 +23451,20 @@
         "is-extendable": {
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+          "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+          "dev": true
         },
         "is-extglob": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
         },
         "is-finite": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
           "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+          "dev": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -22991,6 +23473,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
           "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -22999,6 +23482,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
           "requires": {
             "is-extglob": "^1.0.0"
           }
@@ -23014,12 +23498,14 @@
         "is-my-ip-valid": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
-          "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
+          "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+          "dev": true
         },
         "is-my-json-valid": {
           "version": "2.17.2",
           "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
           "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+          "dev": true,
           "requires": {
             "generate-function": "^2.0.0",
             "generate-object-property": "^1.1.0",
@@ -23031,7 +23517,8 @@
             "xtend": {
               "version": "4.0.1",
               "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-              "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+              "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+              "dev": true
             }
           }
         },
@@ -23039,6 +23526,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
           "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+          "dev": true,
           "requires": {
             "kind-of": "^3.0.2"
           }
@@ -23046,12 +23534,14 @@
         "is-path-cwd": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-          "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+          "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+          "dev": true
         },
         "is-path-in-cwd": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
           "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+          "dev": true,
           "requires": {
             "is-path-inside": "^1.0.0"
           }
@@ -23060,6 +23550,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
           "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+          "dev": true,
           "requires": {
             "path-is-inside": "^1.0.1"
           }
@@ -23067,17 +23558,20 @@
         "is-plain-obj": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+          "dev": true
         },
         "is-posix-bracket": {
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
-          "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+          "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+          "dev": true
         },
         "is-primitive": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
-          "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+          "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+          "dev": true
         },
         "is-promise": {
           "version": "2.1.0",
@@ -23087,7 +23581,8 @@
         "is-property": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-          "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
+          "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+          "dev": true
         },
         "is-regex": {
           "version": "1.0.4",
@@ -23100,7 +23595,8 @@
         "is-resolvable": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-          "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+          "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+          "dev": true
         },
         "is-retina": {
           "version": "1.0.3",
@@ -23116,14 +23612,24 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
           "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
+          "dev": true,
           "requires": {
             "html-comment-regex": "^1.1.0"
           }
         },
+        "is-symbol": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+          "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+          "requires": {
+            "has-symbols": "^1.0.0"
+          }
+        },
         "is-typedarray": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-          "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+          "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+          "dev": true
         },
         "is-upper-case": {
           "version": "1.1.2",
@@ -23136,7 +23642,8 @@
         "is-utf8": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-          "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+          "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+          "dev": true
         },
         "isarray": {
           "version": "1.0.0",
@@ -23146,12 +23653,14 @@
         "isexe": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-          "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+          "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+          "dev": true
         },
         "isobject": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
           "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+          "dev": true,
           "requires": {
             "isarray": "1.0.0"
           }
@@ -23175,7 +23684,8 @@
         "isstream": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-          "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+          "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+          "dev": true
         },
         "isutf8": {
           "version": "2.0.4",
@@ -23186,6 +23696,7 @@
           "version": "1.11.0",
           "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz",
           "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=",
+          "dev": true,
           "requires": {
             "character-parser": "1.2.1",
             "clean-css": "^3.1.9",
@@ -23203,6 +23714,7 @@
               "version": "3.4.28",
               "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
               "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
+              "dev": true,
               "requires": {
                 "commander": "2.8.x",
                 "source-map": "0.4.x"
@@ -23212,6 +23724,7 @@
                   "version": "2.8.1",
                   "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
                   "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+                  "dev": true,
                   "requires": {
                     "graceful-readlink": ">= 1.0.0"
                   }
@@ -23221,12 +23734,14 @@
             "commander": {
               "version": "2.6.0",
               "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
-              "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0="
+              "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=",
+              "dev": true
             },
             "uglify-js": {
               "version": "2.8.29",
               "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
               "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+              "dev": true,
               "requires": {
                 "source-map": "~0.5.1",
                 "uglify-to-browserify": "~1.0.0",
@@ -23236,7 +23751,8 @@
                 "source-map": {
                   "version": "0.5.7",
                   "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-                  "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+                  "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+                  "dev": true
                 }
               }
             }
@@ -23246,6 +23762,7 @@
           "version": "0.0.3",
           "resolved": "https://registry.npmjs.org/jade-html-loader/-/jade-html-loader-0.0.3.tgz",
           "integrity": "sha1-ggSLSG55YiZ5OPWM0er9nMAAPsw=",
+          "dev": true,
           "requires": {
             "loader-utils": "0.2.x"
           }
@@ -23254,6 +23771,7 @@
           "version": "0.8.0",
           "resolved": "https://registry.npmjs.org/jade-loader/-/jade-loader-0.8.0.tgz",
           "integrity": "sha1-0bCZcam/kKKymLCvWxrQMA0QnC4=",
+          "dev": true,
           "requires": {
             "loader-utils": "~0.2.5"
           }
@@ -23262,6 +23780,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/jade-react-loader/-/jade-react-loader-1.0.2.tgz",
           "integrity": "sha1-MxgiARamZZzJxsMO7qqHLSMKioQ=",
+          "dev": true,
           "requires": {
             "loader-utils": "^0.2.9",
             "react-jade": "^2.4.0"
@@ -23270,7 +23789,8 @@
         "js-base64": {
           "version": "2.4.5",
           "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz",
-          "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ=="
+          "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==",
+          "dev": true
         },
         "js-cookie": {
           "version": "2.2.0",
@@ -23280,7 +23800,8 @@
         "js-stringify": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
-          "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
+          "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=",
+          "dev": true
         },
         "js-tokens": {
           "version": "3.0.2",
@@ -23291,6 +23812,7 @@
           "version": "3.7.0",
           "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
           "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
+          "dev": true,
           "requires": {
             "argparse": "^1.0.7",
             "esprima": "^2.6.0"
@@ -23299,7 +23821,8 @@
             "esprima": {
               "version": "2.7.3",
               "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
-              "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+              "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+              "dev": true
             }
           }
         },
@@ -23312,6 +23835,7 @@
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/jsdelivr-cdn-data/-/jsdelivr-cdn-data-0.1.1.tgz",
           "integrity": "sha1-pFDi3G7O57t7b2pylOUYCsvJwQo=",
+          "dev": true,
           "requires": {
             "semver": "~2.2.1"
           },
@@ -23319,34 +23843,40 @@
             "semver": {
               "version": "2.2.1",
               "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz",
-              "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM="
+              "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM=",
+              "dev": true
             }
           }
         },
         "jsesc": {
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+          "dev": true
         },
         "json-loader": {
           "version": "0.5.7",
           "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
-          "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w=="
+          "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
+          "dev": true
         },
         "json-schema": {
           "version": "0.2.3",
           "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-          "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+          "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+          "dev": true
         },
         "json-schema-traverse": {
           "version": "0.3.1",
           "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+          "dev": true
         },
         "json-stable-stringify": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
           "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+          "dev": true,
           "requires": {
             "jsonify": "~0.0.0"
           }
@@ -23354,32 +23884,38 @@
         "json-stringify-safe": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+          "dev": true
         },
         "json3": {
           "version": "3.3.2",
           "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
-          "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE="
+          "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+          "dev": true
         },
         "json5": {
           "version": "0.5.1",
           "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
         },
         "jsonify": {
           "version": "0.0.0",
           "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-          "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+          "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+          "dev": true
         },
         "jsonpointer": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
-          "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
+          "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+          "dev": true
         },
         "jsprim": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
           "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+          "dev": true,
           "requires": {
             "assert-plus": "1.0.0",
             "extsprintf": "1.3.0",
@@ -23390,7 +23926,8 @@
             "assert-plus": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+              "dev": true
             }
           }
         },
@@ -23410,6 +23947,7 @@
           "version": "0.0.2",
           "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz",
           "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=",
+          "dev": true,
           "requires": {
             "is-promise": "^2.0.0",
             "promise": "^6.0.1"
@@ -23418,12 +23956,14 @@
             "asap": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz",
-              "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0="
+              "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=",
+              "dev": true
             },
             "promise": {
               "version": "6.1.0",
               "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz",
               "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=",
+              "dev": true,
               "requires": {
                 "asap": "~1.0.0"
               }
@@ -23460,6 +24000,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
           "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+          "dev": true,
           "requires": {
             "invert-kv": "^1.0.0"
           }
@@ -23468,15 +24009,16 @@
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
           "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+          "dev": true,
           "requires": {
             "prelude-ls": "~1.1.2",
             "type-check": "~0.3.2"
           }
         },
         "libphonenumber-js": {
-          "version": "1.7.23",
-          "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.7.23.tgz",
-          "integrity": "sha512-PoL4q+VyljlBE5VBC0GegDYnBAYPAvoa6uihi5GmqlKGAC3bf4ha4KXiHOl3+6VvClgTnmiqHQUZcj/+SswnCQ==",
+          "version": "1.7.26",
+          "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.7.26.tgz",
+          "integrity": "sha512-23y9szw5sCrko0i4bO+jv6B3fFJkr0+bZ/5DLyY7TxBDJ04ACw+obdOdR3d2aOwbnOW+eevcgt8HqYgvjrfD/A==",
           "requires": {
             "minimist": "^1.2.0",
             "xml2js": "^0.4.17"
@@ -23488,18 +24030,19 @@
               "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
             },
             "xml2js": {
-              "version": "0.4.19",
-              "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
-              "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+              "version": "0.4.22",
+              "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz",
+              "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==",
               "requires": {
                 "sax": ">=0.6.0",
-                "xmlbuilder": "~9.0.1"
+                "util.promisify": "~1.0.0",
+                "xmlbuilder": "~11.0.0"
               }
             },
             "xmlbuilder": {
-              "version": "9.0.7",
-              "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
-              "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
+              "version": "11.0.1",
+              "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+              "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
             }
           }
         },
@@ -23507,6 +24050,7 @@
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
           "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
             "parse-json": "^2.2.0",
@@ -23519,6 +24063,7 @@
           "version": "0.2.17",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
           "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
           "requires": {
             "big.js": "^3.1.3",
             "emojis-list": "^2.0.0",
@@ -23529,7 +24074,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -23547,6 +24093,7 @@
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz",
           "integrity": "sha1-XdLLVTctbnDg4jkvsjBNZjEJEHU=",
+          "dev": true,
           "requires": {
             "lodash.deburr": "^3.0.0",
             "lodash.words": "^3.0.0"
@@ -23560,17 +24107,20 @@
         "lodash._root": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
-          "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
+          "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+          "dev": true
         },
         "lodash.assign": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
-          "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
+          "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+          "dev": true
         },
         "lodash.camelcase": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz",
           "integrity": "sha1-kyyLh/ikN3iXxnGXUzKC+Xrqwpg=",
+          "dev": true,
           "requires": {
             "lodash._createcompounder": "^3.0.0"
           }
@@ -23578,12 +24128,14 @@
         "lodash.clonedeep": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-          "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+          "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+          "dev": true
         },
         "lodash.deburr": {
           "version": "3.2.0",
           "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz",
           "integrity": "sha1-baj1QzSjZqfPTEx2742Aqhs2XtU=",
+          "dev": true,
           "requires": {
             "lodash._root": "^3.0.0"
           }
@@ -23616,7 +24168,8 @@
         "lodash.memoize": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
-          "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+          "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+          "dev": true
         },
         "lodash.merge": {
           "version": "4.6.2",
@@ -23631,12 +24184,14 @@
         "lodash.uniq": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
-          "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+          "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+          "dev": true
         },
         "lodash.words": {
           "version": "3.2.0",
           "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz",
           "integrity": "sha1-TiqGSbwIdFsXxpWxo86P7llmI7M=",
+          "dev": true,
           "requires": {
             "lodash._root": "^3.0.0"
           }
@@ -23663,6 +24218,7 @@
           "version": "1.6.0",
           "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
           "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+          "dev": true,
           "requires": {
             "currently-unhandled": "^0.4.1",
             "signal-exit": "^3.0.0"
@@ -23685,6 +24241,7 @@
           "version": "4.1.3",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
           "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+          "dev": true,
           "requires": {
             "pseudomap": "^1.0.2",
             "yallist": "^2.1.2"
@@ -23693,7 +24250,8 @@
         "map-obj": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+          "dev": true
         },
         "material-ui": {
           "version": "0.20.2",
@@ -23738,12 +24296,14 @@
         "math-expression-evaluator": {
           "version": "1.2.17",
           "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
-          "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw="
+          "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
+          "dev": true
         },
         "math-random": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
-          "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
+          "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+          "dev": true
         },
         "md5": {
           "version": "2.2.1",
@@ -23758,12 +24318,14 @@
         "media-typer": {
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+          "dev": true
         },
         "memory-fs": {
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz",
           "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=",
+          "dev": true,
           "requires": {
             "errno": "^0.1.3",
             "readable-stream": "^2.0.1"
@@ -23773,6 +24335,7 @@
           "version": "3.7.0",
           "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
           "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+          "dev": true,
           "requires": {
             "camelcase-keys": "^2.0.0",
             "decamelize": "^1.1.2",
@@ -23789,19 +24352,22 @@
             "minimist": {
               "version": "1.2.0",
               "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-              "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+              "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+              "dev": true
             },
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
         "merge-descriptors": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-          "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+          "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+          "dev": true
         },
         "methods": {
           "version": "1.1.2",
@@ -23812,6 +24378,7 @@
           "version": "2.3.11",
           "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
           "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+          "dev": true,
           "requires": {
             "arr-diff": "^2.0.0",
             "array-unique": "^0.2.1",
@@ -23880,17 +24447,20 @@
         "mute-stream": {
           "version": "0.0.5",
           "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
-          "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA="
+          "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
+          "dev": true
         },
         "nan": {
           "version": "2.10.0",
           "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
-          "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
+          "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+          "dev": true
         },
         "natives": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz",
-          "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg=="
+          "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==",
+          "dev": true
         },
         "ncname": {
           "version": "1.0.0",
@@ -23903,12 +24473,14 @@
         "negotiator": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
-          "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
+          "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+          "dev": true
         },
         "next-tick": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
-          "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+          "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+          "dev": true
         },
         "ng-onload": {
           "version": "0.2.1",
@@ -23940,6 +24512,7 @@
           "version": "2.3.2",
           "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
           "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+          "dev": true,
           "requires": {
             "lower-case": "^1.1.1"
           }
@@ -23965,6 +24538,7 @@
           "version": "3.7.0",
           "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz",
           "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==",
+          "dev": true,
           "requires": {
             "fstream": "^1.0.0",
             "glob": "^7.0.3",
@@ -23984,6 +24558,7 @@
               "version": "2.1.4",
               "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
               "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+              "dev": true,
               "requires": {
                 "asynckit": "^0.4.0",
                 "combined-stream": "^1.0.5",
@@ -23994,6 +24569,7 @@
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -24006,12 +24582,14 @@
             "qs": {
               "version": "6.4.0",
               "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-              "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
+              "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+              "dev": true
             },
             "request": {
               "version": "2.81.0",
               "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
               "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+              "dev": true,
               "requires": {
                 "aws-sign2": "~0.6.0",
                 "aws4": "^1.2.1",
@@ -24040,7 +24618,8 @@
             "semver": {
               "version": "5.3.0",
               "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-              "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
+              "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+              "dev": true
             }
           }
         },
@@ -24048,6 +24627,7 @@
           "version": "0.7.0",
           "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz",
           "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=",
+          "dev": true,
           "requires": {
             "assert": "^1.1.1",
             "browserify-zlib": "^0.1.4",
@@ -24077,12 +24657,14 @@
             "string_decoder": {
               "version": "0.10.31",
               "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+              "dev": true
             },
             "util": {
               "version": "0.10.4",
               "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
               "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+              "dev": true,
               "requires": {
                 "inherits": "2.0.3"
               }
@@ -24102,6 +24684,7 @@
           "version": "3.13.1",
           "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz",
           "integrity": "sha1-ckD7v/I5YwS0IjUn7TAgWJwAT8I=",
+          "dev": true,
           "requires": {
             "async-foreach": "^0.1.3",
             "chalk": "^1.1.1",
@@ -24125,6 +24708,7 @@
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -24140,6 +24724,7 @@
           "version": "1.8.1",
           "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
           "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+          "dev": true,
           "requires": {
             "chalk": "~0.4.0",
             "underscore": "~1.6.0"
@@ -24148,12 +24733,14 @@
             "ansi-styles": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
-              "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg="
+              "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+              "dev": true
             },
             "chalk": {
               "version": "0.4.0",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
               "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+              "dev": true,
               "requires": {
                 "ansi-styles": "~1.0.0",
                 "has-color": "~0.1.0",
@@ -24163,7 +24750,8 @@
             "strip-ansi": {
               "version": "0.1.1",
               "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
-              "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE="
+              "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+              "dev": true
             }
           }
         },
@@ -24171,6 +24759,7 @@
           "version": "3.0.6",
           "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
           "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "dev": true,
           "requires": {
             "abbrev": "1"
           }
@@ -24179,6 +24768,7 @@
           "version": "2.4.0",
           "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
           "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+          "dev": true,
           "requires": {
             "hosted-git-info": "^2.1.4",
             "is-builtin-module": "^1.0.0",
@@ -24190,6 +24780,7 @@
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
           "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
           "requires": {
             "remove-trailing-separator": "^1.0.1"
           }
@@ -24197,12 +24788,14 @@
         "normalize-range": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-          "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+          "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+          "dev": true
         },
         "normalize-url": {
           "version": "1.9.1",
           "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
           "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+          "dev": true,
           "requires": {
             "object-assign": "^4.0.1",
             "prepend-http": "^1.0.0",
@@ -24213,7 +24806,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -24236,6 +24830,7 @@
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
           "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+          "dev": true,
           "requires": {
             "are-we-there-yet": "~1.1.2",
             "console-control-strings": "~1.1.0",
@@ -24247,6 +24842,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
           "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
+          "dev": true,
           "requires": {
             "boolbase": "~1.0.0"
           }
@@ -24254,17 +24850,20 @@
         "num2fraction": {
           "version": "1.2.2",
           "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
-          "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+          "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+          "dev": true
         },
         "number-is-nan": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-          "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+          "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+          "dev": true
         },
         "oauth-sign": {
           "version": "0.8.2",
           "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-          "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+          "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+          "dev": true
         },
         "object-assign": {
           "version": "2.1.1",
@@ -24274,7 +24873,8 @@
         "object-inspect": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz",
-          "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w="
+          "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=",
+          "dev": true
         },
         "object-is": {
           "version": "1.0.1",
@@ -24286,10 +24886,20 @@
           "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
           "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="
         },
+        "object.getownpropertydescriptors": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
+          "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+          "requires": {
+            "define-properties": "^1.1.2",
+            "es-abstract": "^1.5.1"
+          }
+        },
         "object.omit": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
           "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+          "dev": true,
           "requires": {
             "for-own": "^0.1.4",
             "is-extendable": "^0.1.1"
@@ -24299,6 +24909,7 @@
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
           "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+          "dev": true,
           "requires": {
             "ee-first": "1.1.1"
           }
@@ -24306,7 +24917,8 @@
         "on-headers": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
-          "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
+          "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+          "dev": true
         },
         "once": {
           "version": "1.4.0",
@@ -24319,17 +24931,20 @@
         "onetime": {
           "version": "1.1.0",
           "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
-          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
         },
         "open": {
           "version": "0.0.5",
           "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz",
-          "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw="
+          "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=",
+          "dev": true
         },
         "optimist": {
           "version": "0.3.7",
           "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
           "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=",
+          "dev": true,
           "requires": {
             "wordwrap": "~0.0.2"
           }
@@ -24338,6 +24953,7 @@
           "version": "0.8.2",
           "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
           "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+          "dev": true,
           "requires": {
             "deep-is": "~0.1.3",
             "fast-levenshtein": "~2.0.4",
@@ -24350,7 +24966,8 @@
             "wordwrap": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-              "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+              "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+              "dev": true
             }
           }
         },
@@ -24358,6 +24975,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz",
           "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==",
+          "dev": true,
           "requires": {
             "url-parse": "~1.4.0"
           }
@@ -24365,17 +24983,20 @@
         "os-browserify": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz",
-          "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8="
+          "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=",
+          "dev": true
         },
         "os-homedir": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-          "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+          "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+          "dev": true
         },
         "os-locale": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
           "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+          "dev": true,
           "requires": {
             "lcid": "^1.0.0"
           }
@@ -24383,12 +25004,14 @@
         "os-tmpdir": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+          "dev": true
         },
         "osenv": {
           "version": "0.1.5",
           "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
           "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+          "dev": true,
           "requires": {
             "os-homedir": "^1.0.0",
             "os-tmpdir": "^1.0.0"
@@ -24397,12 +25020,14 @@
         "pako": {
           "version": "0.2.9",
           "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
-          "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
+          "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
+          "dev": true
         },
         "param-case": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
           "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+          "dev": true,
           "requires": {
             "no-case": "^2.2.0"
           }
@@ -24411,6 +25036,7 @@
           "version": "3.0.4",
           "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
           "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+          "dev": true,
           "requires": {
             "glob-base": "^0.3.0",
             "is-dotfile": "^1.0.0",
@@ -24422,6 +25048,7 @@
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
           "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "dev": true,
           "requires": {
             "error-ex": "^1.2.0"
           }
@@ -24429,7 +25056,8 @@
         "parseurl": {
           "version": "1.3.2",
           "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
-          "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
+          "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+          "dev": true
         },
         "pascal-case": {
           "version": "1.1.2",
@@ -24454,7 +25082,8 @@
         "path-browserify": {
           "version": "0.0.0",
           "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
-          "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo="
+          "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+          "dev": true
         },
         "path-case": {
           "version": "1.1.2",
@@ -24468,6 +25097,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
           "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
           "requires": {
             "pinkie-promise": "^2.0.0"
           }
@@ -24480,22 +25110,26 @@
         "path-is-inside": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-          "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+          "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+          "dev": true
         },
         "path-parse": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
-          "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+          "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+          "dev": true
         },
         "path-to-regexp": {
           "version": "0.1.7",
           "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-          "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+          "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+          "dev": true
         },
         "path-type": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
           "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
             "pify": "^2.0.0",
@@ -24505,32 +25139,38 @@
         "pbkdf2-compat": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz",
-          "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og="
+          "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=",
+          "dev": true
         },
         "pend": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-          "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+          "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+          "dev": true
         },
         "performance-now": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
-          "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU="
+          "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+          "dev": true
         },
         "pify": {
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
         },
         "pinkie": {
           "version": "2.0.4",
           "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-          "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+          "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+          "dev": true
         },
         "pinkie-promise": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
           "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+          "dev": true,
           "requires": {
             "pinkie": "^2.0.0"
           }
@@ -24539,6 +25179,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
           "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+          "dev": true,
           "requires": {
             "find-up": "^1.0.0"
           }
@@ -24546,17 +25187,19 @@
         "pluralize": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
-          "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU="
+          "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
+          "dev": true
         },
         "popper.js": {
-          "version": "1.15.0",
-          "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz",
-          "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA=="
+          "version": "1.16.0",
+          "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz",
+          "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw=="
         },
         "postcss": {
           "version": "5.2.18",
           "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
           "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
           "requires": {
             "chalk": "^1.1.3",
             "js-base64": "^2.1.9",
@@ -24567,12 +25210,14 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             },
             "supports-color": {
               "version": "3.2.3",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
               "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+              "dev": true,
               "requires": {
                 "has-flag": "^1.0.0"
               }
@@ -24583,6 +25228,7 @@
           "version": "5.3.1",
           "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
           "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.2",
             "postcss-message-helpers": "^2.0.0",
@@ -24593,6 +25239,7 @@
           "version": "2.2.2",
           "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz",
           "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
+          "dev": true,
           "requires": {
             "colormin": "^1.0.5",
             "postcss": "^5.0.13",
@@ -24603,6 +25250,7 @@
           "version": "2.6.1",
           "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz",
           "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.11",
             "postcss-value-parser": "^3.1.2"
@@ -24612,6 +25260,7 @@
           "version": "2.0.4",
           "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz",
           "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.14"
           }
@@ -24620,6 +25269,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz",
           "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.4"
           }
@@ -24628,6 +25278,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz",
           "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.14"
           }
@@ -24636,6 +25287,7 @@
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz",
           "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.16"
           }
@@ -24644,6 +25296,7 @@
           "version": "2.2.3",
           "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz",
           "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.14",
             "uniqs": "^2.0.0"
@@ -24653,6 +25306,7 @@
           "version": "2.0.3",
           "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz",
           "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.4"
           }
@@ -24661,6 +25315,7 @@
           "version": "2.1.7",
           "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz",
           "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
+          "dev": true,
           "requires": {
             "has": "^1.0.1",
             "postcss": "^5.0.10",
@@ -24671,6 +25326,7 @@
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz",
           "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.4"
           }
@@ -24679,6 +25335,7 @@
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz",
           "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
+          "dev": true,
           "requires": {
             "browserslist": "^1.5.2",
             "caniuse-api": "^1.5.2",
@@ -24690,12 +25347,14 @@
         "postcss-message-helpers": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
-          "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4="
+          "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=",
+          "dev": true
         },
         "postcss-minify-font-values": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz",
           "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
+          "dev": true,
           "requires": {
             "object-assign": "^4.0.1",
             "postcss": "^5.0.4",
@@ -24705,7 +25364,8 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -24713,6 +25373,7 @@
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz",
           "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.12",
             "postcss-value-parser": "^3.3.0"
@@ -24722,6 +25383,7 @@
           "version": "1.2.2",
           "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz",
           "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
+          "dev": true,
           "requires": {
             "alphanum-sort": "^1.0.1",
             "postcss": "^5.0.2",
@@ -24733,6 +25395,7 @@
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz",
           "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
+          "dev": true,
           "requires": {
             "alphanum-sort": "^1.0.2",
             "has": "^1.0.1",
@@ -24744,6 +25407,7 @@
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz",
           "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=",
+          "dev": true,
           "requires": {
             "postcss": "^6.0.1"
           },
@@ -24752,6 +25416,7 @@
               "version": "3.2.1",
               "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
               "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+              "dev": true,
               "requires": {
                 "color-convert": "^1.9.0"
               }
@@ -24760,6 +25425,7 @@
               "version": "2.4.1",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
               "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+              "dev": true,
               "requires": {
                 "ansi-styles": "^3.2.1",
                 "escape-string-regexp": "^1.0.5",
@@ -24769,12 +25435,14 @@
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+              "dev": true
             },
             "postcss": {
               "version": "6.0.23",
               "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
               "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+              "dev": true,
               "requires": {
                 "chalk": "^2.4.1",
                 "source-map": "^0.6.1",
@@ -24784,12 +25452,14 @@
             "source-map": {
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+              "dev": true
             },
             "supports-color": {
               "version": "5.4.0",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
               "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+              "dev": true,
               "requires": {
                 "has-flag": "^3.0.0"
               }
@@ -24800,6 +25470,7 @@
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
           "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+          "dev": true,
           "requires": {
             "css-selector-tokenizer": "^0.7.0",
             "postcss": "^6.0.1"
@@ -24809,6 +25480,7 @@
               "version": "3.2.1",
               "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
               "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+              "dev": true,
               "requires": {
                 "color-convert": "^1.9.0"
               }
@@ -24817,6 +25489,7 @@
               "version": "2.4.1",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
               "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+              "dev": true,
               "requires": {
                 "ansi-styles": "^3.2.1",
                 "escape-string-regexp": "^1.0.5",
@@ -24827,6 +25500,7 @@
               "version": "0.7.0",
               "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
               "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+              "dev": true,
               "requires": {
                 "cssesc": "^0.1.0",
                 "fastparse": "^1.1.1",
@@ -24836,12 +25510,14 @@
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+              "dev": true
             },
             "postcss": {
               "version": "6.0.23",
               "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
               "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+              "dev": true,
               "requires": {
                 "chalk": "^2.4.1",
                 "source-map": "^0.6.1",
@@ -24852,6 +25528,7 @@
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
               "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+              "dev": true,
               "requires": {
                 "regenerate": "^1.2.1",
                 "regjsgen": "^0.2.0",
@@ -24861,12 +25538,14 @@
             "source-map": {
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+              "dev": true
             },
             "supports-color": {
               "version": "5.4.0",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
               "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+              "dev": true,
               "requires": {
                 "has-flag": "^3.0.0"
               }
@@ -24877,6 +25556,7 @@
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
           "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+          "dev": true,
           "requires": {
             "css-selector-tokenizer": "^0.7.0",
             "postcss": "^6.0.1"
@@ -24886,6 +25566,7 @@
               "version": "3.2.1",
               "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
               "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+              "dev": true,
               "requires": {
                 "color-convert": "^1.9.0"
               }
@@ -24894,6 +25575,7 @@
               "version": "2.4.1",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
               "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+              "dev": true,
               "requires": {
                 "ansi-styles": "^3.2.1",
                 "escape-string-regexp": "^1.0.5",
@@ -24904,6 +25586,7 @@
               "version": "0.7.0",
               "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
               "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+              "dev": true,
               "requires": {
                 "cssesc": "^0.1.0",
                 "fastparse": "^1.1.1",
@@ -24913,12 +25596,14 @@
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+              "dev": true
             },
             "postcss": {
               "version": "6.0.23",
               "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
               "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+              "dev": true,
               "requires": {
                 "chalk": "^2.4.1",
                 "source-map": "^0.6.1",
@@ -24929,6 +25614,7 @@
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
               "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+              "dev": true,
               "requires": {
                 "regenerate": "^1.2.1",
                 "regjsgen": "^0.2.0",
@@ -24938,12 +25624,14 @@
             "source-map": {
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+              "dev": true
             },
             "supports-color": {
               "version": "5.4.0",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
               "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+              "dev": true,
               "requires": {
                 "has-flag": "^3.0.0"
               }
@@ -24954,6 +25642,7 @@
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
           "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+          "dev": true,
           "requires": {
             "icss-replace-symbols": "^1.1.0",
             "postcss": "^6.0.1"
@@ -24963,6 +25652,7 @@
               "version": "3.2.1",
               "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
               "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+              "dev": true,
               "requires": {
                 "color-convert": "^1.9.0"
               }
@@ -24971,6 +25661,7 @@
               "version": "2.4.1",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
               "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+              "dev": true,
               "requires": {
                 "ansi-styles": "^3.2.1",
                 "escape-string-regexp": "^1.0.5",
@@ -24980,12 +25671,14 @@
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+              "dev": true
             },
             "postcss": {
               "version": "6.0.23",
               "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
               "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+              "dev": true,
               "requires": {
                 "chalk": "^2.4.1",
                 "source-map": "^0.6.1",
@@ -24995,12 +25688,14 @@
             "source-map": {
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+              "dev": true
             },
             "supports-color": {
               "version": "5.4.0",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
               "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+              "dev": true,
               "requires": {
                 "has-flag": "^3.0.0"
               }
@@ -25011,6 +25706,7 @@
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
           "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.5"
           }
@@ -25019,6 +25715,7 @@
           "version": "3.0.8",
           "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz",
           "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
+          "dev": true,
           "requires": {
             "is-absolute-url": "^2.0.0",
             "normalize-url": "^1.4.0",
@@ -25030,6 +25727,7 @@
           "version": "2.2.3",
           "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz",
           "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.4",
             "postcss-value-parser": "^3.0.1"
@@ -25039,6 +25737,7 @@
           "version": "2.4.0",
           "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz",
           "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.4",
             "postcss-value-parser": "^3.0.2"
@@ -25048,6 +25747,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz",
           "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
+          "dev": true,
           "requires": {
             "postcss": "^5.0.4"
           }
@@ -25056,6 +25756,7 @@
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz",
           "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
+          "dev": true,
           "requires": {
             "has": "^1.0.1",
             "postcss": "^5.0.8",
@@ -25066,6 +25767,7 @@
           "version": "2.2.3",
           "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
           "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+          "dev": true,
           "requires": {
             "flatten": "^1.0.2",
             "indexes-of": "^1.0.1",
@@ -25076,6 +25778,7 @@
           "version": "2.1.6",
           "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
           "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+          "dev": true,
           "requires": {
             "is-svg": "^2.0.0",
             "postcss": "^5.0.14",
@@ -25087,6 +25790,7 @@
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz",
           "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
+          "dev": true,
           "requires": {
             "alphanum-sort": "^1.0.1",
             "postcss": "^5.0.4",
@@ -25096,12 +25800,14 @@
         "postcss-value-parser": {
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
-          "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
+          "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
+          "dev": true
         },
         "postcss-zindex": {
           "version": "2.2.0",
           "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
           "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+          "dev": true,
           "requires": {
             "has": "^1.0.1",
             "postcss": "^5.0.4",
@@ -25111,22 +25817,26 @@
         "prelude-ls": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+          "dev": true
         },
         "prepend-http": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-          "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+          "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+          "dev": true
         },
         "preserve": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
-          "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+          "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+          "dev": true
         },
         "pretty-error": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
           "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+          "dev": true,
           "requires": {
             "renderkid": "^2.0.1",
             "utila": "~0.4"
@@ -25140,7 +25850,8 @@
         "process": {
           "version": "0.11.10",
           "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-          "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+          "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+          "dev": true
         },
         "process-nextick-args": {
           "version": "2.0.0",
@@ -25150,7 +25861,8 @@
         "progress": {
           "version": "1.1.8",
           "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
-          "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74="
+          "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+          "dev": true
         },
         "promise": {
           "version": "7.3.1",
@@ -25180,6 +25892,7 @@
           "version": "2.0.3",
           "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
           "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
+          "dev": true,
           "requires": {
             "forwarded": "~0.1.2",
             "ipaddr.js": "1.6.0"
@@ -25188,17 +25901,20 @@
         "prr": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-          "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+          "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+          "dev": true
         },
         "pseudomap": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-          "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+          "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+          "dev": true
         },
         "punycode": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
         },
         "q": {
           "version": "1.5.1",
@@ -25214,6 +25930,7 @@
           "version": "4.3.4",
           "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
           "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+          "dev": true,
           "requires": {
             "object-assign": "^4.1.0",
             "strict-uri-encode": "^1.0.0"
@@ -25222,29 +25939,34 @@
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
         "querystring": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-          "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+          "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+          "dev": true
         },
         "querystring-es3": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-          "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+          "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+          "dev": true
         },
         "querystringify": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
-          "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw=="
+          "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
+          "dev": true
         },
         "quote-stream": {
           "version": "0.0.0",
           "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz",
           "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=",
+          "dev": true,
           "requires": {
             "minimist": "0.0.8",
             "through2": "~0.4.1"
@@ -25254,6 +25976,7 @@
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
           "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
+          "dev": true,
           "requires": {
             "is-number": "^4.0.0",
             "kind-of": "^6.0.0",
@@ -25263,24 +25986,28 @@
             "is-number": {
               "version": "4.0.0",
               "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-              "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+              "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+              "dev": true
             },
             "kind-of": {
               "version": "6.0.2",
               "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-              "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+              "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+              "dev": true
             }
           }
         },
         "range-parser": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
-          "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+          "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+          "dev": true
         },
         "raw-body": {
           "version": "2.3.2",
           "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
           "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+          "dev": true,
           "requires": {
             "bytes": "3.0.0",
             "http-errors": "1.6.2",
@@ -25291,12 +26018,14 @@
             "depd": {
               "version": "1.1.1",
               "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-              "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
+              "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+              "dev": true
             },
             "http-errors": {
               "version": "1.6.2",
               "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
               "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+              "dev": true,
               "requires": {
                 "depd": "1.1.1",
                 "inherits": "2.0.3",
@@ -25307,12 +26036,14 @@
             "iconv-lite": {
               "version": "0.4.19",
               "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
-              "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+              "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+              "dev": true
             },
             "setprototypeof": {
               "version": "1.0.3",
               "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
-              "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
+              "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+              "dev": true
             }
           }
         },
@@ -25537,14 +26268,15 @@
           "integrity": "sha1-OG/3qdLD3AFsJlvy5Z05cFD2Wvc="
         },
         "react-is": {
-          "version": "16.9.0",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz",
-          "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw=="
+          "version": "16.11.0",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz",
+          "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw=="
         },
         "react-jade": {
           "version": "2.5.0",
           "resolved": "https://registry.npmjs.org/react-jade/-/react-jade-2.5.0.tgz",
           "integrity": "sha1-w02dLdPuoB9S/UnMKIpcGmh8lIw=",
+          "dev": true,
           "requires": {
             "acorn": "^1.1.0",
             "constantinople": "^3.0.1",
@@ -25560,17 +26292,20 @@
             "acorn": {
               "version": "1.2.2",
               "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz",
-              "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ="
+              "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=",
+              "dev": true
             },
             "commander": {
               "version": "2.6.0",
               "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
-              "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0="
+              "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=",
+              "dev": true
             },
             "jade": {
               "version": "1.9.2",
               "resolved": "https://registry.npmjs.org/jade/-/jade-1.9.2.tgz",
               "integrity": "sha1-C4n5xg1OrSc46Ca6eyzKyaVwKr4=",
+              "dev": true,
               "requires": {
                 "character-parser": "1.2.1",
                 "commander": "~2.6.0",
@@ -25585,6 +26320,7 @@
                   "version": "4.0.3",
                   "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz",
                   "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=",
+                  "dev": true,
                   "requires": {
                     "acorn": "^1.0.1",
                     "acorn-globals": "^1.0.3"
@@ -25595,12 +26331,14 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             },
             "uglify-js": {
               "version": "2.8.29",
               "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
               "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+              "dev": true,
               "requires": {
                 "source-map": "~0.5.1",
                 "uglify-to-browserify": "~1.0.0",
@@ -25611,6 +26349,7 @@
               "version": "5.1.1",
               "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
               "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
+              "dev": true,
               "requires": {
                 "acorn": "^3.1.0",
                 "acorn-globals": "^3.0.0"
@@ -25619,12 +26358,14 @@
                 "acorn": {
                   "version": "3.3.0",
                   "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-                  "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+                  "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+                  "dev": true
                 },
                 "acorn-globals": {
                   "version": "3.1.0",
                   "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
                   "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
+                  "dev": true,
                   "requires": {
                     "acorn": "^4.0.4"
                   },
@@ -25632,7 +26373,8 @@
                     "acorn": {
                       "version": "4.0.13",
                       "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-                      "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+                      "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+                      "dev": true
                     }
                   }
                 }
@@ -25667,6 +26409,14 @@
             "prop-types": "^15.5.10"
           }
         },
+        "react-portal": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.0.tgz",
+          "integrity": "sha512-Zf+vGQ/VEAb5XAy+muKEn48yhdCNYPZaB1BWg1xc8sAZWD8pXTgPtQT4ihBdmWzsfCq8p8/kqf0GWydSBqc+Eg==",
+          "requires": {
+            "prop-types": "^15.5.8"
+          }
+        },
         "react-redux": {
           "version": "4.4.9",
           "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.9.tgz",
@@ -25703,16 +26453,16 @@
           },
           "dependencies": {
             "history": {
-              "version": "4.9.0",
-              "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz",
-              "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==",
+              "version": "4.10.1",
+              "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
+              "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
               "requires": {
                 "@babel/runtime": "^7.1.2",
                 "loose-envify": "^1.2.0",
-                "resolve-pathname": "^2.2.0",
+                "resolve-pathname": "^3.0.0",
                 "tiny-invariant": "^1.0.2",
                 "tiny-warning": "^1.0.0",
-                "value-equal": "^0.4.0"
+                "value-equal": "^1.0.1"
               }
             },
             "isarray": {
@@ -25810,6 +26560,7 @@
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
           "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+          "dev": true,
           "requires": {
             "load-json-file": "^1.0.0",
             "normalize-package-data": "^2.3.2",
@@ -25820,6 +26571,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
           "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+          "dev": true,
           "requires": {
             "find-up": "^1.0.0",
             "read-pkg": "^1.0.0"
@@ -25843,6 +26595,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
           "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+          "dev": true,
           "requires": {
             "graceful-fs": "^4.1.2",
             "minimatch": "^3.0.2",
@@ -25854,6 +26607,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
           "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
+          "dev": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -25898,6 +26652,7 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
           "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+          "dev": true,
           "requires": {
             "indent-string": "^2.1.0",
             "strip-indent": "^1.0.1"
@@ -25907,6 +26662,7 @@
           "version": "1.3.0",
           "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
           "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+          "dev": true,
           "requires": {
             "balanced-match": "^0.4.2",
             "math-expression-evaluator": "^1.2.14",
@@ -25916,7 +26672,8 @@
             "balanced-match": {
               "version": "0.4.2",
               "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
-              "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+              "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+              "dev": true
             }
           }
         },
@@ -25924,6 +26681,7 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz",
           "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
+          "dev": true,
           "requires": {
             "balanced-match": "^0.4.2"
           },
@@ -25931,7 +26689,8 @@
             "balanced-match": {
               "version": "0.4.2",
               "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
-              "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+              "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+              "dev": true
             }
           }
         },
@@ -25988,7 +26747,8 @@
         "regenerate": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-          "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
+          "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+          "dev": true
         },
         "regenerator-runtime": {
           "version": "0.10.5",
@@ -25999,6 +26759,7 @@
           "version": "0.10.1",
           "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
           "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+          "dev": true,
           "requires": {
             "babel-runtime": "^6.18.0",
             "babel-types": "^6.19.0",
@@ -26009,6 +26770,7 @@
           "version": "0.4.4",
           "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
           "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+          "dev": true,
           "requires": {
             "is-equal-shallow": "^0.1.3"
           }
@@ -26025,6 +26787,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
           "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+          "dev": true,
           "requires": {
             "regenerate": "^1.2.1",
             "regjsgen": "^0.2.0",
@@ -26034,12 +26797,14 @@
         "regjsgen": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
-          "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc="
+          "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+          "dev": true
         },
         "regjsparser": {
           "version": "0.1.5",
           "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
           "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+          "dev": true,
           "requires": {
             "jsesc": "~0.5.0"
           },
@@ -26047,7 +26812,8 @@
             "jsesc": {
               "version": "0.5.0",
               "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-              "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+              "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+              "dev": true
             }
           }
         },
@@ -26059,12 +26825,14 @@
         "remove-trailing-separator": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-          "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+          "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+          "dev": true
         },
         "renderkid": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
           "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
+          "dev": true,
           "requires": {
             "css-select": "^1.1.0",
             "dom-converter": "~0.1",
@@ -26076,14 +26844,16 @@
             "utila": {
               "version": "0.3.3",
               "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
-              "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY="
+              "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
+              "dev": true
             }
           }
         },
         "repeat-element": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
-          "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+          "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+          "dev": true
         },
         "repeat-string": {
           "version": "1.6.1",
@@ -26094,6 +26864,7 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
           "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+          "dev": true,
           "requires": {
             "is-finite": "^1.0.0"
           }
@@ -26102,6 +26873,7 @@
           "version": "2.87.0",
           "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
           "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
+          "dev": true,
           "requires": {
             "aws-sign2": "~0.7.0",
             "aws4": "^1.6.0",
@@ -26129,6 +26901,7 @@
               "version": "5.5.2",
               "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
               "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+              "dev": true,
               "requires": {
                 "co": "^4.6.0",
                 "fast-deep-equal": "^1.0.0",
@@ -26139,22 +26912,26 @@
             "assert-plus": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+              "dev": true
             },
             "aws-sign2": {
               "version": "0.7.0",
               "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-              "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+              "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+              "dev": true
             },
             "har-schema": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-              "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+              "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+              "dev": true
             },
             "har-validator": {
               "version": "5.0.3",
               "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
               "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+              "dev": true,
               "requires": {
                 "ajv": "^5.1.0",
                 "har-schema": "^2.0.0"
@@ -26164,6 +26941,7 @@
               "version": "1.2.0",
               "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
               "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+              "dev": true,
               "requires": {
                 "assert-plus": "^1.0.0",
                 "jsprim": "^1.2.2",
@@ -26173,24 +26951,28 @@
             "performance-now": {
               "version": "2.1.0",
               "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-              "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+              "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+              "dev": true
             }
           }
         },
         "require-directory": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-          "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+          "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+          "dev": true
         },
         "require-main-filename": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+          "dev": true
         },
         "require-uncached": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
           "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+          "dev": true,
           "requires": {
             "caller-path": "^0.1.0",
             "resolve-from": "^1.0.0"
@@ -26199,12 +26981,14 @@
         "requires-port": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-          "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+          "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+          "dev": true
         },
         "resolve": {
           "version": "1.8.1",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
           "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+          "dev": true,
           "requires": {
             "path-parse": "^1.0.5"
           }
@@ -26212,17 +26996,19 @@
         "resolve-from": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
-          "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
+          "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+          "dev": true
         },
         "resolve-pathname": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz",
-          "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg=="
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
+          "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
         },
         "restore-cursor": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
           "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+          "dev": true,
           "requires": {
             "exit-hook": "^1.0.0",
             "onetime": "^1.0.0"
@@ -26240,6 +27026,7 @@
           "version": "2.6.2",
           "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
           "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+          "dev": true,
           "requires": {
             "glob": "^7.0.5"
           },
@@ -26248,6 +27035,7 @@
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -26262,12 +27050,14 @@
         "ripemd160": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz",
-          "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84="
+          "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=",
+          "dev": true
         },
         "run-async": {
           "version": "0.1.0",
           "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
           "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
+          "dev": true,
           "requires": {
             "once": "^1.3.0"
           }
@@ -26275,12 +27065,14 @@
         "rx-lite": {
           "version": "3.1.2",
           "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
-          "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI="
+          "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
+          "dev": true
         },
         "s3": {
           "version": "4.4.0",
           "resolved": "https://registry.npmjs.org/s3/-/s3-4.4.0.tgz",
           "integrity": "sha1-VqT3dVFae2ucjlxrGrUfkDdmnx8=",
+          "dev": true,
           "requires": {
             "aws-sdk": "~2.0.31",
             "fd-slicer": "~1.0.0",
@@ -26297,6 +27089,7 @@
               "version": "3.0.11",
               "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
               "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+              "dev": true,
               "requires": {
                 "natives": "^1.1.0"
               }
@@ -26304,12 +27097,14 @@
             "mime": {
               "version": "1.2.11",
               "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
-              "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA="
+              "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+              "dev": true
             },
             "rimraf": {
               "version": "2.2.8",
               "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
-              "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI="
+              "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+              "dev": true
             }
           }
         },
@@ -26332,6 +27127,7 @@
           "version": "2.2.4",
           "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
           "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+          "dev": true,
           "requires": {
             "glob": "^7.0.0",
             "lodash": "^4.0.0",
@@ -26342,12 +27138,14 @@
             "camelcase": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-              "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+              "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+              "dev": true
             },
             "cliui": {
               "version": "3.2.0",
               "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
               "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+              "dev": true,
               "requires": {
                 "string-width": "^1.0.1",
                 "strip-ansi": "^3.0.1",
@@ -26358,6 +27156,7 @@
               "version": "7.1.2",
               "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
               "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+              "dev": true,
               "requires": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -26371,6 +27170,7 @@
               "version": "7.1.0",
               "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
               "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+              "dev": true,
               "requires": {
                 "camelcase": "^3.0.0",
                 "cliui": "^3.2.0",
@@ -26393,6 +27193,7 @@
           "version": "3.2.3",
           "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-3.2.3.tgz",
           "integrity": "sha1-dC6B/YFwqHcal54YYiUBZ0qI41U=",
+          "dev": true,
           "requires": {
             "async": "^1.4.0",
             "loader-utils": "^0.2.5",
@@ -26402,12 +27203,14 @@
             "async": {
               "version": "1.5.2",
               "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-              "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+              "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+              "dev": true
             },
             "object-assign": {
               "version": "4.1.1",
               "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+              "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+              "dev": true
             }
           }
         },
@@ -26420,6 +27223,7 @@
           "version": "0.2.3",
           "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
           "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+          "dev": true,
           "requires": {
             "js-base64": "^2.1.8",
             "source-map": "^0.4.2"
@@ -26428,12 +27232,14 @@
         "semver": {
           "version": "5.5.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
-          "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+          "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+          "dev": true
         },
         "send": {
           "version": "0.16.2",
           "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
           "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+          "dev": true,
           "requires": {
             "debug": "2.6.9",
             "depd": "~1.1.2",
@@ -26454,6 +27260,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -26461,7 +27268,8 @@
             "mime": {
               "version": "1.4.1",
               "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
-              "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
+              "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+              "dev": true
             }
           }
         },
@@ -26477,6 +27285,7 @@
           "version": "1.9.1",
           "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
           "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+          "dev": true,
           "requires": {
             "accepts": "~1.3.4",
             "batch": "0.6.1",
@@ -26491,6 +27300,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -26501,6 +27311,7 @@
           "version": "1.13.2",
           "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
           "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+          "dev": true,
           "requires": {
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
@@ -26511,12 +27322,14 @@
         "set-blocking": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-          "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+          "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+          "dev": true
         },
         "set-immediate-shim": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
-          "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+          "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+          "dev": true
         },
         "setimmediate": {
           "version": "1.0.5",
@@ -26526,17 +27339,20 @@
         "setprototypeof": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
         },
         "sha.js": {
           "version": "2.2.6",
           "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz",
-          "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo="
+          "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=",
+          "dev": true
         },
         "shallow-copy": {
           "version": "0.0.1",
           "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
-          "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA="
+          "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=",
+          "dev": true
         },
         "shallowequal": {
           "version": "1.1.0",
@@ -26546,12 +27362,14 @@
         "shelljs": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz",
-          "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg="
+          "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=",
+          "dev": true
         },
         "signal-exit": {
           "version": "3.0.2",
           "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-          "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+          "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+          "dev": true
         },
         "simple-assign": {
           "version": "0.1.0",
@@ -26573,12 +27391,14 @@
         "slash": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+          "dev": true
         },
         "slice-ansi": {
           "version": "0.0.4",
           "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
-          "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU="
+          "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
+          "dev": true
         },
         "snake-case": {
           "version": "1.1.2",
@@ -26592,6 +27412,7 @@
           "version": "1.0.9",
           "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
           "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+          "dev": true,
           "requires": {
             "hoek": "2.x.x"
           }
@@ -26600,6 +27421,7 @@
           "version": "0.3.19",
           "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
           "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+          "dev": true,
           "requires": {
             "faye-websocket": "^0.10.0",
             "uuid": "^3.0.1"
@@ -26609,6 +27431,7 @@
           "version": "1.1.5",
           "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
           "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
+          "dev": true,
           "requires": {
             "debug": "^2.6.6",
             "eventsource": "0.1.6",
@@ -26622,6 +27445,7 @@
               "version": "2.6.9",
               "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
               "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
               "requires": {
                 "ms": "2.0.0"
               }
@@ -26630,6 +27454,7 @@
               "version": "0.11.1",
               "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
               "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+              "dev": true,
               "requires": {
                 "websocket-driver": ">=0.5.1"
               }
@@ -26640,6 +27465,7 @@
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
           "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+          "dev": true,
           "requires": {
             "is-plain-obj": "^1.0.0"
           }
@@ -26647,7 +27473,8 @@
         "source-list-map": {
           "version": "0.1.8",
           "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
-          "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY="
+          "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=",
+          "dev": true
         },
         "source-map": {
           "version": "0.4.4",
@@ -26661,6 +27488,7 @@
           "version": "0.4.18",
           "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
           "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+          "dev": true,
           "requires": {
             "source-map": "^0.5.6"
           },
@@ -26668,7 +27496,8 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             }
           }
         },
@@ -26681,6 +27510,7 @@
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
           "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+          "dev": true,
           "requires": {
             "spdx-expression-parse": "^3.0.0",
             "spdx-license-ids": "^3.0.0"
@@ -26689,12 +27519,14 @@
         "spdx-exceptions": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
-          "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+          "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+          "dev": true
         },
         "spdx-expression-parse": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
           "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+          "dev": true,
           "requires": {
             "spdx-exceptions": "^2.1.0",
             "spdx-license-ids": "^3.0.0"
@@ -26703,17 +27535,20 @@
         "spdx-license-ids": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
-          "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+          "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+          "dev": true
         },
         "sprintf-js": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+          "dev": true
         },
         "sshpk": {
           "version": "1.14.2",
           "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
           "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+          "dev": true,
           "requires": {
             "asn1": "~0.2.3",
             "assert-plus": "^1.0.0",
@@ -26729,7 +27564,8 @@
             "assert-plus": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+              "dev": true
             }
           }
         },
@@ -26737,6 +27573,7 @@
           "version": "0.2.4",
           "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz",
           "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=",
+          "dev": true,
           "requires": {
             "escodegen": "~0.0.24"
           },
@@ -26745,6 +27582,7 @@
               "version": "0.0.28",
               "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz",
               "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=",
+              "dev": true,
               "requires": {
                 "esprima": "~1.0.2",
                 "estraverse": "~1.3.0",
@@ -26754,12 +27592,14 @@
             "esprima": {
               "version": "1.0.4",
               "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
-              "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0="
+              "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=",
+              "dev": true
             },
             "estraverse": {
               "version": "1.3.2",
               "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz",
-              "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI="
+              "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=",
+              "dev": true
             }
           }
         },
@@ -26767,6 +27607,7 @@
           "version": "1.5.0",
           "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz",
           "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=",
+          "dev": true,
           "requires": {
             "concat-stream": "~1.6.0",
             "duplexer2": "~0.0.2",
@@ -26784,12 +27625,14 @@
             "isarray": {
               "version": "0.0.1",
               "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+              "dev": true
             },
             "readable-stream": {
               "version": "1.0.34",
               "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
               "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+              "dev": true,
               "requires": {
                 "core-util-is": "~1.0.0",
                 "inherits": "~2.0.1",
@@ -26800,19 +27643,22 @@
             "string_decoder": {
               "version": "0.10.31",
               "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+              "dev": true
             }
           }
         },
         "statuses": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
+          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+          "dev": true
         },
         "stream-browserify": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
           "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+          "dev": true,
           "requires": {
             "inherits": "~2.0.1",
             "readable-stream": "^2.0.2"
@@ -26821,7 +27667,8 @@
         "stream-cache": {
           "version": "0.0.2",
           "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz",
-          "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8="
+          "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8=",
+          "dev": true
         },
         "stream-consume": {
           "version": "0.1.1",
@@ -26832,6 +27679,7 @@
           "version": "2.8.3",
           "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
           "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+          "dev": true,
           "requires": {
             "builtin-status-codes": "^3.0.0",
             "inherits": "^2.0.1",
@@ -26843,14 +27691,16 @@
             "xtend": {
               "version": "4.0.1",
               "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-              "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+              "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+              "dev": true
             }
           }
         },
         "streamsink": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/streamsink/-/streamsink-1.2.0.tgz",
-          "integrity": "sha1-76/unx4i01ke1949yqlcP1559zw="
+          "integrity": "sha1-76/unx4i01ke1949yqlcP1559zw=",
+          "dev": true
         },
         "strict-uri-encode": {
           "version": "1.1.0",
@@ -26861,12 +27711,31 @@
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
           "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
             "strip-ansi": "^3.0.0"
           }
         },
+        "string.prototype.trimleft": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+          "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+          "requires": {
+            "define-properties": "^1.1.3",
+            "function-bind": "^1.1.1"
+          }
+        },
+        "string.prototype.trimright": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+          "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+          "requires": {
+            "define-properties": "^1.1.3",
+            "function-bind": "^1.1.1"
+          }
+        },
         "string_decoder": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -26878,12 +27747,14 @@
         "stringstream": {
           "version": "0.0.6",
           "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
-          "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA=="
+          "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
+          "dev": true
         },
         "strip-ansi": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
           "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -26892,6 +27763,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
           "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
           "requires": {
             "is-utf8": "^0.2.0"
           }
@@ -26900,6 +27772,7 @@
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
           "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+          "dev": true,
           "requires": {
             "get-stdin": "^4.0.1"
           }
@@ -26907,12 +27780,14 @@
         "strip-json-comments": {
           "version": "1.0.4",
           "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-          "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
+          "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
+          "dev": true
         },
         "style-loader": {
           "version": "0.13.2",
           "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz",
           "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=",
+          "dev": true,
           "requires": {
             "loader-utils": "^1.0.2"
           },
@@ -26921,6 +27796,7 @@
               "version": "1.1.0",
               "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
               "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+              "dev": true,
               "requires": {
                 "big.js": "^3.1.3",
                 "emojis-list": "^2.0.0",
@@ -26949,12 +27825,14 @@
         "supports-color": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
         },
         "svgo": {
           "version": "0.7.2",
           "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz",
           "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
+          "dev": true,
           "requires": {
             "coa": "~1.0.1",
             "colors": "~1.1.2",
@@ -26983,6 +27861,7 @@
           "version": "3.8.3",
           "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
           "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
+          "dev": true,
           "requires": {
             "ajv": "^4.7.0",
             "ajv-keywords": "^1.0.0",
@@ -26995,17 +27874,20 @@
             "ansi-regex": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+              "dev": true
             },
             "is-fullwidth-code-point": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+              "dev": true
             },
             "string-width": {
               "version": "2.1.1",
               "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
               "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+              "dev": true,
               "requires": {
                 "is-fullwidth-code-point": "^2.0.0",
                 "strip-ansi": "^4.0.0"
@@ -27015,6 +27897,7 @@
               "version": "4.0.0",
               "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
               "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
               "requires": {
                 "ansi-regex": "^3.0.0"
               }
@@ -27024,12 +27907,14 @@
         "tapable": {
           "version": "0.1.10",
           "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz",
-          "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q="
+          "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=",
+          "dev": true
         },
         "tar": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
           "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+          "dev": true,
           "requires": {
             "block-stream": "*",
             "fstream": "^1.0.2",
@@ -27161,7 +28046,8 @@
         "text-table": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-          "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+          "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+          "dev": true
         },
         "through": {
           "version": "2.3.8",
@@ -27172,6 +28058,7 @@
           "version": "0.4.2",
           "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
           "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=",
+          "dev": true,
           "requires": {
             "readable-stream": "~1.0.17",
             "xtend": "~2.1.1"
@@ -27180,12 +28067,14 @@
             "isarray": {
               "version": "0.0.1",
               "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+              "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+              "dev": true
             },
             "readable-stream": {
               "version": "1.0.34",
               "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
               "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+              "dev": true,
               "requires": {
                 "core-util-is": "~1.0.0",
                 "inherits": "~2.0.1",
@@ -27196,19 +28085,22 @@
             "string_decoder": {
               "version": "0.10.31",
               "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+              "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+              "dev": true
             }
           }
         },
         "time-stamp": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz",
-          "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c="
+          "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=",
+          "dev": true
         },
         "timers-browserify": {
           "version": "2.0.10",
           "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
           "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+          "dev": true,
           "requires": {
             "setimmediate": "^1.0.4"
           }
@@ -27235,22 +28127,26 @@
         "to-arraybuffer": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-          "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+          "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+          "dev": true
         },
         "to-fast-properties": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-          "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+          "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+          "dev": true
         },
         "toposort": {
           "version": "1.0.7",
           "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
-          "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk="
+          "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+          "dev": true
         },
         "tough-cookie": {
           "version": "2.3.4",
           "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
           "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+          "dev": true,
           "requires": {
             "punycode": "^1.4.1"
           }
@@ -27259,6 +28155,7 @@
           "version": "0.2.4",
           "resolved": "https://registry.npmjs.org/transform-loader/-/transform-loader-0.2.4.tgz",
           "integrity": "sha1-5ch4d7qW1R0/IlNoWHtG4ibRzsk=",
+          "dev": true,
           "requires": {
             "loader-utils": "^1.0.2"
           },
@@ -27267,6 +28164,7 @@
               "version": "1.1.0",
               "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
               "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+              "dev": true,
               "requires": {
                 "big.js": "^3.1.3",
                 "emojis-list": "^2.0.0",
@@ -27279,6 +28177,7 @@
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz",
           "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=",
+          "dev": true,
           "requires": {
             "css": "~1.0.8",
             "promise": "~2.0",
@@ -27288,12 +28187,14 @@
             "is-promise": {
               "version": "1.0.1",
               "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz",
-              "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU="
+              "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=",
+              "dev": true
             },
             "promise": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz",
               "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=",
+              "dev": true,
               "requires": {
                 "is-promise": "~1"
               }
@@ -27302,6 +28203,7 @@
               "version": "0.1.43",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
               "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+              "dev": true,
               "requires": {
                 "amdefine": ">=0.0.4"
               }
@@ -27310,6 +28212,7 @@
               "version": "2.2.5",
               "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz",
               "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=",
+              "dev": true,
               "requires": {
                 "optimist": "~0.3.5",
                 "source-map": "~0.1.7"
@@ -27320,12 +28223,14 @@
         "trim-newlines": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-          "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
+          "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+          "dev": true
         },
         "trim-right": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-          "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+          "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+          "dev": true
         },
         "tslib": {
           "version": "1.10.0",
@@ -27335,12 +28240,14 @@
         "tty-browserify": {
           "version": "0.0.0",
           "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
-          "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+          "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+          "dev": true
         },
         "tunnel-agent": {
           "version": "0.6.0",
           "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
           "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+          "dev": true,
           "requires": {
             "safe-buffer": "^5.0.1"
           }
@@ -27349,12 +28256,14 @@
           "version": "0.14.5",
           "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
           "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+          "dev": true,
           "optional": true
         },
         "type-check": {
           "version": "0.3.2",
           "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
           "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+          "dev": true,
           "requires": {
             "prelude-ls": "~1.1.2"
           }
@@ -27363,6 +28272,7 @@
           "version": "1.6.16",
           "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
           "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+          "dev": true,
           "requires": {
             "media-typer": "0.3.0",
             "mime-types": "~2.1.18"
@@ -27382,6 +28292,7 @@
           "version": "3.4.2",
           "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.2.tgz",
           "integrity": "sha512-/kVQDzwiE9Vy7Y63eMkMozF4jIt0C2+xHctF9YpqNWdE/NLOuMurshkpoYGUlAbeYhACPv0HJPIHJul0Ak4/uw==",
+          "dev": true,
           "requires": {
             "commander": "~2.15.0",
             "source-map": "~0.6.1"
@@ -27390,12 +28301,14 @@
             "commander": {
               "version": "2.15.1",
               "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-              "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+              "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+              "dev": true
             },
             "source-map": {
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+              "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+              "dev": true
             }
           }
         },
@@ -27415,22 +28328,26 @@
         "underscore": {
           "version": "1.6.0",
           "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
-          "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag="
+          "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+          "dev": true
         },
         "uniq": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
-          "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+          "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+          "dev": true
         },
         "uniqs": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
-          "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+          "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+          "dev": true
         },
         "unpipe": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-          "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+          "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+          "dev": true
         },
         "upper-case": {
           "version": "1.1.3",
@@ -27464,6 +28381,7 @@
           "version": "0.11.0",
           "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
           "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+          "dev": true,
           "requires": {
             "punycode": "1.3.2",
             "querystring": "0.2.0"
@@ -27472,7 +28390,8 @@
             "punycode": {
               "version": "1.3.2",
               "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-              "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+              "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+              "dev": true
             }
           }
         },
@@ -27485,6 +28404,7 @@
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz",
           "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==",
+          "dev": true,
           "requires": {
             "querystringify": "^2.0.0",
             "requires-port": "^1.0.0"
@@ -27494,6 +28414,7 @@
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
           "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+          "dev": true,
           "requires": {
             "os-homedir": "^1.0.0"
           }
@@ -27511,49 +28432,65 @@
           "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
           "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
         },
+        "util.promisify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+          "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+          "requires": {
+            "define-properties": "^1.1.2",
+            "object.getownpropertydescriptors": "^2.0.3"
+          }
+        },
         "utila": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
-          "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+          "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+          "dev": true
         },
         "utils-merge": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-          "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+          "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+          "dev": true
         },
         "uuid": {
           "version": "3.3.2",
           "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true
         },
         "validate-npm-package-license": {
           "version": "3.0.3",
           "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
           "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+          "dev": true,
           "requires": {
             "spdx-correct": "^3.0.0",
             "spdx-expression-parse": "^3.0.0"
           }
         },
         "value-equal": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz",
-          "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw=="
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
+          "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
         },
         "vary": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-          "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+          "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+          "dev": true
         },
         "vendors": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz",
-          "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ=="
+          "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==",
+          "dev": true
         },
         "verror": {
           "version": "1.10.0",
           "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
           "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+          "dev": true,
           "requires": {
             "assert-plus": "^1.0.0",
             "core-util-is": "1.0.2",
@@ -27563,7 +28500,8 @@
             "assert-plus": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+              "dev": true
             }
           }
         },
@@ -27571,6 +28509,7 @@
           "version": "0.0.4",
           "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
           "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+          "dev": true,
           "requires": {
             "indexof": "0.0.1"
           }
@@ -27578,7 +28517,8 @@
         "void-elements": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
-          "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
+          "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+          "dev": true
         },
         "warning": {
           "version": "2.1.0",
@@ -27592,6 +28532,7 @@
           "version": "0.2.9",
           "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz",
           "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=",
+          "dev": true,
           "requires": {
             "async": "^0.9.0",
             "chokidar": "^1.0.0",
@@ -27601,7 +28542,8 @@
             "async": {
               "version": "0.9.2",
               "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
-              "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+              "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
+              "dev": true
             }
           }
         },
@@ -27609,6 +28551,7 @@
           "version": "1.15.0",
           "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz",
           "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=",
+          "dev": true,
           "requires": {
             "acorn": "^3.0.0",
             "async": "^1.3.0",
@@ -27630,17 +28573,20 @@
             "acorn": {
               "version": "3.3.0",
               "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-              "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+              "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+              "dev": true
             },
             "async": {
               "version": "1.5.2",
               "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-              "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+              "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+              "dev": true
             },
             "optimist": {
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
               "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+              "dev": true,
               "requires": {
                 "minimist": "~0.0.1",
                 "wordwrap": "~0.0.2"
@@ -27649,12 +28595,14 @@
             "source-map": {
               "version": "0.5.7",
               "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
             },
             "supports-color": {
               "version": "3.2.3",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
               "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+              "dev": true,
               "requires": {
                 "has-flag": "^1.0.0"
               }
@@ -27663,6 +28611,7 @@
               "version": "2.7.5",
               "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz",
               "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=",
+              "dev": true,
               "requires": {
                 "async": "~0.2.6",
                 "source-map": "~0.5.1",
@@ -27673,7 +28622,8 @@
                 "async": {
                   "version": "0.2.10",
                   "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
-                  "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
+                  "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+                  "dev": true
                 }
               }
             }
@@ -27683,6 +28633,7 @@
           "version": "0.6.9",
           "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
           "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
+          "dev": true,
           "requires": {
             "source-list-map": "~0.1.7",
             "source-map": "~0.4.1"
@@ -27692,6 +28643,7 @@
           "version": "1.12.2",
           "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
           "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+          "dev": true,
           "requires": {
             "memory-fs": "~0.4.1",
             "mime": "^1.5.0",
@@ -27704,6 +28656,7 @@
               "version": "0.4.1",
               "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
               "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+              "dev": true,
               "requires": {
                 "errno": "^0.1.3",
                 "readable-stream": "^2.0.1"
@@ -27715,6 +28668,7 @@
           "version": "1.16.5",
           "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz",
           "integrity": "sha1-DL1fLSrI1OWTqs1clwLnu9XlmJI=",
+          "dev": true,
           "requires": {
             "compression": "^1.5.2",
             "connect-history-api-fallback": "^1.3.0",
@@ -27735,6 +28689,7 @@
               "version": "0.6.1",
               "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
               "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+              "dev": true,
               "requires": {
                 "minimist": "~0.0.1",
                 "wordwrap": "~0.0.2"
@@ -27744,6 +28699,7 @@
               "version": "3.2.3",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
               "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+              "dev": true,
               "requires": {
                 "has-flag": "^1.0.0"
               }
@@ -27754,6 +28710,7 @@
           "version": "0.6.7",
           "resolved": "https://registry.npmjs.org/webpack-s3-plugin/-/webpack-s3-plugin-0.6.7.tgz",
           "integrity": "sha1-ABLVqFLwPYmz0gj8I3dA6K0iAyA=",
+          "dev": true,
           "requires": {
             "aws-sdk": "~2.0.31",
             "cdnizer": "^1.1.5",
@@ -27766,6 +28723,7 @@
           "version": "0.7.0",
           "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
           "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+          "dev": true,
           "requires": {
             "http-parser-js": ">=0.4.0",
             "websocket-extensions": ">=0.1.1"
@@ -27774,7 +28732,8 @@
         "websocket-extensions": {
           "version": "0.1.3",
           "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
-          "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
+          "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+          "dev": true
         },
         "whatwg-fetch": {
           "version": "0.9.0",
@@ -27784,12 +28743,14 @@
         "whet.extend": {
           "version": "0.9.9",
           "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
-          "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE="
+          "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=",
+          "dev": true
         },
         "which": {
           "version": "1.3.1",
           "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
           "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
           "requires": {
             "isexe": "^2.0.0"
           }
@@ -27797,12 +28758,14 @@
         "which-module": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
-          "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+          "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+          "dev": true
         },
         "wide-align": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
           "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+          "dev": true,
           "requires": {
             "string-width": "^1.0.2 || 2"
           }
@@ -27821,6 +28784,7 @@
           "version": "4.0.3",
           "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz",
           "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=",
+          "dev": true,
           "requires": {
             "acorn": "^1.0.1",
             "acorn-globals": "^1.0.3"
@@ -27829,19 +28793,22 @@
             "acorn": {
               "version": "1.2.2",
               "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz",
-              "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ="
+              "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=",
+              "dev": true
             }
           }
         },
         "wordwrap": {
           "version": "0.0.3",
           "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+          "dev": true
         },
         "wrap-ansi": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
           "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+          "dev": true,
           "requires": {
             "string-width": "^1.0.1",
             "strip-ansi": "^3.0.1"
@@ -27856,6 +28823,7 @@
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
           "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+          "dev": true,
           "requires": {
             "mkdirp": "^0.5.1"
           }
@@ -27869,6 +28837,7 @@
           "version": "0.2.6",
           "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.6.tgz",
           "integrity": "sha1-0gnE5N2h/JxFIUHvQcB39a399sQ=",
+          "dev": true,
           "requires": {
             "sax": "0.4.2"
           },
@@ -27876,19 +28845,22 @@
             "sax": {
               "version": "0.4.2",
               "resolved": "https://registry.npmjs.org/sax/-/sax-0.4.2.tgz",
-              "integrity": "sha1-OfO2AXM9a+yXEFskKipA/Wl4rDw="
+              "integrity": "sha1-OfO2AXM9a+yXEFskKipA/Wl4rDw=",
+              "dev": true
             }
           }
         },
         "xmlbuilder": {
           "version": "0.4.2",
           "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz",
-          "integrity": "sha1-F3bWXz/brUcKCNhgTN6xxOVA/4M="
+          "integrity": "sha1-F3bWXz/brUcKCNhgTN6xxOVA/4M=",
+          "dev": true
         },
         "xtend": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
           "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+          "dev": true,
           "requires": {
             "object-keys": "~0.4.0"
           },
@@ -27896,19 +28868,22 @@
             "object-keys": {
               "version": "0.4.0",
               "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
-              "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+              "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+              "dev": true
             }
           }
         },
         "y18n": {
           "version": "3.2.1",
           "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
         },
         "yallist": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
         },
         "yargs": {
           "version": "3.10.0",
@@ -27925,6 +28900,7 @@
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
           "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+          "dev": true,
           "requires": {
             "camelcase": "^3.0.0"
           },
@@ -27932,7 +28908,8 @@
             "camelcase": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-              "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+              "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+              "dev": true
             }
           }
         },
diff --git a/package.json b/package.json
index 16f4613c..ea78b441 100644
--- a/package.json
+++ b/package.json
@@ -31,7 +31,7 @@
     "lint:js": "./node_modules/.bin/eslint --ext .js,.jsx .",
     "test": "npm run lint && npm run jest"
   },
-  "version": "0.8.3",
+  "version": "0.9.1",
   "dependencies": {
     "auth0-js": "^6.8.4",
     "config": "^3.2.0",
diff --git a/src/actions/lookup.js b/src/actions/lookup.js
index ec20cc9f..350f2267 100644
--- a/src/actions/lookup.js
+++ b/src/actions/lookup.js
@@ -42,11 +42,30 @@ function getCountriesDone() {
   return getService().getCountries();
 }
 
+/**
+ * @static
+ * @desc Creates an action that signals beginning of getting all countries api version 5.
+ * @return {Action}
+ */
+function getAllCountriesInit() {}
+
+/**
+ * @static
+ * @desc Creates an action that gets all countries api version 5.
+ * @param {String} tokenV3 Optional. Auth token for Topcoder API v3.
+ * @return {Action}
+ */
+function getAllCountriesDone(tokenV3) {
+  return getService(tokenV3).getAllCountries();
+}
+
 export default createActions({
   LOOKUP: {
     GET_SKILL_TAGS_INIT: getSkillTagsInit,
     GET_SKILL_TAGS_DONE: getSkillTagsDone,
     GET_COUNTRIES_INIT: getCountriesInit,
     GET_COUNTRIES_DONE: getCountriesDone,
+    GET_ALL_COUNTRIES_INIT: getAllCountriesInit,
+    GET_ALL_COUNTRIES_DONE: getAllCountriesDone,
   },
 });
diff --git a/src/reducers/lookup.js b/src/reducers/lookup.js
index db53ddf1..a8e0670e 100644
--- a/src/reducers/lookup.js
+++ b/src/reducers/lookup.js
@@ -48,6 +48,25 @@ function onGetCountriesDone(state, { payload, error }) {
   });
 }
 
+/**
+ * Handles LOOKUP/GET_ALL_COUNTRIES_DONE action.
+ * @param {Object} state
+ * @param {Object} action Payload will be JSON from api call
+ * @return {Object} New state
+ */
+function onGetAllCountriesDone(state, { payload, error }) {
+  if (error) {
+    logger.error('Failed to get all countries', payload);
+    return { ...state, loadingAllCountriesError: true };
+  }
+
+  return ({
+    ...state,
+    loadingAllCountriesError: false,
+    allCountries: payload,
+  });
+}
+
 /**
  * Creates a new Lookup reducer with the specified initial state.
  * @param {Object} initialState Optional. Initial state.
@@ -60,9 +79,12 @@ function create(initialState = {}) {
     [a.getSkillTagsDone]: onGetSkillTagsDone,
     [a.getCountriesInit]: state => state,
     [a.getCountriesDone]: onGetCountriesDone,
+    [a.getAllCountriesInit]: state => state,
+    [a.getAllCountriesDone]: onGetAllCountriesDone,
   }, _.defaults(initialState, {
     skillTags: [],
     countries: [],
+    allCountries: [],
   }));
 }
 
diff --git a/src/services/challenges.js b/src/services/challenges.js
index 58a98e87..53ae2f0a 100644
--- a/src/services/challenges.js
+++ b/src/services/challenges.js
@@ -12,6 +12,7 @@ import logger from '../utils/logger';
 import { setErrorIcon, ERROR_ICON_TYPES } from '../utils/errors';
 import { COMPETITION_TRACKS, getApiResponsePayload } from '../utils/tc';
 import { getApi } from './api';
+import { getService as getMembersService } from './members';
 
 export const ORDER_BY = {
   SUBMISSION_END_DATE: 'submissionEndDate',
@@ -262,6 +263,7 @@ class ChallengesService {
       getChallenges,
       tokenV2,
       tokenV3,
+      memberService: getMembersService(),
     };
   }
 
diff --git a/src/services/lookup.js b/src/services/lookup.js
index 76c6a792..8c6595a9 100644
--- a/src/services/lookup.js
+++ b/src/services/lookup.js
@@ -14,6 +14,7 @@ class LookupService {
   constructor(tokenV3) {
     this.private = {
       api: getApi('V3', tokenV3),
+      apiV5: getApi('V5', tokenV3),
       tokenV3,
     };
   }
@@ -37,6 +38,16 @@ class LookupService {
     const res = await this.private.api.get('/members/lookup/countries');
     return getApiResponsePayload(res);
   }
+
+  /**
+   * Gets all countries.
+   * @return {Promise} Resolves to the countries.
+   */
+  async getAllCountries() {
+    const res = await this.private.apiV5.get('/lookups/countries');
+    const jsonResult = await res.json();
+    return jsonResult;
+  }
 }
 
 let lastInstance = null;
diff --git a/src/utils/tc.js b/src/utils/tc.js
index 77fce85a..4b27c0aa 100644
--- a/src/utils/tc.js
+++ b/src/utils/tc.js
@@ -29,12 +29,25 @@ export const REVIEW_OPPORTUNITY_TYPES = {
  * Gets payload from a standard success response from TC API; or throws
  * an error in case of a failure response.
  * @param {Object} res
+ * @param {Boolean} shouldThrowError should throw error if request fail
  * @return {Promise} Resolves to the payload.
  */
-export async function getApiResponsePayload(res) {
-  if (!res.ok) throw new Error(res.statusText);
+export async function getApiResponsePayload(res, shouldThrowError = true) {
+  if (!res.ok) {
+    if (shouldThrowError) {
+      throw new Error(res.statusText);
+    } else {
+      return null;
+    }
+  }
   const x = (await res.json()).result;
-  if (!x.success) throw new Error(x.content);
+  if ((!x.success)) {
+    if (shouldThrowError) {
+      throw new Error(x.content);
+    } else {
+      return null;
+    }
+  }
   return x.content;
 }