Backed out changeset 3a1d45b3084d (bug 1406551) for leaks and frequently failing new devtools test devtools/client/debugger/new/test/mochitest/browser_dbg-wasm-sourcemaps.js. r=backout a=backout
authorSebastian Hengst <archaeopteryx@coole-files.de>
Mon, 09 Oct 2017 21:11:26 +0200
changeset 385200 2ed5e7fbf39e949693d8a7455d6313b14a7aeaf6
parent 385199 ac48941b6d2054fa053c6102e2b933f4779d6f0b
child 385201 515cf29433ccc43d9eace000a7452443b48d5c8c
child 385214 12293a4b3e23904229f8afd3e56805ffe072fde4
child 385260 09d2360fff588ec7c6bb534d952db6c336b894da
push id32647
push userarchaeopteryx@coole-files.de
push dateMon, 09 Oct 2017 21:55:00 +0000
treeherdermozilla-central@2ed5e7fbf39e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbackout, backout
bugs1406551
milestone58.0a1
backs out3a1d45b3084d8c2f58d9aeb881d07ec6884b78f0
first release with
nightly linux32
2ed5e7fbf39e / 58.0a1 / 20171009220104 / files
nightly linux64
2ed5e7fbf39e / 58.0a1 / 20171009220104 / files
nightly mac
2ed5e7fbf39e / 58.0a1 / 20171009220104 / files
nightly win32
2ed5e7fbf39e / 58.0a1 / 20171009220104 / files
nightly win64
2ed5e7fbf39e / 58.0a1 / 20171009220104 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 3a1d45b3084d (bug 1406551) for leaks and frequently failing new devtools test devtools/client/debugger/new/test/mochitest/browser_dbg-wasm-sourcemaps.js. r=backout a=backout MozReview-Commit-ID: 6NxdP26SSKw
devtools/client/debugger/new/README.mozilla
devtools/client/debugger/new/debugger.css
devtools/client/debugger/new/debugger.js
devtools/client/debugger/new/parser-worker.js
devtools/client/debugger/new/pretty-print-worker.js
devtools/client/debugger/new/search-worker.js
devtools/client/debugger/new/test/mochitest/browser.ini
devtools/client/debugger/new/test/mochitest/browser_dbg-expressions-error.js
devtools/client/debugger/new/test/mochitest/browser_dbg-reload.js
devtools/client/debugger/new/test/mochitest/browser_dbg-wasm-sourcemaps.js
devtools/client/debugger/new/test/mochitest/examples/reload/code_reload_1.js
devtools/client/debugger/new/test/mochitest/examples/reload/code_reload_2.js
devtools/client/debugger/new/test/mochitest/examples/reload/doc_reload.html
devtools/client/debugger/new/test/mochitest/examples/reload/sjs_code_reload.sjs
devtools/client/debugger/new/test/mochitest/head.js
devtools/client/locales/en-US/debugger.properties
devtools/client/preferences/debugger.js
deleted file mode 100644
--- a/devtools/client/debugger/new/README.mozilla
+++ /dev/null
@@ -1,11 +0,0 @@
-This is the debugger.html project output.
-See https://github.com/devtools-html/debugger.html
-
-Taken from upstream commit: 6a34276ba4e2e4f8dfb2123eb4e6795ae658486a
-
-Packages:
-- babel-plugin-transform-es2015-modules-commonjs @6.26.0
-- babel-preset-react @6.24.1
-- react @15.6.2
-- react-dom @15.6.2
-- webpack @3.6.0
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -407,43 +407,43 @@ body {
 }
 
 :root.theme-dark .CodeMirror-scrollbar-filler {
   background: transparent;
 }
 .modal-wrapper {
   position: fixed;
   display: flex;
-  align-items: center;
+  justify-content: center;
   width: 100%;
   height: 100%;
   top: 0;
   left: 0;
   transition: z-index 200ms;
   z-index: 100;
 }
 
 .modal {
   top: 0;
-  margin: auto;
+  height: 230px;
   width: 500px;
   background-color: var(--theme-toolbar-background);
   transform: translateY(-250px);
   transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
   box-shadow: 0 0 10px 2px var(--popup-shadow-color);
 }
 
 .modal.entering,
 .modal.exited {
   transform: translateY(-250px);
 }
 
 .modal.entered,
 .modal.exiting {
-  transform: translateY(0px);
+  transform: translateY(30px);
 }
 
 @media (max-width: 520px) {
   .modal {
     width: 80%;
     left: 10%;
   }
 }
@@ -485,16 +485,17 @@ body {
   list-style: none;
   margin: 0px;
   padding: 0px;
   overflow: auto;
   width: calc(100% - 1px); /* 1px fixes the hidden right border */
 }
 
 .shortcuts-modal {
+  height: fit-content;
   width: 45%;
 }
 
 .shortcuts-list li {
   font-size: 12px;
   color: var(--theme-body-color);
   padding-top: 5px;
   display: flex;
@@ -967,17 +968,17 @@ html .arrow.expanded svg {
 .arrow.hidden {
   visibility: hidden;
 }
 
 .webpack svg {
   width: 15px;
   height: 15px;
   margin-right: 5px;
-  vertical-align: sub;
+  vertical-align: bottom;
 }
 
 .theme-dark .webpack {
   opacity: 0.5;
 }
 .managed-tree .tree {
   -webkit-user-select: none;
   -moz-user-select: none;
@@ -1422,17 +1423,16 @@ html[dir="rtl"] .managed-tree .tree .nod
   user-select: none;
 }
 
 .sources-list {
   flex: 1;
   display: flex;
   overflow-x: hidden;
   overflow-y: auto;
-  padding-top: 11px;
 }
 
 .sources-list .managed-tree {
   flex: 1;
   display: flex;
   overflow-x: hidden;
   overflow-y: auto;
 }
@@ -1457,21 +1457,16 @@ html[dir="rtl"] .managed-tree .tree .nod
   background-color: var(--theme-selection-background);
 }
 
 .sources-list .tree .label {
   padding: 3px 0px 3px 0px;
   display: inline-block;
 }
 
-.sources-list .tree .node .no-arrow {
-  width: 10px;
-  display: inline-block;
-}
-
 .no-sources-message {
   font-size: 12px;
   color: var(--theme-comment-alt);
   font-weight: lighter;
   padding-top: 5px;
   flex-grow: 1;
   display: flex;
   justify-content: center;
@@ -1497,17 +1492,17 @@ html[dir="rtl"] .managed-tree .tree .nod
   flex: 1;
   justify-content: center;
   border-bottom: 1px solid transparent;
   border-left: 1px solid transparent;
   display: inline-flex;
   position: relative;
   transition: all 0.25s ease;
   overflow: hidden;
-  padding: 8px 8px 7px 8px;
+  padding: 6.5px;
   margin-bottom: 0px;
   margin-top: -1px;
   cursor: default;
 }
 
 .source-outline-tabs .tab:first-child {
   border-left: 0;
 }
@@ -2353,16 +2348,21 @@ html[dir="rtl"] .arrow svg,
 .theme-dark {
   --theme-conditional-breakpoint-color: #9fa4a9;
 }
 
 .theme-light {
   --theme-conditional-breakpoint-color: var(--theme-body-color);
 }
 
+.paused .CodeMirror-line,
+.paused .CodeMirror-linenumber {
+  opacity: 0.7;
+}
+
 /**
  * There's a known codemirror flex issue with chrome that this addresses.
  * BUG https://github.com/devtools-html/debugger.html/issues/63
  */
 .editor-wrapper {
   position: absolute;
   height: calc(100% - 31px);
   width: calc(100% - 1.5px);
@@ -2624,17 +2624,16 @@ html .breakpoints-list .breakpoint.pause
 }
 
 .breakpoint-label .location {
   width: 100%;
   display: inline-block;
   overflow-x: hidden;
   text-overflow: ellipsis;
   padding: 1px 0;
-  vertical-align: bottom;
 }
 
 .breakpoints-list .pause-indicator {
   flex: 0 1 content;
   order: 3;
 }
 
 :root.theme-light .breakpoint-snippet,
@@ -3212,63 +3211,31 @@ html .command-bar > button:disabled {
 .welcomebox .toggle-button-end {
   position: absolute;
   top: auto;
   bottom: 0;
   offset-inline-end: 0;
   offset-inline-start: auto;
 }
 
-.welcomebox .small-size-layout {
-  display: none;
-}
-
-.welcomebox .normal-layout {
-  display: inline-block;
-}
-
 .shortcutKeys {
   text-align: right;
   float: left;
   font-family: Courier;
 }
 
-.shortcutKey {
-  display: inline-block;
-  margin-right: 10px;
-  font-family: Courier;
-}
-
 .shortcutFunction {
   text-align: left;
   float: left;
   margin-left: 25px;
 }
 
 html .welcomebox .toggle-button-end.collapsed {
   bottom: 1px;
 }
-
-@media (max-width: 430px) {
-  .welcomebox .small-size-layout {
-    display: inline-block;
-  }
-
-  .welcomebox .normal-layout {
-    display: none;
-  }
-
-  .shortcutFunction {
-    margin-left: 0;
-  }
-
-  .shortcutKey {
-    display: block;
-  }
-}
 .source-header {
   border-bottom: 1px solid var(--theme-splitter-color);
   width: 100%;
   height: 29px;
   display: flex;
   align-items: flex-end;
 }
 
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -1290,17 +1290,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.addSearchQuery = addSearchQuery;
 exports.clearSearchQuery = clearSearchQuery;
 exports.clearSearchResults = clearSearchResults;
 exports.searchSources = searchSources;
 exports.searchSource = searchSource;
 
-var _search = __webpack_require__(1210);
+var _search = __webpack_require__(1115);
 
 var _selectors = __webpack_require__(242);
 
 var _source = __webpack_require__(233);
 
 var _sources = __webpack_require__(254);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
@@ -1536,133 +1536,111 @@ Object.defineProperty(exports, "isNotJav
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.addToTree = addToTree;
 
 var _utils = __webpack_require__(18);
 
-var _treeOrder = __webpack_require__(1239);
-
 var _getURL = __webpack_require__(24);
 
-function createNodeInTree(part, path, tree, index) {
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function createNodeInTree(part, path, tree) {
   var node = (0, _utils.createNode)(part, path, []);
-
   // we are modifying the tree
-  var contents = tree.contents.slice(0);
-  contents.splice(index, 0, node);
-  tree.contents = contents;
-
+  tree.contents = [].concat(_toConsumableArray(tree.contents), [node]);
   return node;
 }
 
 /*
  * Look for the child directory
  * 1. if it exists return it
  * 2. if it does not exist create it
  * 3. if it is a file, replace it with a directory
  */
-
-
-function findOrCreateNode(parts, subTree, path, part, index, url, debuggeeHost) {
-  var addedPartIsFile = (0, _utils.partIsFile)(index, parts, url);
-
-  var _findNodeInContents = (0, _treeOrder.findNodeInContents)(subTree, (0, _treeOrder.createTreeNodeMatcher)(part, !addedPartIsFile, debuggeeHost)),
-      childFound = _findNodeInContents.found,
-      childIndex = _findNodeInContents.index;
+function findOrCreateNode(parts, subTree, path, part, index, url) {
+  var child = subTree.contents.find(c => c.name === part);
 
   // we create and enter the new node
-
-
-  if (!childFound) {
-    return createNodeInTree(part, path, subTree, childIndex);
+  if (!child) {
+    return createNodeInTree(part, path, subTree);
   }
 
   // we found a path with the same name as the part. We need to determine
   // if this is the correct child, or if we have a naming conflict
-  var child = subTree.contents[childIndex];
+  var addedPartIsFile = (0, _utils.partIsFile)(index, parts, url);
   var childIsFile = !(0, _utils.nodeHasChildren)(child);
 
   // if we have a naming conflict, we'll create a new node
   if (childIsFile && !addedPartIsFile || !childIsFile && addedPartIsFile) {
-    return createNodeInTree(part, path, subTree, childIndex);
+    return createNodeInTree(part, path, subTree);
   }
 
   // if there is no naming conflict, we can traverse into the child
   return child;
 }
 
 /*
  * walk the source tree to the final node for a given url,
  * adding new nodes along the way
  */
-function traverseTree(url, tree, debuggeeHost) {
+function traverseTree(url, tree) {
   url.path = decodeURIComponent(url.path);
 
   var parts = url.path.split("/").filter(p => p !== "");
   parts.unshift(url.group);
 
   var path = "";
   return parts.reduce((subTree, part, index) => {
     path = `${path}/${part}`;
-    var debuggeeHostIfRoot = index === 0 ? debuggeeHost : null;
-    return findOrCreateNode(parts, subTree, path, part, index, url, debuggeeHostIfRoot);
+    return findOrCreateNode(parts, subTree, path, part, index, url);
   }, tree);
 }
 
 /*
  * Add a source file to a directory node in the tree
  */
 function addSourceToNode(node, url, source) {
   var isFile = !(0, _utils.isDirectory)(url);
 
   // if we have a file, and the subtree has no elements, overwrite the
   // subtree contents with the source
   if (isFile) {
     return source;
   }
 
   var name = (0, _getURL.getFilenameFromPath)(url.path);
-
-  var _findNodeInContents2 = (0, _treeOrder.findNodeInContents)(node, (0, _treeOrder.createTreeNodeMatcher)(name, false, null)),
-      childFound = _findNodeInContents2.found,
-      childIndex = _findNodeInContents2.index;
+  var existingNode = node.contents.find(childNode => childNode.name === name);
 
   // if we are readding an existing file in the node, overwrite the existing
   // file and return the node's contents
-
-
-  if (childFound) {
-    var existingNode = node.contents[childIndex];
+  if (existingNode) {
     existingNode.contents = source;
     return node.contents;
   }
 
   // if this is a new file, add the new file;
   var newNode = (0, _utils.createNode)(name, source.get("url"), source);
-  var contents = node.contents.slice(0);
-  contents.splice(childIndex, 0, newNode);
-  return contents;
+  return [].concat(_toConsumableArray(node.contents), [newNode]);
 }
 
 /**
  * @memberof utils/sources-tree
  * @static
  */
 function addToTree(tree, source, debuggeeUrl) {
   var url = (0, _getURL.getURL)(source.get("url"), debuggeeUrl);
-  var debuggeeHost = (0, _treeOrder.getDomain)(debuggeeUrl);
 
   if ((0, _utils.isInvalidUrl)(url, source)) {
     return;
   }
 
-  var finalNode = traverseTree(url, tree, debuggeeHost);
+  var finalNode = traverseTree(url, tree);
   finalNode.contents = addSourceToNode(finalNode, url, source);
 }
 
 /***/ }),
 /* 41 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -5450,20 +5428,22 @@ module.exports = {
   sidePanelItems
 };
 
 /***/ }),
 /* 146 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
+ *  Copyright (c) 2014-2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
  */
 
 (function (global, factory) {
    true ? module.exports = factory() :
   typeof define === 'function' && define.amd ? define(factory) :
   (global.Immutable = factory());
 }(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice;
 
@@ -11890,17 +11870,17 @@ module.exports = {
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(1221);
+__webpack_require__(851);
 var dom = React.DOM;
 
 var ImPropTypes = __webpack_require__(150);
 var configMap = __webpack_require__(145).sidePanelItems;
 var Tabs = React.createFactory(__webpack_require__(172));
 var Sidebar = React.createFactory(__webpack_require__(176));
 var Settings = React.createFactory(__webpack_require__(179));
 
@@ -12317,17 +12297,17 @@ function combineReducers(reducers) {
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var React = __webpack_require__(0);
 
-__webpack_require__(1222);
+__webpack_require__(852);
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 function getTabURL(tab, paramName) {
   var tabID = tab.get("id");
   return `/?${paramName}=${tabID}`;
 }
@@ -12554,17 +12534,17 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBP
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var React = __webpack_require__(0);
 var createElement = React.createElement;
 
-__webpack_require__(1223);
+__webpack_require__(853);
 var rocketSvg = __webpack_require__(1126);
 var InlineSVG = __webpack_require__(1205);
 
 var dom = React.DOM;
 
 var classnames = __webpack_require__(175);
 
 var Sidebar = React.createClass({
@@ -13216,17 +13196,17 @@ module.exports = {
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var classnames = __webpack_require__(175);
-__webpack_require__(1225);
+__webpack_require__(856);
 
 module.exports = function (className) {
   var root = document.createElement("div");
   root.className = classnames(className);
   root.style.setProperty("flex", 1);
   return root;
 };
 
@@ -13463,17 +13443,19 @@ exports.log = log;
  * A middleware that logs all actions coming through the system
  * to the console.
  */
 function log(_ref) {
   var dispatch = _ref.dispatch,
       getState = _ref.getState;
 
   return next => action => {
-    console.log(`[DISPATCH ${action.type}]`, action);
+    var actionText = JSON.stringify(action, null, 2);
+    var truncatedActionText = `${actionText.slice(0, 1000)}...`;
+    console.log(`[DISPATCH ${action.type}]`, action, truncatedActionText);
     next(action);
   };
 }
 
 /***/ }),
 /* 192 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -13593,17 +13575,17 @@ exports.promise = promiseMiddleware;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.createPrettySource = createPrettySource;
 
 var _selectors = __webpack_require__(242);
 
-var _prettyPrint = __webpack_require__(1213);
+var _prettyPrint = __webpack_require__(903);
 
 var _pause = __webpack_require__(255);
 
 var _source = __webpack_require__(233);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function createPrettySource(sourceId) {
@@ -13887,16 +13869,17 @@ const prefsSchemaVersion = "1.0.3";
 
 const pref = Services.pref;
 
 if (isDevelopment()) {
   pref("devtools.source-map.client-service.enabled", true);
   pref("devtools.debugger.pause-on-exceptions", false);
   pref("devtools.debugger.ignore-caught-exceptions", false);
   pref("devtools.debugger.call-stack-visible", false);
+  pref("devtools.debugger.scopes-visible", false);
   pref("devtools.debugger.start-panel-collapsed", false);
   pref("devtools.debugger.end-panel-collapsed", false);
   pref("devtools.debugger.tabs", "[]");
   pref("devtools.debugger.ui.framework-grouping-on", true);
   pref("devtools.debugger.pending-selected-location", "{}");
   pref("devtools.debugger.pending-breakpoints", "{}");
   pref("devtools.debugger.expressions", "[]");
   pref("devtools.debugger.file-search-case-sensitive", false);
@@ -13909,16 +13892,17 @@ if (isDevelopment()) {
   pref("devtools.debugger.features.shortcuts", true);
 }
 
 const prefs = new PrefsHelper("devtools", {
   clientSourceMapsEnabled: ["Bool", "source-map.client-service.enabled"],
   pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
   ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
   callStackVisible: ["Bool", "debugger.call-stack-visible"],
+  scopesVisible: ["Bool", "debugger.scopes-visible"],
   startPanelCollapsed: ["Bool", "debugger.start-panel-collapsed"],
   endPanelCollapsed: ["Bool", "debugger.end-panel-collapsed"],
   frameworkGroupingOn: ["Bool", "debugger.ui.framework-grouping-on"],
   tabs: ["Json", "debugger.tabs", []],
   pendingSelectedLocation: ["Json", "debugger.pending-selected-location", {}],
   pendingBreakpoints: ["Json", "debugger.pending-breakpoints", {}],
   expressions: ["Json", "debugger.expressions", []],
   fileSearchCaseSensitive: ["Bool", "debugger.file-search-case-sensitive"],
@@ -14601,17 +14585,17 @@ exports.default = update;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFileURL = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isThirdParty = exports.isPretty = exports.isJavaScript = undefined;
+exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isThirdParty = exports.isPretty = exports.isJavaScript = undefined;
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _utils = __webpack_require__(234);
 
 var _path = __webpack_require__(235);
 
 var _url = __webpack_require__(334);
@@ -14700,69 +14684,41 @@ function getPrettySourceURL(url) {
 /**
  * @memberof utils/source
  * @static
  */
 function getRawSourceURL(url) {
   return url.replace(/:formatted$/, "");
 }
 
-function resolveFileURL(url) {
-  var transformUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialUrl => initialUrl;
-
+function getFilenameFromURL(url) {
   url = getRawSourceURL(url || "");
-  var name = transformUrl(url);
+  var name = (0, _path.basename)(url) || "(index)";
   return (0, _utils.endTruncateStr)(name, 50);
 }
 
-function getFilenameFromURL(url) {
-  return resolveFileURL(url, initialUrl => (0, _path.basename)(initialUrl) || "(index)");
-}
-
-function getFormattedSourceId(id) {
-  var sourceId = id.split("/")[1];
-  return `SOURCE${sourceId}`;
-}
-
 /**
  * Show a source url's filename.
  * If the source does not have a url, use the source id.
  *
  * @memberof utils/source
  * @static
  */
 function getFilename(source) {
   var url = source.url,
       id = source.id;
 
   if (!url) {
-    return getFormattedSourceId(id);
+    var sourceId = id.split("/")[1];
+    return `SOURCE${sourceId}`;
   }
 
   return getFilenameFromURL(url);
 }
 
-/**
- * Show a source url.
- * If the source does not have a url, use the source id.
- *
- * @memberof utils/source
- * @static
- */
-function getFileURL(source) {
-  var url = source.url,
-      id = source.id;
-
-  if (!url) {
-    return getFormattedSourceId(id);
-  }
-
-  return resolveFileURL(url);
-}
-
 var contentTypeModeMap = {
   "text/javascript": { name: "javascript" },
   "text/typescript": { name: "javascript", typescript: true },
   "text/coffeescript": "coffeescript",
   "text/typescript-jsx": {
     name: "jsx",
     base: { name: "javascript", typescript: true }
   },
@@ -14864,17 +14820,16 @@ function isLoaded(source) {
 exports.isJavaScript = isJavaScript;
 exports.isPretty = isPretty;
 exports.isThirdParty = isThirdParty;
 exports.shouldPrettyPrint = shouldPrettyPrint;
 exports.getPrettySourceURL = getPrettySourceURL;
 exports.getRawSourceURL = getRawSourceURL;
 exports.getFilename = getFilename;
 exports.getFilenameFromURL = getFilenameFromURL;
-exports.getFileURL = getFileURL;
 exports.getSourcePath = getSourcePath;
 exports.getSourceLineCount = getSourceLineCount;
 exports.getMode = getMode;
 exports.isLoaded = isLoaded;
 
 /***/ }),
 /* 234 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -15379,17 +15334,16 @@ exports.getSelectedFrame = exports.getSe
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 exports.isStepping = isStepping;
 exports.isPaused = isPaused;
 exports.isEvaluatingExpression = isEvaluatingExpression;
-exports.pausedInEval = pausedInEval;
 exports.getLoadedObject = getLoadedObject;
 exports.getObjectProperties = getObjectProperties;
 exports.getIsWaitingOnBreak = getIsWaitingOnBreak;
 exports.getShouldPauseOnExceptions = getShouldPauseOnExceptions;
 exports.getShouldIgnoreCaughtExceptions = getShouldIgnoreCaughtExceptions;
 exports.getFrames = getFrames;
 exports.getFrameScopes = getFrameScopes;
 exports.getDebuggeeUrl = getDebuggeeUrl;
@@ -15562,29 +15516,16 @@ function isStepping(state) {
 function isPaused(state) {
   return !!getPause(state);
 }
 
 function isEvaluatingExpression(state) {
   return state.pause.command === "expression";
 }
 
-function pausedInEval(state) {
-  if (!state.pause.pause) {
-    return false;
-  }
-
-  var exception = state.pause.pause.why.exception;
-  if (!exception) {
-    return false;
-  }
-
-  return exception.preview.fileName === "debugger eval code";
-}
-
 function getLoadedObject(state, objectId) {
   return getLoadedObjects(state)[objectId];
 }
 
 function getObjectProperties(state, parentId) {
   return getLoadedObjects(state).filter(obj => obj.parentId == parentId);
 }
 
@@ -15900,18 +15841,16 @@ exports.default = update;
 
 /***/ }),
 /* 242 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
 var _expressions = __webpack_require__(228);
 
 var expressions = _interopRequireWildcard(_expressions);
 
 var _sources = __webpack_require__(232);
 
 var sources = _interopRequireWildcard(_sources);
 
@@ -15978,17 +15917,17 @@ var _isSelectedFrameVisible2 = _interopR
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _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; } }
 
 /**
  * @param object - location
  */
 
-module.exports = _extends({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, sourceTree, {
+module.exports = Object.assign({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, sourceTree, {
   getBreakpointAtLocation: _breakpointAtLocation2.default,
   getInScopeLines: _linesInScope2.default,
   getVisibleBreakpoints: _visibleBreakpoints2.default,
   isSelectedFrameVisible: _isSelectedFrameVisible2.default
 });
 
 /***/ }),
 /* 243 */
@@ -15996,20 +15935,16 @@ module.exports = _extends({}, expression
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -16022,23 +15957,23 @@ var _actions2 = _interopRequireDefault(_
 var _ShortcutsModal = __webpack_require__(1181);
 
 var _selectors = __webpack_require__(242);
 
 var _ui = __webpack_require__(1128);
 
 var _devtoolsModules = __webpack_require__(830);
 
-__webpack_require__(1228);
-
-__webpack_require__(1229);
-
-__webpack_require__(1230);
-
-__webpack_require__(1231);
+__webpack_require__(857);
+
+__webpack_require__(858);
+
+__webpack_require__(859);
+
+__webpack_require__(860);
 
 var _devtoolsSplitter = __webpack_require__(910);
 
 var _devtoolsSplitter2 = _interopRequireDefault(_devtoolsSplitter);
 
 var _ProjectSearch = __webpack_require__(1139);
 
 var _ProjectSearch2 = _interopRequireDefault(_ProjectSearch);
@@ -16090,28 +16025,26 @@ class App extends _react.Component {
     };
 
     this.getChildContext = this.getChildContext.bind(this);
     this.onLayoutChange = this.onLayoutChange.bind(this);
     this.toggleSymbolModal = this.toggleSymbolModal.bind(this);
     this.renderEditorPane = this.renderEditorPane.bind(this);
     this.renderVerticalLayout = this.renderVerticalLayout.bind(this);
     this.onEscape = this.onEscape.bind(this);
-    this.onCommandSlash = this.onCommandSlash.bind(this);
   }
 
   getChildContext() {
     return { shortcuts };
   }
 
   componentDidMount() {
     verticalLayoutBreakpoint.addListener(this.onLayoutChange);
     shortcuts.on(L10N.getStr("symbolSearch.search.key2"), this.toggleSymbolModal);
     shortcuts.on("Escape", this.onEscape);
-    shortcuts.on("Cmd+/", this.onCommandSlash);
   }
 
   componentWillUnmount() {
     verticalLayoutBreakpoint.removeListener(this.onLayoutChange);
     shortcuts.off(L10N.getStr("symbolSearch.search.key2"), this.toggleSymbolModal);
     shortcuts.off("Escape", this.onEscape);
   }
 
@@ -16122,20 +16055,16 @@ class App extends _react.Component {
 
 
     if (activeSearch) {
       e.preventDefault();
       closeActiveSearch();
     }
   }
 
-  onCommandSlash() {
-    this.toggleShortcutsModal();
-  }
-
   toggleSymbolModal(_, e) {
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         activeSearch = _props2.activeSearch,
         closeActiveSearch = _props2.closeActiveSearch,
         setActiveSearch = _props2.setActiveSearch;
 
 
@@ -16302,17 +16231,17 @@ class App extends _react.Component {
       { className: "debugger" },
       this.state.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
       this.renderSymbolModal(),
       this.renderShortcutsModal()
     );
   }
 }
 
-App.childContextTypes = { shortcuts: _propTypes2.default.object };
+App.childContextTypes = { shortcuts: _react.PropTypes.object };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   selectedSource: (0, _selectors.getSelectedSource)(state),
   startPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "start"),
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end"),
   activeSearch: (0, _selectors.getActiveSearch)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(App);
 
@@ -17261,21 +17190,19 @@ Object.defineProperty(exports, "__esModu
 });
 exports.addExpression = addExpression;
 exports.updateExpression = updateExpression;
 exports.deleteExpression = deleteExpression;
 exports.evaluateExpressions = evaluateExpressions;
 
 var _selectors = __webpack_require__(242);
 
-var _promise = __webpack_require__(193);
-
 var _expressions = __webpack_require__(1177);
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
 
 var parser = _interopRequireWildcard(_parser);
 
 function _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; } }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /**
@@ -17386,29 +17313,23 @@ function evaluateExpression(expression) 
           client = _ref8.client;
 
       if (!expression.input) {
         console.warn("Expressions should not be empty");
         return;
       }
 
       var error = yield parser.hasSyntaxError(expression.input);
-      if (error) {
-        return dispatch({
-          type: "EVALUATE_EXPRESSION",
-          input: expression.input,
-          value: { input: expression.input, result: error }
-        });
-      }
-
       var frameId = (0, _selectors.getSelectedFrameId)(getState());
+      var value = error ? { input: expression.input, result: error } : yield client.evaluate((0, _expressions.wrapExpression)(expression.input), { frameId });
+
       return dispatch({
         type: "EVALUATE_EXPRESSION",
         input: expression.input,
-        [_promise.PROMISE]: client.evaluate((0, _expressions.wrapExpression)(expression.input), { frameId })
+        value
       });
     });
 
     return function (_x3) {
       return _ref7.apply(this, arguments);
     };
   })();
 }
@@ -17648,17 +17569,16 @@ var checkSelectedSource = (() => {
 
 var checkPendingBreakpoint = (() => {
   var _ref2 = _asyncToGenerator(function* (state, dispatch, pendingBreakpoint, source) {
     var sourceUrl = pendingBreakpoint.location.sourceUrl;
 
     var sameSource = sourceUrl && sourceUrl === source.url;
 
     if (sameSource) {
-      yield dispatch((0, _loadSourceText.loadSourceText)(source));
       yield dispatch((0, _breakpoints.syncBreakpoint)(source.id, pendingBreakpoint));
     }
   });
 
   return function checkPendingBreakpoint(_x4, _x5, _x6, _x7) {
     return _ref2.apply(this, arguments);
   };
 })();
@@ -17725,17 +17645,17 @@ var _createPrettySource = __webpack_requ
 var _loadSourceText = __webpack_require__(1143);
 
 var _prefs = __webpack_require__(226);
 
 var _editor = __webpack_require__(257);
 
 var _sourceMaps = __webpack_require__(797);
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
 
 var parser = _interopRequireWildcard(_parser);
 
 var _selectors = __webpack_require__(242);
 
 function _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; } }
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -18207,17 +18127,17 @@ var getPausedPosition = exports.getPause
   };
 })();
 
 exports.updateFrameLocations = updateFrameLocations;
 exports.getPauseReason = getPauseReason;
 
 var _lodash = __webpack_require__(2);
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function updateFrameLocations(frames, sourceMaps) {
   if (!frames || frames.length == 0) {
     return Promise.resolve(frames);
   }
 
@@ -18495,17 +18415,17 @@ module.exports = escapeRegExp;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.showLoading = exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
+exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
 
 var _source = __webpack_require__(233);
 
 var _wasm = __webpack_require__(23);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 var resizeBreakpointGutter = _devtoolsSourceEditor.SourceEditorUtils.resizeBreakpointGutter;
@@ -18544,35 +18464,22 @@ function updateLineNumberFormat(editor, 
   cm.setOption("lineNumberFormatter", lineNumberFormatter);
   resizeBreakpointGutter(cm);
 }
 
 function updateDocument(editor, sourceId) {
   if (!sourceId) {
     return;
   }
-
   var doc = getDocument(sourceId) || editor.createDocument();
   editor.replaceDocument(doc);
 
   updateLineNumberFormat(editor, sourceId);
 }
 
-function showLoading(editor) {
-  if (getDocument("loading")) {
-    return;
-  }
-
-  var doc = editor.createDocument();
-  setDocument("loading", doc);
-  editor.replaceDocument(doc);
-  editor.setText(L10N.getStr("loadingText"));
-  editor.setMode({ name: "text" });
-}
-
 function setEditorText(editor, source) {
   var text = source.text,
       sourceId = source.id;
 
   if (source.isWasm) {
     var wasmLines = (0, _wasm.renderWasmText)(sourceId, text);
     // cm will try to split into lines anyway, saving memory
     var wasmText = { split: () => wasmLines, match: () => false };
@@ -18614,31 +18521,30 @@ function showSourceText(editor, source) 
 exports.getDocument = getDocument;
 exports.setDocument = setDocument;
 exports.removeDocument = removeDocument;
 exports.clearDocuments = clearDocuments;
 exports.resetLineNumberFormat = resetLineNumberFormat;
 exports.updateLineNumberFormat = updateLineNumberFormat;
 exports.updateDocument = updateDocument;
 exports.showSourceText = showSourceText;
-exports.showLoading = showLoading;
 
 /***/ }),
 /* 261 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getMatchIndex = exports.removeOverlay = exports.findPrev = exports.findNext = exports.find = exports.buildQuery = undefined;
 
-var _buildQuery = __webpack_require__(1211);
+var _buildQuery = __webpack_require__(1138);
 
 var _buildQuery2 = _interopRequireDefault(_buildQuery);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * @memberof utils/source-search
  * @static
@@ -19024,25 +18930,27 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.createTree = createTree;
 
 var _utils = __webpack_require__(18);
 
 var _collapseTree = __webpack_require__(41);
 
+var _sortTree = __webpack_require__(794);
+
 var _addToTree = __webpack_require__(40);
 
 function createTree(sources, debuggeeUrl) {
   var uncollapsedTree = (0, _utils.createNode)("root", "", []);
   for (var source of sources.valueSeq()) {
     (0, _addToTree.addToTree)(uncollapsedTree, source, debuggeeUrl);
   }
 
-  var sourceTree = (0, _collapseTree.collapseTree)(uncollapsedTree);
+  var sourceTree = (0, _sortTree.sortEntireTree)((0, _collapseTree.collapseTree)(uncollapsedTree), debuggeeUrl);
 
   return {
     uncollapsedTree,
     sourceTree,
     parentMap: (0, _utils.createParentMap)(sourceTree),
     focusedItem: null
   };
 }
@@ -19061,20 +18969,16 @@ function createTree(sources, debuggeeUrl
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
@@ -19107,18 +19011,18 @@ class ToggleSearch extends _react.Compon
         L10N.getStr("projectTextSearch.placeholder")
       )
     );
   }
 }
 
 exports.default = ToggleSearch;
 ToggleSearch.propTypes = {
-  kind: _propTypes2.default.string.isRequired,
-  toggle: _propTypes2.default.func.isRequired
+  kind: _react.PropTypes.string.isRequired,
+  toggle: _react.PropTypes.func.isRequired
 };
 
 /***/ }),
 /* 285 */,
 /* 286 */,
 /* 287 */,
 /* 288 */,
 /* 289 */,
@@ -19175,17 +19079,88 @@ module.exports = hasPath;
 
 /***/ }),
 /* 298 */,
 /* 299 */,
 /* 300 */,
 /* 301 */,
 /* 302 */,
 /* 303 */,
-/* 304 */,
+/* 304 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(84),
+    isSymbol = __webpack_require__(72);
+
+/** Used as references for various `Number` constants. */
+var NAN = 0 / 0;
+
+/** Used to match leading and trailing whitespace. */
+var reTrim = /^\s+|\s+$/g;
+
+/** Used to detect bad signed hexadecimal string values. */
+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+/** Used to detect binary string values. */
+var reIsBinary = /^0b[01]+$/i;
+
+/** Used to detect octal string values. */
+var reIsOctal = /^0o[0-7]+$/i;
+
+/** Built-in method references without a dependency on `root`. */
+var freeParseInt = parseInt;
+
+/**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+function toNumber(value) {
+  if (typeof value == 'number') {
+    return value;
+  }
+  if (isSymbol(value)) {
+    return NAN;
+  }
+  if (isObject(value)) {
+    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+    value = isObject(other) ? (other + '') : other;
+  }
+  if (typeof value != 'string') {
+    return value === 0 ? value : +value;
+  }
+  value = value.replace(reTrim, '');
+  var isBinary = reIsBinary.test(value);
+  return (isBinary || reIsOctal.test(value))
+    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+    : (reIsBadHex.test(value) ? NAN : +value);
+}
+
+module.exports = toNumber;
+
+
+/***/ }),
 /* 305 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -19427,21 +19402,16 @@ Object.defineProperty(exports, "__esModu
 
 var _getScopeBindings = (() => {
   var _ref = _asyncToGenerator(function* (_ref2, generatedLocation, scopes) {
     var dispatch = _ref2.dispatch,
         getState = _ref2.getState,
         sourceMaps = _ref2.sourceMaps;
     var sourceId = generatedLocation.sourceId;
 
-    var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
-    if (sourceRecord.get("isWasm")) {
-      return scopes;
-    }
-
     yield dispatch((0, _sources.ensureParserHasSourceText)(sourceId));
 
     return yield (0, _pause.updateScopeBindings)(scopes, generatedLocation, sourceMaps);
   });
 
   return function _getScopeBindings(_x, _x2, _x3) {
     return _ref.apply(this, arguments);
   };
@@ -19483,17 +19453,17 @@ var _selectors = __webpack_require__(242
 var _pause = __webpack_require__(255);
 
 var _expressions = __webpack_require__(252);
 
 var _breakpoints = __webpack_require__(245);
 
 var _breakpoints2 = __webpack_require__(236);
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
 
 var parser = _interopRequireWildcard(_parser);
 
 var _prefs = __webpack_require__(226);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 function _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; } }
@@ -19505,24 +19475,22 @@ function resumed() {
     var dispatch = _ref3.dispatch,
         client = _ref3.client,
         getState = _ref3.getState;
 
     if (!(0, _selectors.isPaused)(getState())) {
       return;
     }
 
-    var wasPausedInEval = (0, _selectors.pausedInEval)(getState());
-
     dispatch({
       type: "RESUME",
       value: undefined
     });
 
-    if (!(0, _selectors.isStepping)(getState()) && !wasPausedInEval) {
+    if (!(0, _selectors.isStepping)(getState())) {
       dispatch((0, _expressions.evaluateExpressions)());
     }
   };
 }
 
 function continueToHere(line) {
   return (() => {
     var _ref4 = _asyncToGenerator(function* (_ref5) {
@@ -19581,21 +19549,17 @@ function paused(pauseInfo) {
         selectedFrameId: frame.id,
         loadedObjects: loadedObjects || []
       });
 
       var hiddenBreakpointLocation = (0, _breakpoints2.getHiddenBreakpointLocation)(getState());
       if (hiddenBreakpointLocation) {
         dispatch((0, _breakpoints.removeBreakpoint)(hiddenBreakpointLocation));
       }
-
-      if (!(0, _selectors.isEvaluatingExpression)(getState())) {
-        dispatch((0, _expressions.evaluateExpressions)());
-      }
-
+      dispatch((0, _expressions.evaluateExpressions)());
       dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
     });
 
     return function (_x5) {
       return _ref6.apply(this, arguments);
     };
   })();
 }
@@ -19849,17 +19813,17 @@ exports.navigated = navigated;
 var _editor = __webpack_require__(257);
 
 var _sources = __webpack_require__(232);
 
 var _utils = __webpack_require__(234);
 
 var _sources2 = __webpack_require__(254);
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
 
 var _wasm = __webpack_require__(23);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /**
  * Redux actions for the navigation state
  * @module actions/navigation
@@ -20144,43 +20108,42 @@ function recordCoverage() {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.Modal = undefined;
 exports.default = Slide;
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Transition = __webpack_require__(333);
 
 var _Transition2 = _interopRequireDefault(_Transition);
 
-__webpack_require__(1226);
+__webpack_require__(952);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Modal extends _react.Component {
-  constructor() {
-    var _temp;
-
-    return _temp = super(...arguments), this.onClick = e => {
-      e.stopPropagation();
-    }, _temp;
+
+  constructor(props) {
+    super(props);
+    var self = this;
+    self.onClick = this.onClick.bind(this);
+  }
+
+  onClick(e) {
+    e.stopPropagation();
   }
 
   render() {
     var status = this.props.status;
 
 
     return _react2.default.createElement(
       "div",
@@ -20194,17 +20157,17 @@ class Modal extends _react.Component {
         this.props.children
       )
     );
   }
 }
 
 exports.Modal = Modal;
 Modal.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 function Slide(_ref) {
   var inProp = _ref.in,
       children = _ref.children,
       additionalClass = _ref.additionalClass,
       handleClose = _ref.handleClose;
 
@@ -21625,17 +21588,17 @@ var _react2 = _interopRequireDefault(_re
 var _fuzzaldrinPlus = __webpack_require__(161);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _resultList = __webpack_require__(343);
 
-__webpack_require__(1240);
+__webpack_require__(867);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
@@ -21857,17 +21820,17 @@ exports.handleKeyDown = handleKeyDown;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _Svg = __webpack_require__(345);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(1234);
+__webpack_require__(862);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * This file maps the SVG React Components in the assets/images directory.
  */
 
 exports.default = _Svg2.default;
@@ -21906,17 +21869,16 @@ var svg = {
   ember: __webpack_require__(1119),
   vuejs: __webpack_require__(1174),
   "magnifying-glass": __webpack_require__(357),
   "arrow-up": __webpack_require__(919),
   "arrow-down": __webpack_require__(920),
   pause: __webpack_require__(358),
   "pause-exceptions": __webpack_require__(359),
   plus: __webpack_require__(360),
-  preact: __webpack_require__(1233),
   prettyPrint: __webpack_require__(361),
   react: __webpack_require__(1000),
   "regex-match": __webpack_require__(362),
   redux: __webpack_require__(256),
   immutable: __webpack_require__(258),
   resume: __webpack_require__(363),
   settings: __webpack_require__(364),
   stepIn: __webpack_require__(365),
@@ -22321,17 +22283,17 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(1237);
+__webpack_require__(865);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var arrowBtn = (onClick, type, className, tooltip) => {
   var props = {
     onClick,
     type,
     className,
@@ -22465,17 +22427,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(1236);
+__webpack_require__(864);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function CloseButton(_ref) {
   var handleClick = _ref.handleClick,
       buttonClass = _ref.buttonClass,
       tooltip = _ref.tooltip;
 
@@ -22509,17 +22471,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(1241);
+__webpack_require__(868);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ResultList extends _react.Component {
 
   constructor(props) {
     super(props);
     this.renderListItem = this.renderListItem.bind(this);
@@ -22666,60 +22628,37 @@ Object.defineProperty(exports, "__esModu
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(1235);
+__webpack_require__(863);
 
 var _devtoolsComponents = __webpack_require__(1007);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var Tree = (0, _react.createFactory)(_devtoolsComponents.Tree);
 
 class ManagedTree extends _react.Component {
 
   constructor(props) {
     super();
 
-    this.setExpanded = (item, isExpanded) => {
-      var expanded = this.state.expanded;
-      var itemPath = this.props.getPath(item);
-      if (isExpanded) {
-        expanded.add(itemPath);
-      } else {
-        expanded.delete(itemPath);
-      }
-      this.setState({ expanded });
-
-      if (isExpanded && this.props.onExpand) {
-        this.props.onExpand(item, expanded);
-      } else if (!isExpanded && this.props.onCollapse) {
-        this.props.onCollapse(item, expanded);
-      }
-    };
-
-    this.focusItem = item => {
-      if (!this.props.disabledFocus && this.state.focusedItem !== item) {
-        this.setState({ focusedItem: item });
-
-        if (this.props.onFocus) {
-          this.props.onFocus(item);
-        }
-      }
-    };
-
     this.state = {
       expanded: props.expanded || new Set(),
       focusedItem: null
     };
+
+    var self = this;
+    self.setExpanded = this.setExpanded.bind(this);
+    self.focusItem = this.focusItem.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     var listItems = nextProps.listItems;
     if (listItems && listItems != this.props.listItems && listItems.length) {
       this.expandListItems(listItems);
     }
 
@@ -22728,16 +22667,33 @@ class ManagedTree extends _react.Compone
       this.highlightItem(highlightItems);
     }
 
     if (nextProps.focused && nextProps.focused !== this.props.focused) {
       this.focusItem(nextProps.focused);
     }
   }
 
+  setExpanded(item, isExpanded) {
+    var expanded = this.state.expanded;
+    var itemPath = this.props.getPath(item);
+    if (isExpanded) {
+      expanded.add(itemPath);
+    } else {
+      expanded.delete(itemPath);
+    }
+    this.setState({ expanded });
+
+    if (isExpanded && this.props.onExpand) {
+      this.props.onExpand(item, expanded);
+    } else if (!isExpanded && this.props.onCollapse) {
+      this.props.onCollapse(item, expanded);
+    }
+  }
+
   expandListItems(listItems) {
     var expanded = this.state.expanded;
     listItems.forEach(item => expanded.add(this.props.getPath(item)));
     this.focusItem(listItems[0]);
     this.setState({ expanded });
   }
 
   highlightItem(highlightItems) {
@@ -22749,16 +22705,26 @@ class ManagedTree extends _react.Compone
     } else {
       // Look at folders starting from the top-level until finds a
       // closed folder and highlights this folder
       var index = highlightItems.reverse().findIndex(item => !expanded.has(this.props.getPath(item)));
       this.focusItem(highlightItems[index]);
     }
   }
 
+  focusItem(item) {
+    if (!this.props.disabledFocus && this.state.focusedItem !== item) {
+      this.setState({ focusedItem: item });
+
+      if (this.props.onFocus) {
+        this.props.onFocus(item);
+      }
+    }
+  }
+
   render() {
     var _this = this;
 
     var _state = this.state,
         expanded = _state.expanded,
         focusedItem = _state.focusedItem;
 
 
@@ -22786,16 +22752,18 @@ class ManagedTree extends _react.Compone
     return _react2.default.createElement(
       "div",
       { className: "managed-tree" },
       _react2.default.createElement(Tree, props)
     );
   }
 }
 
+ManagedTree.propTypes = Object.assign({}, Tree.propTypes);
+
 exports.default = ManagedTree;
 
 /***/ }),
 /* 420 */,
 /* 421 */,
 /* 422 */,
 /* 423 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -22831,20 +22799,16 @@ exports.copyToTheClipboard = copyToTheCl
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
@@ -22919,201 +22883,52 @@ var _DebugLine = __webpack_require__(313
 var _DebugLine2 = _interopRequireDefault(_DebugLine);
 
 var _EmptyLines = __webpack_require__(1146);
 
 var _EmptyLines2 = _interopRequireDefault(_EmptyLines);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(1257);
-
-__webpack_require__(1258);
+__webpack_require__(905);
+
+__webpack_require__(906);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
   footerHeight: "var(--editor-footer-height)"
 };
 
-
 class Editor extends _react.PureComponent {
 
   constructor() {
     super();
 
-    this.onToggleBreakpoint = (key, e) => {
-      e.preventDefault();
-      var codeMirror = this.state.editor.codeMirror;
-      var selectedSource = this.props.selectedSource;
-
-      var line = (0, _editor.getCursorLine)(codeMirror);
-
-      if (!selectedSource) {
-        return;
-      }
-
-      var sourceLine = (0, _editor.toSourceLine)(selectedSource.get("id"), line);
-
-      if (e.shiftKey) {
-        this.toggleConditionalPanel(sourceLine);
-      } else {
-        this.props.toggleBreakpoint(sourceLine);
-      }
-    };
-
-    this.onEscape = (key, e) => {
-      if (!this.state.editor) {
-        return;
-      }
-
-      var codeMirror = this.state.editor.codeMirror;
-
-      if (codeMirror.listSelections().length > 1) {
-        codeMirror.execCommand("singleSelection");
-        e.preventDefault();
-      }
-    };
-
-    this.onSearchAgain = (_, e) => {
-      var _props = this.props,
-          query = _props.query,
-          searchModifiers = _props.searchModifiers;
-      var codeMirror = this.state.editor.editor.codeMirror;
-
-      var ctx = { ed: this.state.editor, cm: codeMirror };
-
-      var direction = e.shiftKey ? "prev" : "next";
-      (0, _editor.traverseResults)(e, ctx, query, direction, searchModifiers.toJS());
-    };
-
-    this.onGutterClick = (cm, line, gutter, ev) => {
-      var _props2 = this.props,
-          selectedSource = _props2.selectedSource,
-          toggleBreakpoint = _props2.toggleBreakpoint,
-          addOrToggleDisabledBreakpoint = _props2.addOrToggleDisabledBreakpoint,
-          isEmptyLine = _props2.isEmptyLine,
-          continueToHere = _props2.continueToHere;
-
-      // ignore right clicks in the gutter
-
-      if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed")) {
-        return;
-      }
-
-      if (isEmptyLine(line)) {
-        return;
-      }
-
-      if (this.isCbPanelOpen()) {
-        return this.closeConditionalPanel();
-      }
-
-      if (!selectedSource) {
-        return;
-      }
-
-      if (gutter !== "CodeMirror-foldgutter") {
-        if (ev.altKey) {
-          continueToHere((0, _editor.toSourceLine)(selectedSource.get("id"), line));
-        } else if (ev.shiftKey) {
-          addOrToggleDisabledBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
-        } else {
-          toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
-        }
-      }
-    };
-
-    this.onGutterContextMenu = event => {
-      var _props3 = this.props,
-          selectedSource = _props3.selectedSource,
-          breakpoints = _props3.breakpoints,
-          toggleBreakpoint = _props3.toggleBreakpoint,
-          toggleDisabledBreakpoint = _props3.toggleDisabledBreakpoint,
-          isEmptyLine = _props3.isEmptyLine,
-          pauseData = _props3.pauseData,
-          continueToHere = _props3.continueToHere;
-
-
-      if (selectedSource && selectedSource.get("isBlackBoxed")) {
-        event.preventDefault();
-        return;
-      }
-
-      var sourceId = selectedSource ? selectedSource.get("id") : "";
-      var line = (0, _editor.lineAtHeight)(this.state.editor, sourceId, event);
-      var breakpoint = breakpoints.find(bp => bp.location.line === line);
-
-      if (isEmptyLine(line - 1)) {
-        return;
-      }
-
-      (0, _GutterMenu2.default)({
-        event,
-        line,
-        breakpoint,
-        toggleBreakpoint,
-        toggleDisabledBreakpoint,
-        pauseData,
-        continueToHere,
-
-        showConditionalPanel: this.toggleConditionalPanel,
-        isCbPanelOpen: this.isCbPanelOpen(),
-        closeConditionalPanel: this.closeConditionalPanel
-      });
-    };
-
-    this.toggleConditionalPanel = line => {
-      if (this.isCbPanelOpen()) {
-        return this.closeConditionalPanel();
-      }
-
-      var _props4 = this.props,
-          selectedLocation = _props4.selectedLocation,
-          setBreakpointCondition = _props4.setBreakpointCondition,
-          breakpoints = _props4.breakpoints;
-
-      var sourceId = selectedLocation ? selectedLocation.sourceId : "";
-
-      var breakpoint = breakpoints.find(bp => bp.location.line === line);
-      var location = { sourceId, line };
-      var condition = breakpoint ? breakpoint.condition : "";
-
-      var panel = (0, _ConditionalPanel.renderConditionalPanel)({
-        condition,
-        setBreakpoint: value => setBreakpointCondition(location, { condition: value }),
-        closePanel: this.closeConditionalPanel
-      });
-
-      var editorLine = (0, _editor.toEditorLine)(sourceId, line);
-      this.cbPanel = this.state.editor.codeMirror.addLineWidget(editorLine, panel, {
-        coverGutter: true,
-        noHScroll: false
-      });
-      this.cbPanel.node.querySelector("input").focus();
-    };
-
-    this.closeConditionalPanel = () => {
-      this.props.toggleConditionalBreakpointPanel(null);
-      this.cbPanel.clear();
-      this.cbPanel = null;
-    };
-
     this.cbPanel = null;
     this.pendingJumpLocation = null;
     this.lastJumpLine = null;
 
     this.state = {
       highlightedLineRange: null,
       editor: null
     };
+
+    var self = this;
+    self.closeConditionalPanel = this.closeConditionalPanel.bind(this);
+    self.onEscape = this.onEscape.bind(this);
+    self.onGutterClick = this.onGutterClick.bind(this);
+    self.onGutterContextMenu = this.onGutterContextMenu.bind(this);
+    self.onSearchAgain = this.onSearchAgain.bind(this);
+    self.onToggleBreakpoint = this.onToggleBreakpoint.bind(this);
+    self.toggleConditionalPanel = this.toggleConditionalPanel.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
     this.setSize(nextProps);
@@ -23170,19 +22985,19 @@ class Editor extends _react.PureComponen
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
     this.cbPanel = null;
     var editor = this.setupEditor();
 
-    var _props5 = this.props,
-        selectedSource = _props5.selectedSource,
-        selectedLocation = _props5.selectedLocation;
+    var _props = this.props,
+        selectedSource = _props.selectedSource,
+        selectedLocation = _props.selectedLocation;
     var shortcuts = this.context.shortcuts;
 
 
     var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
     var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
 
     shortcuts.on(L10N.getStr("toggleBreakpoint.key"), this.onToggleBreakpoint);
     shortcuts.on(L10N.getStr("toggleCondPanel.key"), this.onToggleBreakpoint);
@@ -23210,19 +23025,19 @@ class Editor extends _react.PureComponen
     shortcuts.off(searchAgainPrevKey);
     shortcuts.off(searchAgainKey);
   }
 
   componentDidUpdate(prevProps) {
     // This is in `componentDidUpdate` so helper functions can expect
     // `this.props` to be the current props. This lifecycle method is
     // responsible for updating the editor annotations.
-    var _props6 = this.props,
-        selectedLocation = _props6.selectedLocation,
-        selectedSource = _props6.selectedSource;
+    var _props2 = this.props,
+        selectedLocation = _props2.selectedLocation,
+        selectedSource = _props2.selectedSource;
 
     // If the location is different and a new line is requested,
     // update the pending jump line. Note that if jumping to a line in
     // a source where the text hasn't been loaded yet, we will set the
     // line here but not jump until rendering the actual source.
 
     if (prevProps.selectedLocation !== selectedLocation) {
       if (selectedLocation && selectedLocation.line != undefined) {
@@ -23239,16 +23054,36 @@ class Editor extends _react.PureComponen
       this.highlightLine();
     }
 
     if (this.props.conditionalBreakpointPanel !== null && this.cbPanel == null) {
       this.toggleConditionalPanel(this.props.conditionalBreakpointPanel);
     }
   }
 
+  onToggleBreakpoint(key, e) {
+    e.preventDefault();
+    var codeMirror = this.state.editor.codeMirror;
+    var selectedSource = this.props.selectedSource;
+
+    var line = (0, _editor.getCursorLine)(codeMirror);
+
+    if (!selectedSource) {
+      return;
+    }
+
+    var sourceLine = (0, _editor.toSourceLine)(selectedSource.get("id"), line);
+
+    if (e.shiftKey) {
+      this.toggleConditionalPanel(sourceLine);
+    } else {
+      this.props.toggleBreakpoint(sourceLine);
+    }
+  }
+
   onKeyDown(e) {
     var codeMirror = this.state.editor.codeMirror;
     var key = e.key,
         target = e.target;
 
     var codeWrapper = codeMirror.getWrapperElement();
     var textArea = codeWrapper.querySelector("textArea");
 
@@ -23264,63 +23099,198 @@ class Editor extends _react.PureComponen
   }
 
   /*
    * The default Esc command is overridden in the CodeMirror keymap to allow
    * the Esc keypress event to be catched by the toolbox and trigger the
    * split console. Restore it here, but preventDefault if and only if there
    * is a multiselection.
    */
-
+  onEscape(key, e) {
+    if (!this.state.editor) {
+      return;
+    }
+
+    var codeMirror = this.state.editor.codeMirror;
+
+    if (codeMirror.listSelections().length > 1) {
+      codeMirror.execCommand("singleSelection");
+      e.preventDefault();
+    }
+  }
+
+  onSearchAgain(_, e) {
+    var _props3 = this.props,
+        query = _props3.query,
+        searchModifiers = _props3.searchModifiers;
+    var codeMirror = this.state.editor.editor.codeMirror;
+
+    var ctx = { ed: this.state.editor, cm: codeMirror };
+
+    var direction = e.shiftKey ? "prev" : "next";
+    (0, _editor.traverseResults)(e, ctx, query, direction, searchModifiers.toJS());
+  }
 
   inSelectedFrameSource() {
-    var _props7 = this.props,
-        selectedLocation = _props7.selectedLocation,
-        selectedFrame = _props7.selectedFrame;
+    var _props4 = this.props,
+        selectedLocation = _props4.selectedLocation,
+        selectedFrame = _props4.selectedFrame;
 
     return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
   }
 
   openMenu(event, editor) {
-    var _props8 = this.props,
-        selectedSource = _props8.selectedSource,
-        selectedLocation = _props8.selectedLocation,
-        showSource = _props8.showSource,
-        jumpToMappedLocation = _props8.jumpToMappedLocation,
-        addExpression = _props8.addExpression,
-        toggleBlackBox = _props8.toggleBlackBox,
-        getFunctionText = _props8.getFunctionText;
+    var _props5 = this.props,
+        selectedSource = _props5.selectedSource,
+        selectedLocation = _props5.selectedLocation,
+        showSource = _props5.showSource,
+        jumpToMappedLocation = _props5.jumpToMappedLocation,
+        addExpression = _props5.addExpression,
+        toggleBlackBox = _props5.toggleBlackBox,
+        getFunctionText = _props5.getFunctionText;
 
 
     return (0, _EditorMenu2.default)({
       editor,
       event,
       selectedLocation,
       selectedSource,
       showSource,
       jumpToMappedLocation,
       addExpression,
       toggleBlackBox,
       getFunctionText,
       onGutterContextMenu: this.onGutterContextMenu
     });
   }
 
+  onGutterClick(cm, line, gutter, ev) {
+    var _props6 = this.props,
+        selectedSource = _props6.selectedSource,
+        toggleBreakpoint = _props6.toggleBreakpoint,
+        addOrToggleDisabledBreakpoint = _props6.addOrToggleDisabledBreakpoint,
+        isEmptyLine = _props6.isEmptyLine,
+        continueToHere = _props6.continueToHere;
+
+    // ignore right clicks in the gutter
+
+    if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed")) {
+      return;
+    }
+
+    if (isEmptyLine(line)) {
+      return;
+    }
+
+    if (this.isCbPanelOpen()) {
+      return this.closeConditionalPanel();
+    }
+
+    if (!selectedSource) {
+      return;
+    }
+
+    if (gutter !== "CodeMirror-foldgutter") {
+      if (ev.altKey) {
+        continueToHere((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      } else if (ev.shiftKey) {
+        addOrToggleDisabledBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      } else {
+        toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      }
+    }
+  }
+
+  onGutterContextMenu(event) {
+    var _props7 = this.props,
+        selectedSource = _props7.selectedSource,
+        breakpoints = _props7.breakpoints,
+        toggleBreakpoint = _props7.toggleBreakpoint,
+        toggleDisabledBreakpoint = _props7.toggleDisabledBreakpoint,
+        isEmptyLine = _props7.isEmptyLine,
+        pauseData = _props7.pauseData,
+        continueToHere = _props7.continueToHere;
+
+
+    if (selectedSource && selectedSource.get("isBlackBoxed")) {
+      event.preventDefault();
+      return;
+    }
+
+    var sourceId = selectedSource ? selectedSource.get("id") : "";
+    var line = (0, _editor.lineAtHeight)(this.state.editor, sourceId, event);
+    var breakpoint = breakpoints.find(bp => bp.location.line === line);
+
+    if (isEmptyLine(line - 1)) {
+      return;
+    }
+
+    (0, _GutterMenu2.default)({
+      event,
+      line,
+      breakpoint,
+      toggleBreakpoint,
+      toggleDisabledBreakpoint,
+      pauseData,
+      continueToHere,
+
+      showConditionalPanel: this.toggleConditionalPanel,
+      isCbPanelOpen: this.isCbPanelOpen(),
+      closeConditionalPanel: this.closeConditionalPanel
+    });
+  }
+
   onClick(e) {
-    var _props9 = this.props,
-        selectedLocation = _props9.selectedLocation,
-        jumpToMappedLocation = _props9.jumpToMappedLocation;
+    var _props8 = this.props,
+        selectedLocation = _props8.selectedLocation,
+        jumpToMappedLocation = _props8.jumpToMappedLocation;
 
 
     if (e.metaKey && e.altKey) {
       var sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(this.state.editor, selectedLocation, e);
       jumpToMappedLocation(sourceLocation);
     }
   }
 
+  toggleConditionalPanel(line) {
+    if (this.isCbPanelOpen()) {
+      return this.closeConditionalPanel();
+    }
+
+    var _props9 = this.props,
+        selectedLocation = _props9.selectedLocation,
+        setBreakpointCondition = _props9.setBreakpointCondition,
+        breakpoints = _props9.breakpoints;
+
+    var sourceId = selectedLocation ? selectedLocation.sourceId : "";
+
+    var breakpoint = breakpoints.find(bp => bp.location.line === line);
+    var location = { sourceId, line };
+    var condition = breakpoint ? breakpoint.condition : "";
+
+    var panel = (0, _ConditionalPanel.renderConditionalPanel)({
+      condition,
+      setBreakpoint: value => setBreakpointCondition(location, { condition: value }),
+      closePanel: this.closeConditionalPanel
+    });
+
+    var editorLine = (0, _editor.toEditorLine)(sourceId, line);
+    this.cbPanel = this.state.editor.codeMirror.addLineWidget(editorLine, panel, {
+      coverGutter: true,
+      noHScroll: false
+    });
+    this.cbPanel.node.querySelector("input").focus();
+  }
+
+  closeConditionalPanel() {
+    this.props.toggleConditionalBreakpointPanel(null);
+    this.cbPanel.clear();
+    this.cbPanel = null;
+  }
+
   isCbPanelOpen() {
     return !!this.cbPanel;
   }
 
   // If the location has changed and a specific line is requested,
   // move to that line and flash it.
   highlightLine() {
     if (!this.pendingJumpLocation) {
@@ -23373,33 +23343,36 @@ class Editor extends _react.PureComponen
       if (this.props.selectedSource) {
         return this.showMessage("");
       }
 
       return;
     }
 
     if (!(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
-      return (0, _editor.showLoading)(this.state.editor);
+      return this.showMessage(L10N.getStr("loadingText"));
     }
 
     if (nextProps.selectedSource.get("error")) {
       return this.showMessage(nextProps.selectedSource.get("error"));
     }
 
     if (nextProps.selectedSource !== this.props.selectedSource) {
       return (0, _editor.showSourceText)(this.state.editor, nextProps.selectedSource.toJS());
     }
   }
 
   showMessage(msg) {
     if (!this.state.editor) {
       return;
     }
 
+    this.state.editor.replaceDocument(this.state.editor.createDocument());
+    this.state.editor.setText(msg);
+    this.state.editor.setMode({ name: "text" });
     (0, _editor.resetLineNumberFormat)(this.state.editor);
   }
 
   getInlineEditorStyles() {
     var _props10 = this.props,
         selectedSource = _props10.selectedSource,
         horizontal = _props10.horizontal,
         searchOn = _props10.searchOn;
@@ -23531,24 +23504,27 @@ class Editor extends _react.PureComponen
     return _react2.default.createElement(_DebugLine2.default, {
       editor: editor,
       selectedFrame: selectedFrame,
       selectedLocation: selectedLocation
     });
   }
 
   render() {
-    var coverageOn = this.props.coverageOn;
+    var _props14 = this.props,
+        coverageOn = _props14.coverageOn,
+        pauseData = _props14.pauseData;
 
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("editor-wrapper", {
-          "coverage-on": coverageOn
+          "coverage-on": coverageOn,
+          paused: !!pauseData && (0, _devtoolsConfig.isEnabled)("highlightScopeLines")
         })
       },
       this.renderSearchBar(),
       _react2.default.createElement("div", {
         className: "editor-mount devtools-monospace",
         style: this.getInlineEditorStyles()
       }),
       this.renderHighlightLines(),
@@ -23560,58 +23536,58 @@ class Editor extends _react.PureComponen
       this.renderBreakpoints(),
       this.renderEmptyLines()
     );
   }
 }
 
 Editor.propTypes = {
   breakpoints: _reactImmutableProptypes2.default.map,
-  hitCount: _propTypes2.default.object,
-  selectedLocation: _propTypes2.default.object,
+  hitCount: _react.PropTypes.object,
+  selectedLocation: _react.PropTypes.object,
   selectedSource: _reactImmutableProptypes2.default.map,
-  highlightLineRange: _propTypes2.default.func,
-  clearHighlightLineRange: _propTypes2.default.func,
-  highlightedLineRange: _propTypes2.default.object,
-  searchOn: _propTypes2.default.bool,
-  addBreakpoint: _propTypes2.default.func.isRequired,
-  disableBreakpoint: _propTypes2.default.func.isRequired,
-  enableBreakpoint: _propTypes2.default.func.isRequired,
-  removeBreakpoint: _propTypes2.default.func.isRequired,
-  setBreakpointCondition: _propTypes2.default.func.isRequired,
-  selectSource: _propTypes2.default.func,
-  jumpToMappedLocation: _propTypes2.default.func,
-  toggleBlackBox: _propTypes2.default.func,
-  showSource: _propTypes2.default.func,
-  coverageOn: _propTypes2.default.bool,
-  pauseData: _propTypes2.default.object,
-  selectedFrame: _propTypes2.default.object,
-  addExpression: _propTypes2.default.func.isRequired,
-  horizontal: _propTypes2.default.bool,
-  query: _propTypes2.default.string.isRequired,
+  highlightLineRange: _react.PropTypes.func,
+  clearHighlightLineRange: _react.PropTypes.func,
+  highlightedLineRange: _react.PropTypes.object,
+  searchOn: _react.PropTypes.bool,
+  addBreakpoint: _react.PropTypes.func.isRequired,
+  disableBreakpoint: _react.PropTypes.func.isRequired,
+  enableBreakpoint: _react.PropTypes.func.isRequired,
+  removeBreakpoint: _react.PropTypes.func.isRequired,
+  setBreakpointCondition: _react.PropTypes.func.isRequired,
+  selectSource: _react.PropTypes.func,
+  jumpToMappedLocation: _react.PropTypes.func,
+  toggleBlackBox: _react.PropTypes.func,
+  showSource: _react.PropTypes.func,
+  coverageOn: _react.PropTypes.bool,
+  pauseData: _react.PropTypes.object,
+  selectedFrame: _react.PropTypes.object,
+  addExpression: _react.PropTypes.func.isRequired,
+  horizontal: _react.PropTypes.bool,
+  query: _react.PropTypes.string.isRequired,
   searchModifiers: _reactImmutableProptypes2.default.recordOf({
-    caseSensitive: _propTypes2.default.bool.isRequired,
-    regexMatch: _propTypes2.default.bool.isRequired,
-    wholeWord: _propTypes2.default.bool.isRequired
+    caseSensitive: _react.PropTypes.bool.isRequired,
+    regexMatch: _react.PropTypes.bool.isRequired,
+    wholeWord: _react.PropTypes.bool.isRequired
   }).isRequired,
-  startPanelSize: _propTypes2.default.number,
-  endPanelSize: _propTypes2.default.number,
-  linesInScope: _propTypes2.default.array,
-  toggleBreakpoint: _propTypes2.default.func.isRequired,
-  addOrToggleDisabledBreakpoint: _propTypes2.default.func.isRequired,
-  toggleDisabledBreakpoint: _propTypes2.default.func.isRequired,
-  conditionalBreakpointPanel: _propTypes2.default.number,
-  toggleConditionalBreakpointPanel: _propTypes2.default.func.isRequired,
-  isEmptyLine: _propTypes2.default.func,
-  continueToHere: _propTypes2.default.func,
-  getFunctionText: _propTypes2.default.func
+  startPanelSize: _react.PropTypes.number,
+  endPanelSize: _react.PropTypes.number,
+  linesInScope: _react.PropTypes.array,
+  toggleBreakpoint: _react.PropTypes.func.isRequired,
+  addOrToggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
+  toggleDisabledBreakpoint: _react.PropTypes.func.isRequired,
+  conditionalBreakpointPanel: _react.PropTypes.number,
+  toggleConditionalBreakpointPanel: _react.PropTypes.func.isRequired,
+  isEmptyLine: _react.PropTypes.func,
+  continueToHere: _react.PropTypes.func,
+  getFunctionText: _react.PropTypes.func
 };
 
 Editor.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedLocation = (0, _selectors.getSelectedLocation)(state);
   var sourceId = selectedLocation && selectedLocation.sourceId;
   var selectedSource = (0, _selectors.getSelectedSource)(state);
 
   return {
@@ -23672,17 +23648,17 @@ var _devtoolsConfig = __webpack_require_
 var _source = __webpack_require__(233);
 
 var _editor = __webpack_require__(257);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(1248);
+__webpack_require__(875);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourceFooter extends _react.PureComponent {
 
   prettyPrintButton() {
     var _props = this.props,
         selectedSource = _props.selectedSource,
@@ -23851,17 +23827,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(1247);
+__webpack_require__(874);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PaneToggleButton extends _react.Component {
 
   shouldComponentUpdate(nextProps) {
     var _props = this.props,
         collapsed = _props.collapsed,
@@ -23907,20 +23883,16 @@ exports.default = PaneToggleButton;
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactRedux = __webpack_require__(1189);
 
@@ -23933,33 +23905,33 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _editor = __webpack_require__(257);
 
-var _search = __webpack_require__(1210);
+var _search = __webpack_require__(1115);
 
 var _resultList = __webpack_require__(343);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _lodash = __webpack_require__(2);
 
 var _devtoolsSourceEditor = __webpack_require__(994);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
-__webpack_require__(1249);
+__webpack_require__(876);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function getShortcuts() {
   var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
   var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
@@ -23970,259 +23942,38 @@ function getShortcuts() {
     searchAgainShortcut: searchAgainKey,
     searchShortcut: searchKey
   };
 }
 
 class SearchBar extends _react.Component {
 
   constructor(props) {
-    var _this;
-
-    _this = super(props);
-
-    this.onEscape = e => {
-      this.closeSearch(e);
-    };
-
-    this.clearSearch = () => {
-      var _props = this.props,
-          ed = _props.editor,
-          query = _props.query,
-          modifiers = _props.modifiers;
-
-      if (ed && modifiers) {
-        var ctx = { ed, cm: ed.codeMirror };
-        (0, _editor.removeOverlay)(ctx, query, modifiers.toJS());
-      }
-    };
-
-    this.closeSearch = e => {
-      var _props2 = this.props,
-          editor = _props2.editor,
-          setFileSearchQuery = _props2.setFileSearchQuery,
-          searchOn = _props2.searchOn;
-
-
-      if (editor && searchOn) {
-        setFileSearchQuery("");
-        this.clearSearch();
-        this.props.setActiveSearch();
-        this.props.clearHighlightLineRange();
-        e.stopPropagation();
-        e.preventDefault();
-      }
-    };
-
-    this.toggleSearch = e => {
-      e.stopPropagation();
-      e.preventDefault();
-      var editor = this.props.editor;
-
-
-      if (!this.props.searchOn) {
-        this.props.setActiveSearch("file");
-      }
-
-      if (this.props.searchOn && editor) {
-        var selection = editor.codeMirror.getSelection();
-        this.setSearchValue(selection);
-        if (selection !== "") {
-          this.doSearch(selection);
-        }
-        this.selectSearchInput();
-      }
-    };
-
-    this.setSearchValue = value => {
-      var searchInput = this.searchInput();
-      if (value == "" || !searchInput) {
-        return;
-      }
-
-      searchInput.value = value;
-    };
-
-    this.selectSearchInput = () => {
-      var searchInput = this.searchInput();
-      if (searchInput) {
-        searchInput.setSelectionRange(0, searchInput.value.length);
-        searchInput.focus();
-      }
-    };
-
-    this.searchInput = () => {
-      var node = (0, _reactDom.findDOMNode)(this);
-      if (node instanceof HTMLElement) {
-        var input = node.querySelector("input");
-        if (input instanceof HTMLInputElement) {
-          return input;
-        }
-      }
-      return null;
-    };
-
-    this.doSearch = query => {
-      var _props3 = this.props,
-          selectedSource = _props3.selectedSource,
-          setFileSearchQuery = _props3.setFileSearchQuery;
-
-      if (!selectedSource || !selectedSource.get("text")) {
-        return;
-      }
-
-      setFileSearchQuery(query);
-
-      this.searchContents(query);
-    };
-
-    this.updateSearchResults = (characterIndex, line, matches) => {
-      var matchIndex = matches.findIndex(elm => elm.line === line && elm.ch === characterIndex);
-      this.props.updateSearchResults({
-        matches,
-        matchIndex,
-        count: matches.length,
-        index: characterIndex
-      });
-    };
-
-    this.searchContents = (() => {
-      var _ref = _asyncToGenerator(function* (query) {
-        var _props4 = _this.props,
-            selectedSource = _props4.selectedSource,
-            modifiers = _props4.modifiers,
-            ed = _props4.editor;
-
-
-        if (!query || !ed || !selectedSource || !selectedSource.get("text") || !modifiers) {
-          return;
-        }
-
-        var ctx = { ed, cm: ed.codeMirror };
-
-        var _modifiers = modifiers.toJS();
-        var matches = yield (0, _search.getMatches)(query, selectedSource.get("text"), _modifiers);
-
-        var _find = (0, _editor.find)(ctx, query, true, _modifiers),
-            ch = _find.ch,
-            line = _find.line;
-
-        _this.updateSearchResults(ch, line, matches);
-      });
-
-      return function (_x) {
-        return _ref.apply(this, arguments);
-      };
-    })();
-
-    this.traverseResults = (e, rev) => {
-      e.stopPropagation();
-      e.preventDefault();
-      var ed = this.props.editor;
-
-      if (!ed) {
-        return;
-      }
-
-      var ctx = { ed, cm: ed.codeMirror };
-
-      var _props5 = this.props,
-          query = _props5.query,
-          modifiers = _props5.modifiers,
-          matches = _props5.searchResults.matches;
-
-
-      if (query === "") {
-        this.props.setActiveSearch("file");
-      }
-
-      if (modifiers) {
-        var matchedLocations = matches || [];
-
-        var _ref2 = rev ? (0, _editor.findPrev)(ctx, query, true, modifiers.toJS()) : (0, _editor.findNext)(ctx, query, true, modifiers.toJS()),
-            ch = _ref2.ch,
-            line = _ref2.line;
-
-        this.updateSearchResults(ch, line, matchedLocations);
-      }
-    };
-
-    this.onChange = e => {
-      return this.doSearch(e.target.value);
-    };
-
-    this.onKeyUp = e => {
-      if (e.key !== "Enter" && e.key !== "F3") {
-        return;
-      }
-
-      this.traverseResults(e, e.shiftKey);
-      e.preventDefault();
-    };
-
-    this.renderSearchModifiers = () => {
-      var _props6 = this.props,
-          modifiers = _props6.modifiers,
-          toggleFileSearchModifier = _props6.toggleFileSearchModifier;
-
-
-      function SearchModBtn(_ref3) {
-        var modVal = _ref3.modVal,
-            className = _ref3.className,
-            svgName = _ref3.svgName,
-            tooltip = _ref3.tooltip;
-
-        var preppedClass = (0, _classnames2.default)(className, {
-          active: modifiers && modifiers.get(modVal)
-        });
-        return _react2.default.createElement(
-          "button",
-          {
-            className: preppedClass,
-            onClick: () => toggleFileSearchModifier(modVal),
-            title: tooltip
-          },
-          _react2.default.createElement(_Svg2.default, { name: svgName })
-        );
-      }
-
-      return _react2.default.createElement(
-        "div",
-        { className: "search-modifiers" },
-        _react2.default.createElement(
-          "span",
-          { className: "search-type-name" },
-          L10N.getStr("symbolSearch.searchModifier.modifiersLabel")
-        ),
-        _react2.default.createElement(SearchModBtn, {
-          modVal: "regexMatch",
-          className: "regex-match-btn",
-          svgName: "regex-match",
-          tooltip: L10N.getStr("symbolSearch.searchModifier.regex")
-        }),
-        _react2.default.createElement(SearchModBtn, {
-          modVal: "caseSensitive",
-          className: "case-sensitive-btn",
-          svgName: "case-match",
-          tooltip: L10N.getStr("symbolSearch.searchModifier.caseSensitive")
-        }),
-        _react2.default.createElement(SearchModBtn, {
-          modVal: "wholeWord",
-          className: "whole-word-btn",
-          svgName: "whole-word-match",
-          tooltip: L10N.getStr("symbolSearch.searchModifier.wholeWord")
-        })
-      );
-    };
-
+    super(props);
     this.state = {
       selectedResultIndex: 0,
       count: 0,
       index: -1
     };
+
+    var self = this;
+    self.onEscape = this.onEscape.bind(this);
+    self.clearSearch = this.clearSearch.bind(this);
+    self.closeSearch = this.closeSearch.bind(this);
+    self.toggleSearch = this.toggleSearch.bind(this);
+    self.setSearchValue = this.setSearchValue.bind(this);
+    self.selectSearchInput = this.selectSearchInput.bind(this);
+    self.searchInput = this.searchInput.bind(this);
+    self.doSearch = this.doSearch.bind(this);
+    self.searchContents = this.searchContents.bind(this);
+    self.traverseResults = this.traverseResults.bind(this);
+    self.onChange = this.onChange.bind(this);
+    self.onKeyUp = this.onKeyUp.bind(this);
+    self.buildSummaryMsg = this.buildSummaryMsg.bind(this);
+    self.renderSearchModifiers = this.renderSearchModifiers.bind(this);
   }
 
   componentWillUnmount() {
     var shortcuts = this.context.shortcuts;
 
     var _getShortcuts = getShortcuts(),
         searchShortcut = _getShortcuts.searchShortcut,
         searchAgainShortcut = _getShortcuts.searchAgainShortcut,
@@ -24232,16 +23983,17 @@ class SearchBar extends _react.Component
     shortcuts.off("Escape");
     shortcuts.off(searchAgainShortcut);
     shortcuts.off(shiftSearchAgainShortcut);
   }
 
   componentDidMount() {
     // overwrite searchContents with a debounced version to reduce the
     // frequency of queries which improves perf on large files
+    // $FlowIgnore
     this.searchContents = (0, _lodash.debounce)(this.searchContents, 100);
 
     var shortcuts = this.context.shortcuts;
 
     var _getShortcuts2 = getShortcuts(),
         searchShortcut = _getShortcuts2.searchShortcut,
         searchAgainShortcut = _getShortcuts2.searchAgainShortcut,
         shiftSearchAgainShortcut = _getShortcuts2.shiftSearchAgainShortcut;
@@ -24261,26 +24013,202 @@ class SearchBar extends _react.Component
       searchInput.focus();
     }
 
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedResultIndex);
     }
   }
 
+  onEscape(e) {
+    this.closeSearch(e);
+  }
+
+  clearSearch() {
+    var _props = this.props,
+        ed = _props.editor,
+        query = _props.query,
+        modifiers = _props.modifiers;
+
+    if (ed && modifiers) {
+      var ctx = { ed, cm: ed.codeMirror };
+      (0, _editor.removeOverlay)(ctx, query, modifiers.toJS());
+    }
+  }
+
+  closeSearch(e) {
+    var _props2 = this.props,
+        editor = _props2.editor,
+        setFileSearchQuery = _props2.setFileSearchQuery,
+        searchOn = _props2.searchOn;
+
+
+    if (editor && searchOn) {
+      setFileSearchQuery("");
+      this.clearSearch();
+      this.props.setActiveSearch();
+      this.props.clearHighlightLineRange();
+      e.stopPropagation();
+      e.preventDefault();
+    }
+  }
+
+  toggleSearch(e) {
+    e.stopPropagation();
+    e.preventDefault();
+    var editor = this.props.editor;
+
+
+    if (!this.props.searchOn) {
+      this.props.setActiveSearch("file");
+    }
+
+    if (this.props.searchOn && editor) {
+      var selection = editor.codeMirror.getSelection();
+      this.setSearchValue(selection);
+      if (selection !== "") {
+        this.doSearch(selection);
+      }
+      this.selectSearchInput();
+    }
+  }
+
+  setSearchValue(value) {
+    var searchInput = this.searchInput();
+    if (value == "" || !searchInput) {
+      return;
+    }
+
+    searchInput.value = value;
+  }
+
+  selectSearchInput() {
+    var searchInput = this.searchInput();
+    if (searchInput) {
+      searchInput.setSelectionRange(0, searchInput.value.length);
+      searchInput.focus();
+    }
+  }
+
+  searchInput() {
+    var node = (0, _reactDom.findDOMNode)(this);
+    if (node instanceof HTMLElement) {
+      var input = node.querySelector("input");
+      if (input instanceof HTMLInputElement) {
+        return input;
+      }
+    }
+    return null;
+  }
+
+  doSearch(query) {
+    var _props3 = this.props,
+        selectedSource = _props3.selectedSource,
+        setFileSearchQuery = _props3.setFileSearchQuery;
+
+    if (!selectedSource || !selectedSource.get("text")) {
+      return;
+    }
+
+    setFileSearchQuery(query);
+
+    this.searchContents(query);
+  }
+
+  updateSearchResults(characterIndex, line, matches) {
+    var matchIndex = matches.findIndex(elm => elm.line === line && elm.ch === characterIndex);
+    this.props.updateSearchResults({
+      matches,
+      matchIndex,
+      count: matches.length,
+      index: characterIndex
+    });
+  }
+
+  searchContents(query) {
+    var _this = this;
+
+    return _asyncToGenerator(function* () {
+      var _props4 = _this.props,
+          selectedSource = _props4.selectedSource,
+          modifiers = _props4.modifiers,
+          ed = _props4.editor;
+
+
+      if (!query || !ed || !selectedSource || !selectedSource.get("text") || !modifiers) {
+        return;
+      }
+
+      var ctx = { ed, cm: ed.codeMirror };
+
+      var _modifiers = modifiers.toJS();
+      var matches = yield (0, _search.getMatches)(query, selectedSource.get("text"), _modifiers);
+
+      var _find = (0, _editor.find)(ctx, query, true, _modifiers),
+          ch = _find.ch,
+          line = _find.line;
+
+      _this.updateSearchResults(ch, line, matches);
+    })();
+  }
+
+  traverseResults(e, rev) {
+    e.stopPropagation();
+    e.preventDefault();
+    var ed = this.props.editor;
+
+    if (!ed) {
+      return;
+    }
+
+    var ctx = { ed, cm: ed.codeMirror };
+
+    var _props5 = this.props,
+        query = _props5.query,
+        modifiers = _props5.modifiers,
+        matches = _props5.searchResults.matches;
+
+
+    if (query === "") {
+      this.props.setActiveSearch("file");
+    }
+
+    if (modifiers) {
+      var matchedLocations = matches || [];
+
+      var _ref = rev ? (0, _editor.findPrev)(ctx, query, true, modifiers.toJS()) : (0, _editor.findNext)(ctx, query, true, modifiers.toJS()),
+          ch = _ref.ch,
+          line = _ref.line;
+
+      this.updateSearchResults(ch, line, matchedLocations);
+    }
+  }
+
   // Handlers
 
+  onChange(e) {
+    return this.doSearch(e.target.value);
+  }
+
+  onKeyUp(e) {
+    if (e.key !== "Enter" && e.key !== "F3") {
+      return;
+    }
+
+    this.traverseResults(e, e.shiftKey);
+    e.preventDefault();
+  }
   // Renderers
   buildSummaryMsg() {
-    var _props7 = this.props,
-        _props7$searchResults = _props7.searchResults,
-        matchIndex = _props7$searchResults.matchIndex,
-        count = _props7$searchResults.count,
-        index = _props7$searchResults.index,
-        query = _props7.query;
+    var _props6 = this.props,
+        _props6$searchResults = _props6.searchResults,
+        matchIndex = _props6$searchResults.matchIndex,
+        count = _props6$searchResults.count,
+        index = _props6$searchResults.index,
+        query = _props6.query;
 
 
     if (query.trim() == "") {
       return "";
     }
 
     if (count == 0) {
       return L10N.getStr("editor.noResults");
@@ -24288,16 +24216,71 @@ class SearchBar extends _react.Component
 
     if (index == -1) {
       return L10N.getFormatStr("sourceSearch.resultsSummary1", count);
     }
 
     return L10N.getFormatStr("editor.searchResults", matchIndex + 1, count);
   }
 
+  renderSearchModifiers() {
+    var _props7 = this.props,
+        modifiers = _props7.modifiers,
+        toggleFileSearchModifier = _props7.toggleFileSearchModifier;
+
+
+    function SearchModBtn(_ref2) {
+      var modVal = _ref2.modVal,
+          className = _ref2.className,
+          svgName = _ref2.svgName,
+          tooltip = _ref2.tooltip;
+
+      var preppedClass = (0, _classnames2.default)(className, {
+        active: modifiers && modifiers.get(modVal)
+      });
+      return _react2.default.createElement(
+        "button",
+        {
+          className: preppedClass,
+          onClick: () => toggleFileSearchModifier(modVal),
+          title: tooltip
+        },
+        _react2.default.createElement(_Svg2.default, { name: svgName })
+      );
+    }
+
+    return _react2.default.createElement(
+      "div",
+      { className: "search-modifiers" },
+      _react2.default.createElement(
+        "span",
+        { className: "search-type-name" },
+        L10N.getStr("symbolSearch.searchModifier.modifiersLabel")
+      ),
+      _react2.default.createElement(SearchModBtn, {
+        modVal: "regexMatch",
+        className: "regex-match-btn",
+        svgName: "regex-match",
+        tooltip: L10N.getStr("symbolSearch.searchModifier.regex")
+      }),
+      _react2.default.createElement(SearchModBtn, {
+        modVal: "caseSensitive",
+        className: "case-sensitive-btn",
+        svgName: "case-match",
+        tooltip: L10N.getStr("symbolSearch.searchModifier.caseSensitive")
+      }),
+      _react2.default.createElement(SearchModBtn, {
+        modVal: "wholeWord",
+        className: "whole-word-btn",
+        svgName: "whole-word-match",
+        tooltip: L10N.getStr("symbolSearch.searchModifier.wholeWord")
+      })
+    );
+  }
+
   renderSearchType() {
     return _react2.default.createElement(
       "div",
       { className: "search-type-toggles" },
       _react2.default.createElement(
         "span",
         {
           className: "search-type-name",
@@ -24339,17 +24322,17 @@ class SearchBar extends _react.Component
         this.renderSearchType(),
         this.renderSearchModifiers()
       )
     );
   }
 }
 
 SearchBar.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
     query: (0, _selectors.getFileSearchQueryState)(state),
     modifiers: (0, _selectors.getFileSearchModifierState)(state),
     searchResults: (0, _selectors.getSearchResults)(state)
@@ -24569,18 +24552,239 @@ exports.default = (0, _reactRedux.connec
 /* 643 */,
 /* 644 */,
 /* 645 */,
 /* 646 */,
 /* 647 */,
 /* 648 */,
 /* 649 */,
 /* 650 */,
-/* 651 */,
-/* 652 */,
+/* 651 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(84),
+    now = __webpack_require__(652),
+    toNumber = __webpack_require__(304);
+
+/** Error message constants. */
+var FUNC_ERROR_TEXT = 'Expected a function';
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max,
+    nativeMin = Math.min;
+
+/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ *  Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ *  The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ *  Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ *   'leading': true,
+ *   'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */
+function debounce(func, wait, options) {
+  var lastArgs,
+      lastThis,
+      maxWait,
+      result,
+      timerId,
+      lastCallTime,
+      lastInvokeTime = 0,
+      leading = false,
+      maxing = false,
+      trailing = true;
+
+  if (typeof func != 'function') {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  wait = toNumber(wait) || 0;
+  if (isObject(options)) {
+    leading = !!options.leading;
+    maxing = 'maxWait' in options;
+    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+    trailing = 'trailing' in options ? !!options.trailing : trailing;
+  }
+
+  function invokeFunc(time) {
+    var args = lastArgs,
+        thisArg = lastThis;
+
+    lastArgs = lastThis = undefined;
+    lastInvokeTime = time;
+    result = func.apply(thisArg, args);
+    return result;
+  }
+
+  function leadingEdge(time) {
+    // Reset any `maxWait` timer.
+    lastInvokeTime = time;
+    // Start the timer for the trailing edge.
+    timerId = setTimeout(timerExpired, wait);
+    // Invoke the leading edge.
+    return leading ? invokeFunc(time) : result;
+  }
+
+  function remainingWait(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime,
+        result = wait - timeSinceLastCall;
+
+    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
+  }
+
+  function shouldInvoke(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime;
+
+    // Either this is the first call, activity has stopped and we're at the
+    // trailing edge, the system time has gone backwards and we're treating
+    // it as the trailing edge, or we've hit the `maxWait` limit.
+    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
+      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+  }
+
+  function timerExpired() {
+    var time = now();
+    if (shouldInvoke(time)) {
+      return trailingEdge(time);
+    }
+    // Restart the timer.
+    timerId = setTimeout(timerExpired, remainingWait(time));
+  }
+
+  function trailingEdge(time) {
+    timerId = undefined;
+
+    // Only invoke if we have `lastArgs` which means `func` has been
+    // debounced at least once.
+    if (trailing && lastArgs) {
+      return invokeFunc(time);
+    }
+    lastArgs = lastThis = undefined;
+    return result;
+  }
+
+  function cancel() {
+    if (timerId !== undefined) {
+      clearTimeout(timerId);
+    }
+    lastInvokeTime = 0;
+    lastArgs = lastCallTime = lastThis = timerId = undefined;
+  }
+
+  function flush() {
+    return timerId === undefined ? result : trailingEdge(now());
+  }
+
+  function debounced() {
+    var time = now(),
+        isInvoking = shouldInvoke(time);
+
+    lastArgs = arguments;
+    lastThis = this;
+    lastCallTime = time;
+
+    if (isInvoking) {
+      if (timerId === undefined) {
+        return leadingEdge(lastCallTime);
+      }
+      if (maxing) {
+        // Handle invocations in a tight loop.
+        timerId = setTimeout(timerExpired, wait);
+        return invokeFunc(lastCallTime);
+      }
+    }
+    if (timerId === undefined) {
+      timerId = setTimeout(timerExpired, wait);
+    }
+    return result;
+  }
+  debounced.cancel = cancel;
+  debounced.flush = flush;
+  return debounced;
+}
+
+module.exports = debounce;
+
+
+/***/ }),
+/* 652 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var root = __webpack_require__(8);
+
+/**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ *   console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
+var now = function() {
+  return root.Date.now();
+};
+
+module.exports = now;
+
+
+/***/ }),
 /* 653 */,
 /* 654 */,
 /* 655 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -24897,22 +25101,21 @@ var _reactDom2 = _interopRequireDefault(
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _BracketArrow = __webpack_require__(1029);
 
 var _BracketArrow2 = _interopRequireDefault(_BracketArrow);
 
-__webpack_require__(1253);
+__webpack_require__(880);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Popover extends _react.Component {
-
   constructor() {
     super();
     this.onMouseLeave = this.onMouseLeave.bind(this);
     this.state = {
       left: 0,
       top: 0
     };
   }
@@ -25063,16 +25266,24 @@ class Popover extends _react.Component {
     if (type === "tooltip") {
       return this.renderTooltip();
     }
 
     return this.renderPopover();
   }
 }
 
+Popover.propTypes = {
+  target: _react.PropTypes.object,
+  targetPosition: _react.PropTypes.object,
+  children: _react.PropTypes.object,
+  onMouseLeave: _react.PropTypes.func,
+  type: _react.PropTypes.string
+};
+
 Popover.defaultProps = {
   onMouseLeave: () => {},
   type: "popover"
 };
 
 exports.default = Popover;
 
 /***/ }),
@@ -25106,17 +25317,17 @@ var _react2 = _interopRequireDefault(_re
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(1246);
+__webpack_require__(873);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderConditionalPanel(_ref) {
   var condition = _ref.condition,
       closePanel = _ref.closePanel,
       setBreakpoint = _ref.setBreakpoint;
 
@@ -25383,20 +25594,16 @@ exports.default = HitMarker;
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -25457,17 +25664,17 @@ var _UtilsBar2 = _interopRequireDefault(
 var _ChromeScopes = __webpack_require__(728);
 
 var _ChromeScopes2 = _interopRequireDefault(_ChromeScopes);
 
 var _Scopes2 = __webpack_require__(731);
 
 var _Scopes3 = _interopRequireDefault(_Scopes2);
 
-__webpack_require__(1267);
+__webpack_require__(921);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var Scopes = (0, _devtoolsConfig.isEnabled)("chromeScopes") ? _ChromeScopes2.default : _Scopes3.default;
 
 function debugBtn(onClick, type, className, tooltip) {
@@ -25641,28 +25848,28 @@ class SecondaryPanes extends _react.Comp
       _react2.default.createElement(_CommandBar2.default, { horizontal: this.props.horizontal }),
       this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
       this.renderUtilsBar()
     );
   }
 }
 
 SecondaryPanes.propTypes = {
-  evaluateExpressions: _propTypes2.default.func.isRequired,
-  pauseData: _propTypes2.default.object,
-  horizontal: _propTypes2.default.bool,
+  evaluateExpressions: _react.PropTypes.func.isRequired,
+  pauseData: _react.PropTypes.object,
+  horizontal: _react.PropTypes.bool,
   breakpoints: _reactImmutableProptypes2.default.map.isRequired,
-  breakpointsDisabled: _propTypes2.default.bool,
-  breakpointsLoading: _propTypes2.default.bool,
-  toggleAllBreakpoints: _propTypes2.default.func.isRequired,
-  toggleShortcutsModal: _propTypes2.default.func
+  breakpointsDisabled: _react.PropTypes.bool,
+  breakpointsLoading: _react.PropTypes.bool,
+  toggleAllBreakpoints: _react.PropTypes.func.isRequired,
+  toggleShortcutsModal: _react.PropTypes.func
 };
 
 SecondaryPanes.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseData: (0, _selectors.getPause)(state),
   breakpoints: (0, _selectors.getBreakpoints)(state),
   breakpointsDisabled: (0, _selectors.getBreakpointsDisabled)(state),
   breakpointsLoading: (0, _selectors.getBreakpointsLoading)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SecondaryPanes);
@@ -25695,17 +25902,17 @@ var _selectors = __webpack_require__(242
 var _expressions = __webpack_require__(1177);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(1260);
+__webpack_require__(908);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Expressions extends _react.PureComponent {
 
   constructor() {
     super(...arguments);
 
@@ -25940,42 +26147,36 @@ var _utils = __webpack_require__(234);
 var _source = __webpack_require__(233);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(1259);
+__webpack_require__(907);
 
 var _lodash = __webpack_require__(2);
 
 function _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; } }
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
 function isCurrentlyPausedAtBreakpoint(pause, breakpoint) {
   if (!pause || pause.isInterrupted) {
     return false;
   }
 
   var bpId = (0, _breakpoint.makeLocationId)(breakpoint.location);
   var pausedId = (0, _breakpoint.makeLocationId)((0, _lodash.get)(pause, "frame.location"));
   return bpId === pausedId;
 }
 
-function getBreakpointFilename(source) {
-  return source && source.toJS ? (0, _source.getFilename)(source.toJS()) : "";
-}
-
 function renderSourceLocation(source, line, column) {
-  var filename = getBreakpointFilename(source);
+  var filename = source ? (0, _source.getFilename)(source.toJS()) : null;
   var isWasm = source && source.get("isWasm");
   var columnVal = (0, _devtoolsConfig.isEnabled)("columnBreakpoints") && column ? `:${column}` : "";
   var bpLocation = isWasm ? `0x${line.toString(16).toUpperCase()}` : `${line}${columnVal}`;
 
   if (!filename) {
     return null;
   }
 
@@ -26218,26 +26419,26 @@ class Breakpoints extends _react.PureCom
           paused: isCurrentlyPaused,
           disabled: isDisabled,
           "is-conditional": isConditional
         }),
         key: locationId,
         onClick: () => this.selectBreakpoint(breakpoint),
         onContextMenu: e => this.showContextMenu(e, breakpoint)
       },
-      _react2.default.createElement("input", {
-        type: "checkbox",
-        className: "breakpoint-checkbox",
-        checked: !isDisabled,
-        onChange: () => this.handleCheckbox(breakpoint),
-        onClick: ev => ev.stopPropagation()
-      }),
       _react2.default.createElement(
         "label",
         { className: "breakpoint-label", title: breakpoint.text },
+        _react2.default.createElement("input", {
+          type: "checkbox",
+          className: "breakpoint-checkbox",
+          checked: !isDisabled,
+          onChange: () => this.handleCheckbox(breakpoint),
+          onClick: ev => ev.stopPropagation()
+        }),
         renderSourceLocation(breakpoint.location.source, line, column)
       ),
       _react2.default.createElement(
         "div",
         { className: "breakpoint-snippet" },
         snippet
       ),
       _react2.default.createElement(_Close2.default, {
@@ -26249,17 +26450,17 @@ class Breakpoints extends _react.PureCom
 
   render() {
     var breakpoints = this.props.breakpoints;
 
     var children = breakpoints.size === 0 ? _react2.default.createElement(
       "div",
       { className: "pane-info" },
       L10N.getStr("breakpoints.none")
-    ) : (0, _lodash.sortBy)([].concat(_toConsumableArray(breakpoints.valueSeq())), [bp => getBreakpointFilename(bp.location.source), bp => bp.location.line]).map(bp => this.renderBreakpoint(bp));
+    ) : breakpoints.valueSeq().map(bp => this.renderBreakpoint(bp));
 
     return _react2.default.createElement(
       "div",
       { className: "pane breakpoints-list" },
       children
     );
   }
 }
@@ -26317,17 +26518,17 @@ var _selectors = __webpack_require__(242
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _ManagedTree = __webpack_require__(419);
 
 var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
-__webpack_require__(1216);
+__webpack_require__(850);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 // check to see if its an object with propertie
 function nodeHasProperties(item) {
   return !nodeHasChildren(item) && item.contents.value.type === "object";
 }
 
@@ -26554,17 +26755,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _scopes = __webpack_require__(732);
 
 var _devtoolsReps = __webpack_require__(924);
 
-__webpack_require__(1216);
+__webpack_require__(850);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Scopes extends _react.PureComponent {
 
   constructor(props) {
     var pauseInfo = props.pauseInfo,
         selectedFrame = props.selectedFrame,
@@ -26851,17 +27052,17 @@ var _actions = __webpack_require__(244);
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(1264);
+__webpack_require__(915);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class EventListeners extends _react.Component {
 
   constructor() {
     super(...arguments);
 
@@ -26965,63 +27166,34 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(1266);
+__webpack_require__(917);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 class Accordion extends _react.Component {
 
   constructor(props) {
     super();
 
-    this.renderContainer = (item, i) => {
-      var _state = this.state,
-          opened = _state.opened,
-          created = _state.created;
-
-      var containerClassName = `${item.header.toLowerCase().replace(/\s/g, "-")}-pane`;
-
-      return _react2.default.createElement(
-        "div",
-        { className: containerClassName, key: i },
-        _react2.default.createElement(
-          "div",
-          { className: "_header", onClick: () => this.handleHeaderClick(i) },
-          _react2.default.createElement(_Svg2.default, { name: "arrow", className: opened[i] ? "expanded" : "" }),
-          item.header,
-          item.buttons ? _react2.default.createElement(
-            "div",
-            { className: "header-buttons" },
-            item.buttons
-          ) : null
-        ),
-        created[i] || opened[i] ? _react2.default.createElement(
-          "div",
-          {
-            className: "_content",
-            style: { display: opened[i] ? "block" : "none" }
-          },
-          (0, _react.createElement)(item.component, item.componentProps || {})
-        ) : null
-      );
-    };
-
     this.state = {
       opened: props.items.map(item => item.opened),
       created: []
     };
+
+    var self = this;
+    self.renderContainer = this.renderContainer.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
     var newOpened = this.state.opened.map((isOpen, i) => {
       var shouldOpen = nextProps.items[i].shouldOpen;
 
 
       return isOpen || shouldOpen && shouldOpen();
@@ -27044,16 +27216,48 @@ class Accordion extends _react.Component
 
     if (item.onToggle) {
       item.onToggle(opened[i]);
     }
 
     this.setState({ opened, created });
   }
 
+  renderContainer(item, i) {
+    var _state = this.state,
+        opened = _state.opened,
+        created = _state.created;
+
+    var containerClassName = `${item.header.toLowerCase().replace(/\s/g, "-")}-pane`;
+
+    return _react2.default.createElement(
+      "div",
+      { className: containerClassName, key: i },
+      _react2.default.createElement(
+        "div",
+        { className: "_header", onClick: () => this.handleHeaderClick(i) },
+        _react2.default.createElement(_Svg2.default, { name: "arrow", className: opened[i] ? "expanded" : "" }),
+        item.header,
+        item.buttons ? _react2.default.createElement(
+          "div",
+          { className: "header-buttons" },
+          item.buttons
+        ) : null
+      ),
+      created[i] || opened[i] ? _react2.default.createElement(
+        "div",
+        {
+          className: "_content",
+          style: { display: opened[i] ? "block" : "none" }
+        },
+        (0, _react.createElement)(item.component, item.componentProps || {})
+      ) : null
+    );
+  }
+
   render() {
     return _react2.default.createElement(
       "div",
       { className: "accordion" },
       this.props.items.map(this.renderContainer)
     );
   }
 }
@@ -27070,20 +27274,16 @@ exports.default = Accordion;
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -27098,17 +27298,17 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _text = __webpack_require__(389);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
-__webpack_require__(1215);
+__webpack_require__(918);
 
 var _devtoolsModules = __webpack_require__(830);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var appinfo = _devtoolsModules.Services.appinfo;
 
 
@@ -27268,17 +27468,17 @@ class CommandBar extends _react.Componen
       this.renderPauseButton(),
       this.renderStepButtons(),
       this.renderPauseOnExceptions()
     );
   }
 }
 
 CommandBar.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     pause: (0, _selectors.getPause)(state),
     isWaitingOnBreak: (0, _selectors.getIsWaitingOnBreak)(state),
     shouldPauseOnExceptions: (0, _selectors.getShouldPauseOnExceptions)(state),
     shouldIgnoreCaughtExceptions: (0, _selectors.getShouldIgnoreCaughtExceptions)(state)
@@ -27315,17 +27515,17 @@ var _actions2 = _interopRequireDefault(_
 var _selectors = __webpack_require__(242);
 
 var _text = __webpack_require__(389);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
-__webpack_require__(1268);
+__webpack_require__(922);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class WelcomeBox extends _react.Component {
 
   renderToggleButton() {
     var _props = this.props,
         horizontal = _props.horizontal,
@@ -27354,46 +27554,17 @@ class WelcomeBox extends _react.Componen
     var setActiveSearch = this.props.setActiveSearch;
 
 
     return _react2.default.createElement(
       "div",
       { className: "welcomebox" },
       _react2.default.createElement(
         "div",
-        { className: "alignlabel small-size-layout" },
-        _react2.default.createElement(
-          "div",
-          { className: "shortcutFunction" },
-          _react2.default.createElement(
-            "p",
-            { onClick: setActiveSearch.bind(null, "source") },
-            _react2.default.createElement(
-              "span",
-              { className: "shortcutKey" },
-              searchSourcesShortcut
-            ),
-            searchSourcesLabel
-          ),
-          _react2.default.createElement(
-            "p",
-            { onClick: setActiveSearch.bind(null, "project") },
-            _react2.default.createElement(
-              "span",
-              { className: "shortcutKey" },
-              searchProjectShortcut
-            ),
-            searchProjectLabel
-          )
-        ),
-        this.renderToggleButton()
-      ),
-      _react2.default.createElement(
-        "div",
-        { className: "alignlabel normal-layout" },
+        { className: "alignlabel" },
         _react2.default.createElement(
           "div",
           { className: "shortcutKeys" },
           _react2.default.createElement(
             "p",
             { onClick: setActiveSearch.bind(null, "source") },
             searchSourcesShortcut
           ),
@@ -27411,17 +27582,18 @@ class WelcomeBox extends _react.Componen
             { onClick: setActiveSearch.bind(null, "source") },
             searchSourcesLabel
           ),
           _react2.default.createElement(
             "p",
             { onClick: setActiveSearch.bind(null, "project") },
             searchProjectLabel
           )
-        )
+        ),
+        this.renderToggleButton()
       )
     );
   }
 }
 
 exports.default = (0, _reactRedux.connect)(state => ({
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(WelcomeBox);
@@ -27474,17 +27646,17 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _lodash = __webpack_require__(2);
 
 var _text = __webpack_require__(389);
 
-__webpack_require__(1269);
+__webpack_require__(923);
 
 var _PaneToggle = __webpack_require__(428);
 
 var _PaneToggle2 = _interopRequireDefault(_PaneToggle);
 
 var _Dropdown = __webpack_require__(751);
 
 var _Dropdown2 = _interopRequireDefault(_Dropdown);
@@ -27824,17 +27996,17 @@ class SourceTabs extends _react.PureComp
 
     return _react2.default.createElement(
       "div",
       {
         className: className,
         key: source.get("id"),
         onClick: () => selectSource(source.get("id")),
         onContextMenu: e => this.onTabContextMenu(e, source.get("id")),
-        title: (0, _source.getFileURL)(source.toJS())
+        title: (0, _source.getFilename)(source.toJS())
       },
       sourceAnnotation,
       _react2.default.createElement(
         "div",
         { className: "filename" },
         filename
       ),
       _react2.default.createElement(_Close2.default, {
@@ -27945,17 +28117,17 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(1270);
+__webpack_require__(935);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Dropdown extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = {
@@ -28232,17 +28404,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _lodash = __webpack_require__(2);
 
 var _frame = __webpack_require__(1014);
 
-__webpack_require__(1245);
+__webpack_require__(872);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function getFunctionName(func) {
   var name = func.userDisplayName || func.displayName || func.name;
   return (0, _frame.simplifyDisplayName)(name);
 }
 
@@ -28346,35 +28518,29 @@ var findScopeByName = exports.findScopeB
     });
   });
 
   return function findScopeByName(_x3, _x4) {
     return _ref2.apply(this, arguments);
   };
 })();
 
-exports.containsPosition = containsPosition;
 exports.findClosestScope = findClosestScope;
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
+
+var _contains = __webpack_require__(1127);
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
-function containsPosition(a, b) {
-  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
-  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
-
-  return startsBefore && endsAfter;
-}
-
 function findClosestScope(functions, location) {
   return functions.reduce((found, currNode) => {
-    if (currNode.name === "anonymous" || !containsPosition(currNode.location, location)) {
+    if (currNode.name === "anonymous" || !(0, _contains.containsPosition)(currNode.location, location)) {
       return found;
     }
 
     if (!found) {
       return currNode;
     }
 
     if (found.location.start.line > currNode.location.start.line) {
@@ -28437,17 +28603,19 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
-var _lodash = __webpack_require__(2);
+var _debounce = __webpack_require__(651);
+
+var _debounce2 = _interopRequireDefault(_debounce);
 
 var _Popup = __webpack_require__(810);
 
 var _Popup2 = _interopRequireDefault(_Popup);
 
 var _selectors = __webpack_require__(242);
 
 var _actions = __webpack_require__(244);
@@ -28460,17 +28628,17 @@ function _interopRequireDefault(obj) { r
 
 class Preview extends _react.PureComponent {
 
   constructor() {
     super();
 
     var self = this;
     self.onScroll = this.onScroll.bind(this);
-    self.onMouseOver = (0, _lodash.debounce)(this.onMouseOver, 40);
+    self.onMouseOver = (0, _debounce2.default)(this.onMouseOver, 40);
   }
 
   componentDidMount() {
     var codeMirror = this.props.editor.codeMirror;
 
     var codeMirrorWrapper = codeMirror.getWrapperElement();
 
     codeMirror.on("scroll", this.onScroll);
@@ -28584,31 +28752,25 @@ var _Popover = __webpack_require__(698);
 var _Popover2 = _interopRequireDefault(_Popover);
 
 var _PreviewFunction = __webpack_require__(798);
 
 var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(1254);
+__webpack_require__(881);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var Rep = _devtoolsReps2.default.REPS.Rep,
     MODE = _devtoolsReps2.default.MODE,
     ObjectInspectorUtils = _devtoolsReps2.default.ObjectInspectorUtils;
 var ObjectInspector = _devtoolsReps2.default.ObjectInspector;
 var getChildren = ObjectInspectorUtils.getChildren;
-
-
-function isReactComponent(roots) {
-  return roots.some(root => root.name === "_reactInternalInstance");
-}
-
 class Popup extends _react.Component {
 
   componentDidMount() {
     var _props = this.props,
         loadObjectProperties = _props.loadObjectProperties,
         loadedObjects = _props.loadedObjects,
         value = _props.value,
         editor = _props.editor,
@@ -28659,33 +28821,20 @@ class Popup extends _react.Component {
         className: "preview-popup",
         onClick: () => selectSourceURL(location.url, { line: location.line })
       },
       _react2.default.createElement(_PreviewFunction2.default, { func: value })
     );
   }
 
   renderObjectPreview(expression, root) {
-    var loadedObjects = this.props.loadedObjects;
-
-    var getObjectProperties = id => loadedObjects[id];
-    var roots = this.getChildren(root, getObjectProperties);
-
-    if (!roots) {
-      return null;
-    }
-
-    if (isReactComponent(roots)) {
-      roots = roots.filter(r => ["state", "props"].includes(r.name));
-    }
-
     return _react2.default.createElement(
       "div",
       { className: "preview-popup" },
-      this.renderObjectInspector(roots)
+      this.renderObjectInspector(root)
     );
   }
 
   renderSimplePreview(value) {
     var openLink = this.props.openLink;
 
     return _react2.default.createElement(
       "div",
@@ -28693,23 +28842,29 @@ class Popup extends _react.Component {
       Rep({
         object: value,
         mode: MODE.LONG,
         openLink
       })
     );
   }
 
-  renderObjectInspector(roots) {
+  renderObjectInspector(root) {
     var _props2 = this.props,
         loadObjectProperties = _props2.loadObjectProperties,
         loadedObjects = _props2.loadedObjects,
         openLink = _props2.openLink;
 
+
     var getObjectProperties = id => loadedObjects[id];
+    var roots = this.getChildren(root, getObjectProperties);
+
+    if (!roots) {
+      return null;
+    }
 
     return _react2.default.createElement(ObjectInspector, {
       roots: roots,
       autoExpandDepth: 0,
       disableWrap: true,
       disabledFocus: true,
       openLink: openLink,
       getObjectProperties: getObjectProperties,
@@ -28770,30 +28925,31 @@ class Popup extends _react.Component {
         this.renderAddToExpressionBar(expression)
       );
     }
 
     return this.renderSimplePreview(value);
   }
 
   getPreviewType(value) {
-    if (typeof value == "number" || typeof value == "boolean" || typeof value == "string" && value.length < 10 || typeof value == "number" && value.toString().length < 10 || value.type == "null" || value.type == "undefined" || value.class === "Function") {
+    if (typeof value == "number" || typeof value == "boolean" || value.type == "null" || value.type == "undefined" || value.class === "Function") {
       return "tooltip";
     }
 
     return "popover";
   }
 
   render() {
     var _props3 = this.props,
         popoverPos = _props3.popoverPos,
         onClose = _props3.onClose,
         value = _props3.value,
         expression = _props3.expression;
 
+
     var type = this.getPreviewType(value);
 
     return _react2.default.createElement(
       _Popover2.default,
       { targetPosition: popoverPos, onMouseLeave: onClose, type: type },
       this.renderPreview(expression, value)
     );
   }
@@ -28816,17 +28972,52 @@ exports.default = (0, _reactRedux.connec
 /* 819 */,
 /* 820 */,
 /* 821 */,
 /* 822 */,
 /* 823 */,
 /* 824 */,
 /* 825 */,
 /* 826 */,
-/* 827 */,
+/* 827 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.hasSyntaxError = exports.clearSources = exports.setSource = exports.hasSource = exports.getEmptyLines = exports.getNextStep = exports.clearASTs = exports.clearScopes = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getScopes = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
+
+var _devtoolsUtils = __webpack_require__(900);
+
+var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
+
+
+var dispatcher = new WorkerDispatcher();
+var startParserWorker = exports.startParserWorker = dispatcher.start.bind(dispatcher);
+var stopParserWorker = exports.stopParserWorker = dispatcher.stop.bind(dispatcher);
+
+var getClosestExpression = exports.getClosestExpression = dispatcher.task("getClosestExpression");
+var getSymbols = exports.getSymbols = dispatcher.task("getSymbols");
+var getScopes = exports.getScopes = dispatcher.task("getScopes");
+var getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
+var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
+var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
+var clearScopes = exports.clearScopes = dispatcher.task("clearScopes");
+var clearASTs = exports.clearASTs = dispatcher.task("clearASTs");
+var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
+var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
+var hasSource = exports.hasSource = dispatcher.task("hasSource");
+var setSource = exports.setSource = dispatcher.task("setSource");
+var clearSources = exports.clearSources = dispatcher.task("clearSources");
+var hasSyntaxError = exports.hasSyntaxError = dispatcher.task("hasSyntaxError");
+
+/***/ }),
 /* 828 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var feature = __webpack_require__(829);
 
@@ -28980,54 +29171,214 @@ module.exports = {
 /* 842 */,
 /* 843 */,
 /* 844 */,
 /* 845 */,
 /* 846 */,
 /* 847 */,
 /* 848 */,
 /* 849 */,
-/* 850 */,
-/* 851 */,
-/* 852 */,
-/* 853 */,
-/* 854 */,
+/* 850 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 851 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 852 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 853 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 854 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 855 */
 /***/ (function(module, exports) {
 
 module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABqCAMAAAAC5xbnAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CkzCJ1kAAAMAUExURUxpcf/fQOF4Wf6qob2GSbyGTP61q++hVlpCNO+ATLuESaZzPYdWLZ1uN/KOQywvJ/OGDfeTGWRSMlpFNvqrQ/yNkPipLfeTGviRGyobJAYCC5BgL/y2MKJrRg0gKH5ULfSTIWhnYyIeJv5/g7K1tfiSGviWIIZgPP+jn6KnqJxqNvmWH/qdTJNkM/6GjPmdKX5JIKiIafeVHTcuLK9uHvTn0/iUH5NiKQUbM/eTH0ExL/6hmv/TStTCqvidK/6Oi/uTkOnZv/mgNLaHbZppFu6ooPeMGYJVJOzbu5pqOap2RY+WnZaOgv+cmahkY/LjzvaEE+vew/2blzs+Ov6enQohIsVvb/+QkP6Bg4+YntB4de7Ru7yfg6KEaf+movj07s7Husx9atqYPJVKKLqESf/47v22GuJOM/3LLf/////ZY//37fyzGP3y4v2rFv3JLP3z5fuiEt9HM/3CKAAAAN1BL//+9f7NLtk7KP726NY0ILB4P/7XYvukH95HLf/88v65Gvy6J/7IKPPizLZ7QPqPEPru3N1AJ7+ITP+vprqAQ+p5IPiZGbV/Rfz8/PyzJv+lmP7VOfitIvqzT/zozeTMtf/RLvycCcSKTP29Hv/ocf/Btv3LOOdpHQQaI/7RY+JcJaltNP66r/3AM6OEMPCMH+nq6/Lz9JpiLzk3M/nYxE40H7WTMcgvHk9AMsLEwyQsL/u8ANrEqurWwJp2Jtrc3WRNR//76fzPsmJHI+FZHvfo1+WiHf3BV/p4dHVdMwABKfDALbV6Kt9PJ91+YHY/L6OVhJksJyIdGcUjB4VrMLd9OMqiL7EqIEJAP/3LXtu5maAFBP7OQ/yWj5GXl7w7K8GLHH1RLNyuLXklJ83Q0WYzLs2THIJJC/+PeXp4cIoABOe4LTUlJ//hbMWXYISKivqqA8udeemXhXtaHOiHc9YLAM1AKI+Ec7ideFVgYNs0BrgSAJh3YcRwII1ZGMCsj2QCAteBEXqDgviWNfW4esd1S8e4ofbDnNVeSrxWUew/xBkAAABkdFJOUwD+EP7//v4CAwX8/mb9HhH/MP3+/TT9TdYm/oP90bA4bPtYefztff7J+buL991SyUn+Y9v62T+cfp3S9P5co9TrkLj++vmqnHCp90X+nf3EvKx27ZH14bSWoqznwX6h/sly7fPC0KykAAAQBUlEQVRo3tyYe0xTWR7Hb+nwKKs4IK9UnAED+CIiLMvE9ZH1Oc64Pnc0O7O7/0nDo8/0BtKUptQ+VgzSUqCVR0oKXWhpAx0oQsOrGDWkQ8AVFggBFBWVSZTERxzHcXZ/59wWWakOGdl/9isgve39nO/9nd/5/c6BIP6/Fcj4X4EDA+Eb/4+00nTkPJAICcW/en6sJB2FJTQmJgp+i00lVtQ/wLYmJ0bFRpfQEnYk7tPx0vGzrNyEhtbR1BKuurpEreaqS0qi4SGIFZpmwIRG19FiWGxZdYlMxpJVVxcpD6UTKxIhYDASi7iyEhmFxz8lXIHyUOgKzDDQ05PrhDKMV9ct4LkCQULsB/Ph9tTIEhpNpi6pk7FldTRZhQfPZXMlWz+QD95jY2ggoZomZHO16jqtlqsVYjyL9cF8BhGlRvQSobYuMjy8lFJ4JODZLDbwUz8EzyBCIhE8kyeMLO0eqqnJR6qp6Q4XAB7xE0KAH8hgMH5d4PdA3Et4vDx1aU12dr5H2fmlAqADnsXdQfzq9QWrKQbRMzMBn79I2d0YD3x2AqSn3+5TET5X4/tGDoIH3lqC6bw82X/h73rwMIAkkTj8l4Ba+qkl3hjvK334OiOZRuN58DWL8JVDXvcsffJJToAmoDZg2+IigStSYOg7Fx5c/XTd51siaTqgv42/Wzkk8eDVyiRR7TCdHlC1aQFFtYOQ2H3h4e9I3EAi6JurPVevqkuw+UweK3wBn323ksKzIfQS/UvNMF2D8H7YPlVJ/aL2JHXDHaVRvgoffOLP06Akdh4Puxe+wQO8srJGgtKexRYIJMokOoVn4BRFt4cmJpcO1UCCZQ/t8Z0yERrNTo1m+j4PWT8nRPhsr3WEj2QVQFYK9Hrlxy81dE1hQNVRz2yGpO4LR8bxx2uSQnzYZxDbAgI0GA8SgioQ3sOuvAt4rqRIiVUE/MKAgMJtuKVF7YCgLCyR7PzuWJ/4CHpt4cOHSXqJRKvVqtVqbThatDVDQ90gKAuIXQRvqiH4SRpqZqmg5NekxN3btWvXTdCu/Jp9PiYXSvymqoOXX9TdrNMWUZJERkokEgEWlLaYOpCMfV9f9PTL/RvXHoS8REEZGtq1yzbY1NQ3PnMOKfNmeKjv6NQetL6IjLlJo1XfrPaKl5kH0unOfYt0X69/+Y9nrvl5O/PBV4zkGLBbzTvXZxkYcJtclnH4JEQ2JtF3UztaldJvvfbiPgJVfEsJHMeAIsNLf/zx9euOxk5V24h98PJpw3oiNaY6D+zydLawTN2AxdZks5n6YARhtJ+P1A8k/DZV7Tcw48obGzs6Hr7uQLqRlvb06VPz1HV+hrQ4Kwu+srIaNpPMy2dCiER1Jg+nWa9jfMbkmAmzNbl6+/ryzhVF+VpZDOAXriVnGwBRb59ApKwJst8sNjrJWQxui6tHIzSTd85AQQstEiK+LtPhOu0IGze5HW6bZSDMMS7Y4TM6ML1Hn5A/FAOimYzH+M3kmOKiwsycBy51FeN/j3N7nwxqx8yArs80MGC3rbWFjdvcpqbT9iLcEnzuP1aRcQ0Y34x4DXGk+YJCYbSSE+hlGzmCxownNxBowcZKhJk6k3t8QKfrC3OZTO4ZGMI9OaoVpPreETGINX9itgG+fnMDZddqVIjF4jEUHfg324zcz5J/I4JQX0tg5fF6bb0mGzzBTN9a+1q3ze4arWBxT7yrrh1+To7gOCPVz5PXxK9eKRTmfngar9qYU+sDcZHcIxGOh7mbIGdMjj7duLt3IOzAZBcLdxyfdc3vd3IrM76+obi4oaF+4hZ559nVnp6eV0Yr83IzXIXcaWi7Rf5GvB1uh6ZfVDBqt/eGmUx2l6lvJk83bjA4cN1L9I3fm6V60M+c/2F29lbcIEnap4wYL3522kAOxs2OjIzMzpNjwZe2UGaiuXOuXnvvQNO422RymYQFXQfmtAXQ76MZS6MDdUeVm9N6z0lSsjqnzGKx8WcjTO6U9Y7nKukU+5//8lM8uVslcw63axwnfa/bNTnZVUE1zKL0JfahoRwvzskQNd54nPLkScqTKbPRKEYTi2Q0ms0bx65Zr21crfjobPD5dajUQ+pztc8cWsuAyW1yTjpHnaOjk97txNv2YV6l0pycDKmqDCRvfZCWRqEVlIzmMeuY+IK/v//Z4Evr1xBBcH8yt0DL7rIarKNOg8uRZp1zjVI9Lfrt1EfzCuYz4Isjb5XDCC33FIoLFxUKsdG82jzmtPYbmAeuXElL+84/GEUnCKc+G5rM5NykY+7ZXJfT5ewqADirgpuwFH84F7FBIlX54+vPf2q5sd/8bAo0t9pJMg12i+HxjfLW8hv3rpz1P7sKRyckAbXIgoKCtEmHY9RlmKyAVyzY6u55Kzhe86AcPoff+Ueyv99iSXn8+Dkg5U9Ii2WQvCUv44hEfFXLd8GX1lEN+pAAB4PFKhh1OA84RyvYbDgIRCf6LTG/my+l8Bl8DkfEeURa7OTjMg6H097efp0ctNj7W8rk8JKTkVsefOkLXKOIKKV3e1XQNdplvcLVKxN2RDF8TOze3IyMBbyqvdViHyQfcdo5ZRw+5zoJ5h/J5Sp4iyPKyG25soXA0fGL1gu4XgmevlCeiA0hfB6Sjhd78SLkUQSODU1ywKva2x/+s8lwx2Oen5Mj7aTco9RXCjzSK5XRW0MXNj5L8ibXExsUfMC3kBbDvzra28vK2jume3puPyrzms+Rqu595jn6pn+sx2wIyqEoP7zTDPRdbhbwlP3Wy8x/90x3lEHv0tALNT3lco95jF+HowvxOaHHex8qKEGMd+0wg46/wUP0+Sr5rdtQb6Y1AYWwqYFtTaPXPOA7L26HvMeFJFaJgpJO/Y3gPdvvk960R+EBfNlPP08P02sDKNFr5Z0eOuAbD6zB+CAi6JOxNE9Q3n8u2d0ufWMfwqNqHB4upESn0wsbVRwvPUfa8jllPYjYMGjYQPzyHwQWLauF8Hc2VtUiVXU0NnZyvN7BPH//dk9FXPPbwU+I5ZyGFq8rD58v4nNUWBw+n5pVCp/xV5w3EQxiQxNzAzULv6y9uYv5OD35lHDKiLxv5PIjUKhDdh6N+AP9m2WfCoNOSqUZix8AY7H4b+Bgfu8RtBMJKaw9M4wOEYHLPBYSezszUMl/8wQibF60cA33g+b45t2QNat2Hjw2XPjVMo/p8KEjX8fL+ainLBrhzVBI0lyRfGKieGL9Z1+sN35/7Bi96uDy3EPqfB3fVh+f0sqBEGHYIix+JZVKOY0P4toaiidSLp0//5HxzrHhnaeWeTw/srkNth8jt//+fXnnfzq1vpC2rjAe9F4bc80MhhZCpqIWnDJLhw8V+2BhD4Wtb13pnvZ0axzahN6QeU0w/ol6r0muFldbRSK2I7F/Fh2KsqogGmOUzGGpobMOdFKmqN10o66Ubuw79yaptrGc5PeQnHvP+X7fd77z7zvnnpq6iApJRx1CTcv9f2d2t/cLPG0jswSsiQ/XN3uSk3DOqI7JPj/paWvzjIzOm7Z3P371o62lRuQET4H/r47bOhdffXtLtWtm5tVP2zyzdppX/tCb+dUXSXieKYAoqd9TsMZYGZ/qlsoxs7nY2Tk8PGwDDP31n297W/W70+0yWZm1l/39BTQhPOwt1uA5Ri7LvjAoGc/omL4T39W6tre3d3e5efXwuK3lwtqu2WRyfNiud/oYHbs/+PXgJ/a7vXO5YriAwa4pCs4+7fcsgfE6k8NYXeVgdDrGxDFrS5XfjKh3dAx6bSjXu0w63d6fnpFZYaA3S4Y1YGFAFXYR5NLI4IMdE/C4DQaRRsT+YOXLRyjB9HVUdOvdVkitLXlOrs7NYU4HctlpC6Gwf1qQs2ey6hhfbYXB2ceI5IzOO7oakBSZ3GD+tT7Q61WfLPh5DtN4sF5LkDTN5yxzyHhXA+yPfEzYet3CfjhhcrVXG/UOoGcWLubMzWkw5zK5TAuBEU892OGsopHVRuSDMEL+SMpXa6joRvViTP5L61m4M6XkHDojYEWOtQKJ0c2aIgj5GcbEILBu2Kx1IPN1oXuXcI1Hc0Yh35W/bDazJisHLQj0LkcEf/v7wrA6GlAWC6rZALbxYsdUCgMhl8vhdjtrgcPQADCKaJx4cqK9o70DQcyqdTscrr6d4vR4+LMv3u5oB0bxNKdC3OoDIHXzl8mpmxWRJ/Gox9jQ3l57uyQu89VTYXHEAGg0RqyfnKo2iK8MYo6ovaJxIh7zZVk/3ZTEgbYbUF9eHglNn/zWaKg4BIOxobzqbi5+19FkgPFQ7W4IzlEw+gZ695OJ+vLublQRBHSShILu+l9xhxV0nZLvq43l+mvOZpUKGs7lGovCNeb/B96qmpudTlCmr6qSIu76jgwN7qSQXjqhd6ugQ/isVqm3M1HsrOzAW6vP5xvrg77lULmdSEt5/XQJLn2uHzEj0uhgZaxh7KyEoqpAL8tyvjGXQ9Wsn8D0jlxWEmCjzCKvVAWOY1nWuxIyA9iDgGduzIHrHVnWAhfl5oAUxL3zYeythLiDxPCDikDKj9V3IMwt9cJ0gJhZs9e7EAgs7y/7/aMS1OuP9h6FsbfnNYerwsHEUIJHn14sSQHz8opanZH/4vXroaFOCUOro6vPL8wCnj9fzVlZDgQWxNIsF8rC7ThexA3Uk/lKCrbhGzcgPKgJY3wcYu+WlvEbNlvnH3fzJzPUoANUcKFSvJYF55gXlgcmlZYmu91O03Rww3al7ko4yqkTgx74rxzegGzYpivzkYqFUCnWvHAMmjZwL59qEqkRyCA/BOGmqKGyBoWYEPDYFsmglA06LMpJ9co9DZ7zc9cHlE0RbpHfPv1syHZVCs9QhDY+vMhP28loAYIghPySdMwpp5iyC/RBkGTTNL+BNvw223Dn0ItnQSAnD5YQD40wh22acEhUUmAPTgftBI/+p4M0+VYJBX8GM/aG1YTiFfS7CkjkZ2gRkiTfzRXSsEOF9Myud+nf6IgBBU9l4y/mWuII+qMArpfjrycxvfM+4PtG7ACF8dEr+KI41tpU2en4zCcFbRwrOXj/DB2rDRUIsYzPlMfzZRU6TxFBvsVLkoQEkjysRMErs+MxXgw0lQIflSf5ri6eoAVBsAgCbKR4eIoqIGkqLT52VNPzSguaSwiQJ2gqs/CMVpsmQQvb2M8EqJ1YF1qgzsf9TRu5x0JRYKygIJTa7Lemq3RNWhGtgMpAGSqeXnNg5rEIlBJAFWVLNZKnSpC4NEWQd5uiBEtaAhcuYIuVOYPQZQdx+eFNn1wuT5WlzWxtbm5tbWUmYDzQHz93J6U1+fHZx3mxB8flnp6UO9eTW88dT+Bzf6osr+d+T0pKMsgnxTzeb0XZ6NguLwHnpMpOtYJ4a2tya1ls+rOIHZ2s5SV22SXv8kdlZWWXvzwe+/5F3rnrwH39cVkizhFFUpOSUo/O/uBUHuBUkiwxRD+tH3V/5HC5hO5zvUcWhsCx9991OIT/AVwXLXUhLDYVAAAAAElFTkSuQmCC"
 
 /***/ }),
-/* 856 */,
-/* 857 */,
-/* 858 */,
-/* 859 */,
-/* 860 */,
-/* 861 */,
-/* 862 */,
-/* 863 */,
-/* 864 */,
-/* 865 */,
-/* 866 */,
-/* 867 */,
-/* 868 */,
-/* 869 */,
-/* 870 */,
-/* 871 */,
-/* 872 */,
-/* 873 */,
-/* 874 */,
-/* 875 */,
-/* 876 */,
-/* 877 */,
-/* 878 */,
-/* 879 */,
-/* 880 */,
-/* 881 */,
-/* 882 */,
+/* 856 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 857 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 858 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 859 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 860 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 861 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 862 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 863 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 864 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 865 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 866 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 867 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 868 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 869 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 870 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 871 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 872 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 873 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 874 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 875 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 876 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 877 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 878 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 879 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 880 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 881 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 882 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 883 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(884);
 var fs = __webpack_require__(118);
 
 function Iterator(text) {
 	var pos = 0, length = text.length;
@@ -30959,21 +31310,21 @@ var _reactDom = __webpack_require__(4);
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
 var _devtoolsConfig = __webpack_require__(828);
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
-var _search = __webpack_require__(1210);
-
-var _prettyPrint = __webpack_require__(1213);
-
-var _parser = __webpack_require__(1208);
+var _search = __webpack_require__(1115);
+
+var _prettyPrint = __webpack_require__(903);
+
+var _parser = __webpack_require__(827);
 
 var _createStore = __webpack_require__(189);
 
 var _createStore2 = _interopRequireDefault(_createStore);
 
 var _reducers = __webpack_require__(227);
 
 var _reducers2 = _interopRequireDefault(_reducers);
@@ -31271,17 +31622,69 @@ function streamingWorkerHandler(publicIn
 
 module.exports = {
   WorkerDispatcher,
   workerHandler,
   streamingWorkerHandler
 };
 
 /***/ }),
-/* 903 */,
+/* 903 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.prettyPrint = exports.stopPrettyPrintWorker = exports.startPrettyPrintWorker = undefined;
+
+var prettyPrint = exports.prettyPrint = (() => {
+  var _ref = _asyncToGenerator(function* (_ref2) {
+    var source = _ref2.source,
+        url = _ref2.url;
+
+    var indent = 2;
+
+    (0, _assert2.default)((0, _source.isJavaScript)(source), "Can't prettify non-javascript files.");
+
+    return yield _prettyPrint({
+      url,
+      indent,
+      source: source.text
+    });
+  });
+
+  return function prettyPrint(_x) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
+var _devtoolsUtils = __webpack_require__(900);
+
+var _source = __webpack_require__(233);
+
+var _assert = __webpack_require__(223);
+
+var _assert2 = _interopRequireDefault(_assert);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
+
+
+var dispatcher = new WorkerDispatcher();
+var startPrettyPrintWorker = exports.startPrettyPrintWorker = dispatcher.start.bind(dispatcher);
+var stopPrettyPrintWorker = exports.stopPrettyPrintWorker = dispatcher.stop.bind(dispatcher);
+var _prettyPrint = dispatcher.task("prettyPrint");
+
+/***/ }),
 /* 904 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -31329,38 +31732,58 @@ function updatePreview(target, editor, _
 
     // We are mousing over a new token that is not in the preview
     if (!target.classList.contains("debug-expression")) {
       clearPreview();
     }
   }
 
   var invalidToken = tokenText === "" || tokenText.match(/[(){}\|&%,.;=<>\+-/\*\s]/);
-
   var invalidTarget = target.parentElement && !target.parentElement.closest(".CodeMirror-line") || cursorPos.top == 0;
-
   var isUpdating = preview && preview.updating;
-
   var inScope = linesInScope && linesInScope.includes(location.line);
 
-  var invaildType = target.className === "cm-string" || target.className === "cm-number" || target.className === "cm-atom";
-
-  if (invalidTarget || !inScope || isUpdating || invalidToken || invaildType) {
+  if (invalidTarget || !inScope || isUpdating || invalidToken) {
     return;
   }
 
   setPreview(tokenText, location, cursorPos);
 }
 
 /***/ }),
-/* 905 */,
-/* 906 */,
-/* 907 */,
-/* 908 */,
-/* 909 */,
+/* 905 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 906 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 907 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 908 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 909 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 910 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var SplitBox = __webpack_require__(911);
 
@@ -31375,17 +31798,17 @@ module.exports = SplitBox;
 
 var React = __webpack_require__(0);
 var ReactDOM = __webpack_require__(4);
 var Draggable = React.createFactory(__webpack_require__(912));
 var dom = React.DOM,
     PropTypes = React.PropTypes;
 
 
-__webpack_require__(1232);
+__webpack_require__(861);
 
 /**
  * This component represents a Splitter. The splitter supports vertical
  * as well as horizontal mode.
  */
 var SplitBox = React.createClass({
   propTypes: {
     // Custom class name. You can use more names separated by a space.
@@ -31678,19 +32101,34 @@ var Draggable = React.createClass({
       onMouseDown: this.startDragging
     });
   }
 });
 
 module.exports = Draggable;
 
 /***/ }),
-/* 913 */,
-/* 914 */,
-/* 915 */,
+/* 913 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 914 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 915 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 916 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */
 ;(function(root) {
 
 	/** Detect free variables */
 	var freeExports = typeof exports == 'object' && exports &&
@@ -32220,33 +32658,58 @@ module.exports = Draggable;
 		root.punycode = punycode;
 	}
 
 }(this));
 
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(793)(module), __webpack_require__(792)))
 
 /***/ }),
-/* 917 */,
-/* 918 */,
+/* 917 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 918 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 919 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1792 1792\"><path d=\"M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
 /* 920 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1792 1792\"><path d=\"M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
-/* 921 */,
-/* 922 */,
-/* 923 */,
+/* 921 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 922 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 923 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 924 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -32305,17 +32768,17 @@ module.exports = {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-__webpack_require__(1250);
+__webpack_require__(877);
 
 // Load all existing rep templates
 var Undefined = __webpack_require__(929);
 var Null = __webpack_require__(930);
 var StringRep = __webpack_require__(931);
 var LongStringRep = __webpack_require__(932);
 var Number = __webpack_require__(933);
 var ArrayRep = __webpack_require__(934);
@@ -33390,17 +33853,22 @@ maxLengthMap.set(MODE.LONG, 10);
 // Exports from this module
 module.exports = {
   rep: wrapRender(ArrayRep),
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
-/* 935 */,
+/* 935 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 936 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
@@ -35073,17 +35541,22 @@ function supportsObject(object) {
 
 // Exports from this module
 module.exports = {
   rep: wrapRender(ElementNode),
   supportsObject
 };
 
 /***/ }),
-/* 952 */,
+/* 952 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 953 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -35923,21 +36396,26 @@ module.exports = {
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
 /* 960 */
 /***/ (function(module, exports) {
 
-module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add conditional breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy link address\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n\n# LOCALIZATION NOTE (shortcuts.buttonName): text describing\n# keyboard shortcut button text\nshortcuts.buttonName=Keyboard shortcuts\n"
+module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add conditional breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy link address\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n"
 
 /***/ }),
 /* 961 */,
-/* 962 */,
+/* 962 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 963 */,
 /* 964 */,
 /* 965 */
 /***/ (function(module, exports) {
 
 
 /**
  * slice() reference.
@@ -38279,57 +38757,57 @@ var Tree = module.exports = createClass(
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getAndProcessFrames = getAndProcessFrames;
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _reselect = __webpack_require__(993);
 
 var _lodash = __webpack_require__(2);
 
 var _Frame = __webpack_require__(1013);
 
 var _Frame2 = _interopRequireDefault(_Frame);
 
-var _Group = __webpack_require__(1015);
-
-var _Group2 = _interopRequireDefault(_Group);
+var _Group2 = __webpack_require__(1015);
+
+var _Group3 = _interopRequireDefault(_Group2);
 
 var _WhyPaused = __webpack_require__(1120);
 
 var _WhyPaused2 = _interopRequireDefault(_WhyPaused);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _frame = __webpack_require__(1014);
 
 var _clipboard = __webpack_require__(423);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(1263);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+__webpack_require__(914);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var FrameComponent = (0, _react.createFactory)(_Frame2.default);
+
+var Group = (0, _react.createFactory)(_Group3.default);
 
 var NUM_FRAMES_SHOWN = 7;
 
 class Frames extends _react.Component {
 
   constructor() {
     super(...arguments);
 
@@ -38398,33 +38876,33 @@ class Frames extends _react.Component {
 
 
     var framesOrGroups = this.truncateFrames(this.collapseFrames(frames));
 
 
     return _react2.default.createElement(
       "ul",
       null,
-      framesOrGroups.map(frameOrGroup => frameOrGroup.id ? _react2.default.createElement(_Frame2.default, {
+      framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
         frame: frameOrGroup,
         toggleFrameworkGrouping: this.toggleFrameworkGrouping,
         copyStackTrace: this.copyStackTrace,
-        frameworkGroupingOn: frameworkGroupingOn,
-        selectFrame: selectFrame,
-        selectedFrame: selectedFrame,
-        toggleBlackBox: toggleBlackBox,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
         key: frameOrGroup.id
-      }) : _react2.default.createElement(_Group2.default, {
+      }) : Group({
         group: frameOrGroup,
         toggleFrameworkGrouping: this.toggleFrameworkGrouping,
         copyStackTrace: this.copyStackTrace,
-        frameworkGroupingOn: frameworkGroupingOn,
-        selectFrame: selectFrame,
-        selectedFrame: selectedFrame,
-        toggleBlackBox: toggleBlackBox,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
         key: frameOrGroup[0].id
       }))
     );
   }
 
   renderToggleButton(frames) {
     var buttonMessage = this.state.showAllFrames ? L10N.getStr("callStack.collapse") : L10N.getStr("callStack.expand");
 
@@ -38464,23 +38942,23 @@ class Frames extends _react.Component {
       this.renderFrames(frames),
       (0, _WhyPaused2.default)({ pause }),
       this.renderToggleButton(frames)
     );
   }
 }
 
 Frames.propTypes = {
-  frames: _propTypes2.default.array,
-  frameworkGroupingOn: _propTypes2.default.bool.isRequired,
-  toggleFrameworkGrouping: _propTypes2.default.func.isRequired,
-  selectedFrame: _propTypes2.default.object,
-  selectFrame: _propTypes2.default.func.isRequired,
-  toggleBlackBox: _propTypes2.default.func,
-  pause: _propTypes2.default.object
+  frames: _react.PropTypes.array,
+  frameworkGroupingOn: _react.PropTypes.bool.isRequired,
+  toggleFrameworkGrouping: _react.PropTypes.func.isRequired,
+  selectedFrame: _react.PropTypes.object,
+  selectFrame: _react.PropTypes.func.isRequired,
+  toggleBlackBox: _react.PropTypes.func,
+  pause: _react.PropTypes.object
 };
 
 function getSourceForFrame(sources, frame) {
   return (0, _selectors.getSourceInSources)(sources, frame.location.sourceId);
 }
 
 function appendSource(sources, frame) {
   return Object.assign({}, frame, {
@@ -38742,37 +39220,28 @@ function isAngular(frame) {
 function isRedux(frame) {
   return getFrameUrl(frame).match(/redux/i);
 }
 
 function isDojo(frame) {
   return getFrameUrl(frame).match(/dojo/i);
 }
 
-function isPreact(frame) {
-  return getFrameUrl(frame).match(/preact/i);
-}
-
 function getLibraryFromUrl(frame) {
   // @TODO each of these fns calls getFrameUrl, just call it once
   // (assuming there's not more complex logic to identify a lib)
 
   if (isBackbone(frame)) {
     return "Backbone";
   }
 
   if (isJQuery(frame)) {
     return "jQuery";
   }
 
-  // Needs to remain before "react", otherwise "react" can also match "preact"
-  if (isPreact(frame)) {
-    return "Preact";
-  }
-
   if (isReact(frame)) {
     return "React";
   }
 
   if (isWebpack(frame)) {
     return "Webpack";
   }
 
@@ -39002,67 +39471,70 @@ var _Svg = __webpack_require__(344);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _frame = __webpack_require__(1014);
 
 var _FrameMenu = __webpack_require__(1032);
 
 var _FrameMenu2 = _interopRequireDefault(_FrameMenu);
 
-__webpack_require__(1261);
+__webpack_require__(909);
 
 var _Frame = __webpack_require__(1013);
 
 var _Frame2 = _interopRequireDefault(_Frame);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
+var FrameComponent = (0, _react.createFactory)(_Frame2.default);
+
 function FrameLocation(_ref) {
   var frame = _ref.frame;
 
   var library = (0, _frame.getLibraryFromUrl)(frame);
   if (!library) {
     return null;
   }
 
   return _react2.default.createElement(
     "div",
     { className: "location" },
     library,
     _react2.default.createElement(_Svg2.default, { name: library.toLowerCase(), className: "annotation-logo" })
   );
 }
 
-
 FrameLocation.displayName = "FrameLocation";
 
 class Group extends _react.Component {
 
   constructor() {
     super(...arguments);
-
-    this.toggleFrames = () => {
-      this.setState({ expanded: !this.state.expanded });
-    };
-
     this.state = { expanded: false };
+    var self = this;
+
+    self.toggleFrames = this.toggleFrames.bind(this);
   }
 
   onContextMenu(event) {
     var _props = this.props,
         group = _props.group,
         copyStackTrace = _props.copyStackTrace,
         toggleFrameworkGrouping = _props.toggleFrameworkGrouping,
         toggleBlackBox = _props.toggleBlackBox,
         frameworkGroupingOn = _props.frameworkGroupingOn;
 
     var frame = group[0];
     (0, _FrameMenu2.default)(frame, frameworkGroupingOn, { copyStackTrace, toggleFrameworkGrouping, toggleBlackBox }, event);
   }
 
+  toggleFrames() {
+    this.setState({ expanded: !this.state.expanded });
+  }
+
   renderFrames() {
     var _props2 = this.props,
         group = _props2.group,
         selectFrame = _props2.selectFrame,
         selectedFrame = _props2.selectedFrame,
         toggleFrameworkGrouping = _props2.toggleFrameworkGrouping,
         frameworkGroupingOn = _props2.frameworkGroupingOn,
         toggleBlackBox = _props2.toggleBlackBox,
@@ -39071,27 +39543,27 @@ class Group extends _react.Component {
 
     if (!expanded) {
       return null;
     }
 
     return _react2.default.createElement(
       "div",
       { className: "frames-list" },
-      group.map(frame => _react2.default.createElement(_Frame2.default, {
-        copyStackTrace: copyStackTrace,
-        frame: frame,
-        frameworkGroupingOn: frameworkGroupingOn,
-        hideLocation: true,
+      group.map(frame => FrameComponent({
+        frame,
+        copyStackTrace,
+        toggleFrameworkGrouping,
+        frameworkGroupingOn,
+        selectFrame,
+        selectedFrame,
+        toggleBlackBox,
         key: frame.id,
-        selectedFrame: selectedFrame,
-        selectFrame: selectFrame,
-        shouldMapDisplayName: false,
-        toggleBlackBox: toggleBlackBox,
-        toggleFrameworkGrouping: toggleFrameworkGrouping
+        hideLocation: true,
+        shouldMapDisplayName: false
       }))
     );
   }
 
   renderDescription() {
     var frame = this.props.group[0];
     var displayName = (0, _frame.formatDisplayName)(frame);
     return _react2.default.createElement(
@@ -39244,17 +39716,17 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(1252);
+__webpack_require__(879);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var BracketArrow = (_ref) => {
   var orientation = _ref.orientation,
       left = _ref.left,
       top = _ref.top,
       bottom = _ref.bottom;
@@ -39778,17 +40250,17 @@ exports.clearPreview = clearPreview;
 exports.setPreview = setPreview;
 
 var _selectors = __webpack_require__(242);
 
 var _sources = __webpack_require__(254);
 
 var _promise = __webpack_require__(193);
 
-var _parser = __webpack_require__(1208);
+var _parser = __webpack_require__(827);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _utils = __webpack_require__(1206);
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function setSymbols(sourceId) {
@@ -40001,20 +40473,16 @@ function setPreview(token, tokenPos, cur
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
@@ -40025,17 +40493,17 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _ManagedTree = __webpack_require__(419);
 
 var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
 
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
-__webpack_require__(1238);
+__webpack_require__(866);
 
 var _sourcesTree = __webpack_require__(39);
 
 var _highlight = __webpack_require__(1184);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class TextSearch extends _react.Component {
@@ -40233,27 +40701,27 @@ class TextSearch extends _react.Componen
       ),
       this.renderResults()
     );
   }
 }
 
 exports.default = TextSearch;
 TextSearch.propTypes = {
-  sources: _propTypes2.default.object,
-  results: _propTypes2.default.array,
-  query: _propTypes2.default.string,
-  closeActiveSearch: _propTypes2.default.func,
-  searchSources: _propTypes2.default.func,
-  selectSource: _propTypes2.default.func,
-  searchBottomBar: _propTypes2.default.object
+  sources: _react.PropTypes.object,
+  results: _react.PropTypes.array,
+  query: _react.PropTypes.string,
+  closeActiveSearch: _react.PropTypes.func,
+  searchSources: _react.PropTypes.func,
+  selectSource: _react.PropTypes.func,
+  searchBottomBar: _react.PropTypes.object
 };
 
 TextSearch.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 /***/ }),
 /* 1065 */,
 /* 1066 */,
 /* 1067 */,
 /* 1068 */,
 /* 1069 */,
@@ -40297,17 +40765,41 @@ TextSearch.contextTypes = {
 /* 1107 */,
 /* 1108 */,
 /* 1109 */,
 /* 1110 */,
 /* 1111 */,
 /* 1112 */,
 /* 1113 */,
 /* 1114 */,
-/* 1115 */,
+/* 1115 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.findSourceMatches = exports.searchSources = exports.getMatches = exports.stopSearchWorker = exports.startSearchWorker = undefined;
+
+var _devtoolsUtils = __webpack_require__(900);
+
+var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
+
+
+var dispatcher = new WorkerDispatcher();
+var startSearchWorker = exports.startSearchWorker = dispatcher.start.bind(dispatcher);
+var stopSearchWorker = exports.stopSearchWorker = dispatcher.stop.bind(dispatcher);
+
+var getMatches = exports.getMatches = dispatcher.task("getMatches");
+var searchSources = exports.searchSources = dispatcher.task("searchSources");
+var findSourceMatches = exports.findSourceMatches = dispatcher.task("findSourceMatches");
+
+/***/ }),
 /* 1116 */,
 /* 1117 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 32 32\"><rect fill=\"#002f42\" width=\"16\" x=\"0\" y=\"28\" height=\"4\"></rect><rect fill=\"#0072b1\" width=\"16\" x=\"16\" y=\"28\" height=\"4\"></rect></svg>"
 
 /***/ }),
 /* 1118 */
@@ -40336,17 +40828,17 @@ exports.default = renderWhyPaused;
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _lodash = __webpack_require__(2);
 
 var _pause = __webpack_require__(255);
 
-__webpack_require__(1262);
+__webpack_require__(913);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderExceptionSummary(exception) {
   if ((0, _lodash.isString)(exception)) {
     return exception;
   }
 
@@ -40461,17 +40953,44 @@ function getInScopeLines(state) {
 /***/ }),
 /* 1125 */,
 /* 1126 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg enable-background=\"new 0 0 800 800\" id=\"GUIDE\" version=\"1.1\" viewBox=\"0 0 800 800\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><path d=\"M580.562,219.439c-12.721-12.723-29.637-19.728-47.623-19.728c-17.987,0-34.903,7.005-47.625,19.728 c-12.72,12.72-19.725,29.634-19.725,47.621c0,17.99,7.005,34.904,19.725,47.625c12.722,12.721,29.633,19.723,47.618,19.726 c0.007,0,0.007,0,0.007,0c17.986,0,34.902-7.005,47.623-19.726c12.721-12.723,19.726-29.636,19.726-47.625 C600.286,249.073,593.281,232.16,580.562,219.439z M553.771,287.895c-5.566,5.568-12.96,8.636-20.834,8.636l0,0 c-7.872-0.002-15.271-3.068-20.834-8.636c-5.566-5.562-8.633-12.96-8.633-20.834c0-7.868,3.065-15.269,8.633-20.834 c5.563-5.565,12.967-8.63,20.834-8.63c7.868,0,15.268,3.063,20.834,8.63C565.263,257.715,565.263,276.407,553.771,287.895z\" fill=\"#041C3F\"></path><g><path d=\"M62.282,627.218c-4.847,0-9.693-1.847-13.392-5.546c-7.398-7.397-7.398-19.395,0-26.79L158.42,485.35 c7.398-7.397,19.392-7.397,26.79,0s7.398,19.395,0,26.792L75.676,621.672C71.978,625.371,67.131,627.218,62.282,627.218z\" fill=\"#041C3F\"></path></g><g><path d=\"M86.774,732.172c-4.85,0-9.696-1.85-13.395-5.549c-7.398-7.397-7.398-19.389,0-26.786L187.545,585.67 c7.398-7.398,19.392-7.398,26.787,0c7.398,7.398,7.398,19.393,0,26.79L100.168,726.623C96.47,730.322,91.62,732.172,86.774,732.172 z\" fill=\"#041C3F\"></path></g><g><path d=\"M191.725,756.661c-4.849,0-9.696-1.847-13.395-5.546c-7.398-7.397-7.398-19.393,0-26.789L287.863,614.79 c7.396-7.394,19.392-7.396,26.787,0c7.398,7.397,7.398,19.395,0,26.793L205.12,751.115 C201.421,754.813,196.574,756.661,191.725,756.661z\" fill=\"#041C3F\"></path></g><path d=\"M751.113,48.891c-4.302-4.3-10.409-6.278-16.403-5.311c-2.202,0.357-54.705,8.98-126.25,36.316 c-41.974,16.034-81.85,35.237-118.529,57.076c-45.039,26.814-85.356,57.721-119.899,91.871l-143.055,27.85 c-3.693,0.718-7.086,2.524-9.753,5.177L87.618,391.06c-5.907,5.886-7.267,14.938-3.36,22.301c3.33,6.27,9.818,10.059,16.725,10.059 c1.202,0,2.415-0.114,3.628-0.347l146.185-28.463c-9.516,18.672-18.419,38.055-26.683,58.144 c-2.904,7.072-1.279,15.194,4.125,20.603l35.811,35.811l-33.27,33.27c-7.398,7.398-7.398,19.39,0,26.787 c3.699,3.699,8.545,5.549,13.397,5.549c4.847,0,9.693-1.85,13.392-5.546l33.27-33.271l35.811,35.813 c3.625,3.619,8.469,5.548,13.4,5.548c2.423,0,4.871-0.467,7.199-1.426c20.091-8.262,39.475-17.165,58.141-26.678l-28.455,146.186 c-1.593,8.183,2.35,16.443,9.709,20.352c2.806,1.488,5.852,2.213,8.879,2.213c4.917,0,9.778-1.918,13.417-5.573l129.188-129.604 c2.656-2.663,4.459-6.061,5.181-9.753l27.845-143.055c34.148-34.547,65.06-74.859,91.876-119.901 c21.834-36.683,41.04-76.558,57.077-118.529c27.33-71.551,35.958-124.048,36.313-126.25 C757.386,59.292,755.407,53.188,751.113,48.891z M158.393,374.001l81.489-81.224l87.674-17.069 c-19.015,23.391-36.655,48.634-52.847,75.648L158.393,374.001z M507.219,560.121l-81.222,81.489l22.643-116.316 c27.021-16.192,52.259-33.83,75.648-52.848L507.219,560.121z M684.359,178.936c-23.915,62.371-68.01,152.302-142.237,226.531 c-34.171,34.168-73.96,64.54-118.89,90.838c-0.804,0.401-1.585,0.854-2.322,1.366c-24.049,13.943-49.566,26.728-76.476,38.302 l-26.806-26.809l54.11-54.106c7.395-7.397,7.395-19.392,0-26.79c-7.398-7.397-19.392-7.396-26.79,0l-54.109,54.106l-26.806-26.809 c11.578-26.913,24.361-52.433,38.308-76.488c0.508-0.732,0.951-1.5,1.35-2.295c26.298-44.938,56.672-84.732,90.849-118.909 c74.225-74.225,164.156-118.319,226.527-142.235c37.897-14.537,70.522-23.601,92.09-28.797 C707.959,108.412,698.894,141.038,684.359,178.936z\" fill=\"#041C3F\"></path></svg>"
 
 /***/ }),
-/* 1127 */,
+/* 1127 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.containsPosition = containsPosition;
+exports.containsLocation = containsLocation;
+exports.nodeContainsPosition = nodeContainsPosition;
+function containsPosition(a, b) {
+  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
+  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
+
+  return startsBefore && endsAfter;
+}
+
+function containsLocation(a, b) {
+  return containsPosition(a, b.start) && containsPosition(a, b.end);
+}
+
+function nodeContainsPosition(node, position) {
+  return containsPosition(node.loc, position);
+}
+
+/***/ }),
 /* 1128 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -40503,17 +41022,17 @@ var _require = __webpack_require__(830),
     Menu = _require.Menu,
     MenuItem = _require.MenuItem;
 
 function inToolbox() {
   return window.parent.document.documentURI == "about:devtools-toolbox";
 }
 
 if (!inToolbox()) {
-  __webpack_require__(1224);
+  __webpack_require__(854);
 }
 
 function createPopup(doc) {
   var popup = doc.createElement("menupopup");
   popup.className = "landing-popup";
   if (popup.openPopupAtScreen) {
     return popup;
   }
@@ -41174,31 +41693,113 @@ function createSyncData(pendingBreakpoin
   var overrides = _extends({}, pendingBreakpoint, { generatedLocation });
   var breakpoint = (0, _breakpoint.createBreakpoint)(location, overrides);
 
   (0, _breakpoint.assertBreakpoint)(breakpoint);
   return { breakpoint, previousLocation };
 }
 
 /***/ }),
-/* 1138 */,
+/* 1138 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = buildQuery;
+
+var _escapeRegExp = __webpack_require__(259);
+
+var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function ignoreWhiteSpace(str) {
+  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
+  );
+}
+
+
+function wholeMatch(query, wholeWord) {
+  if (query === "" || !wholeWord) {
+    return query;
+  }
+
+  return `\\b${query}\\b`;
+}
+
+function buildFlags(caseSensitive, isGlobal) {
+  if (caseSensitive && isGlobal) {
+    return "g";
+  }
+
+  if (!caseSensitive && isGlobal) {
+    return "gi";
+  }
+
+  if (!caseSensitive && !isGlobal) {
+    return "i";
+  }
+
+  return;
+}
+
+function buildQuery(originalQuery, modifiers, _ref) {
+  var _ref$isGlobal = _ref.isGlobal,
+      isGlobal = _ref$isGlobal === undefined ? false : _ref$isGlobal,
+      _ref$ignoreSpaces = _ref.ignoreSpaces,
+      ignoreSpaces = _ref$ignoreSpaces === undefined ? false : _ref$ignoreSpaces;
+  var caseSensitive = modifiers.caseSensitive,
+      regexMatch = modifiers.regexMatch,
+      wholeWord = modifiers.wholeWord;
+
+
+  if (originalQuery === "") {
+    return new RegExp(originalQuery);
+  }
+
+  var query = originalQuery;
+  if (ignoreSpaces) {
+    query = ignoreWhiteSpace(query);
+  }
+
+  if (!regexMatch) {
+    query = (0, _escapeRegExp2.default)(query);
+  }
+
+  query = wholeMatch(query, wholeWord);
+  var flags = buildFlags(caseSensitive, isGlobal);
+
+  if (flags) {
+    return new RegExp(query, flags);
+  }
+
+  return new RegExp(query);
+}
+
+/***/ }),
 /* 1139 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -41217,17 +41818,17 @@ var _SourceSearch2 = _interopRequireDefa
 var _ToggleSearch = __webpack_require__(284);
 
 var _ToggleSearch2 = _interopRequireDefault(_ToggleSearch);
 
 var _prefs = __webpack_require__(226);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(1242);
+__webpack_require__(869);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ProjectSearch extends _react.Component {
 
   constructor(props) {
     super(props);
 
@@ -41344,31 +41945,31 @@ class ProjectSearch extends _react.Compo
       "div",
       { className: "search-container" },
       this.isProjectSearchEnabled() ? this.renderTextSearch() : this.renderSourceSearch()
     );
   }
 }
 
 ProjectSearch.propTypes = {
-  sources: _propTypes2.default.object.isRequired,
-  results: _propTypes2.default.object,
-  textSearchQuery: _propTypes2.default.string,
-  setActiveSearch: _propTypes2.default.func.isRequired,
-  closeActiveSearch: _propTypes2.default.func.isRequired,
-  searchSources: _propTypes2.default.func,
-  activeSearch: _propTypes2.default.string,
-  selectSource: _propTypes2.default.func.isRequired,
-  sourceSearchQuery: _propTypes2.default.string,
-  setSourceSearchQuery: _propTypes2.default.func,
-  clearSourceSearchQuery: _propTypes2.default.func
+  sources: _react.PropTypes.object.isRequired,
+  results: _react.PropTypes.object,
+  textSearchQuery: _react.PropTypes.string,
+  setActiveSearch: _react.PropTypes.func.isRequired,
+  closeActiveSearch: _react.PropTypes.func.isRequired,
+  searchSources: _react.PropTypes.func,
+  activeSearch: _react.PropTypes.string,
+  selectSource: _react.PropTypes.func.isRequired,
+  sourceSearchQuery: _react.PropTypes.string,
+  setSourceSearchQuery: _react.PropTypes.func,
+  clearSourceSearchQuery: _react.PropTypes.func
 };
 
 ProjectSearch.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearch)(state),
   results: (0, _selectors.getTextSearchResults)(state),
   textSearchQuery: (0, _selectors.getTextSearchQuery)(state),
   sourceSearchQuery: (0, _selectors.getSourceSearchQuery)(state)
@@ -41381,20 +41982,16 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _source = __webpack_require__(233);
 
 var _utils = __webpack_require__(234);
 
@@ -41436,17 +42033,17 @@ class SourceSearch extends _react.Compon
       },
       searchBottomBar
     );
   }
 }
 
 exports.default = SourceSearch;
 SourceSearch.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 /***/ }),
 /* 1142 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -41468,17 +42065,17 @@ var _text = __webpack_require__(389);
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _devtoolsConfig = __webpack_require__(828);
 
-__webpack_require__(1243);
+__webpack_require__(870);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Outline = __webpack_require__(1145);
 
 var _Outline2 = _interopRequireDefault(_Outline);
@@ -41714,17 +42311,17 @@ var _redux = __webpack_require__(3);
 var _reactRedux = __webpack_require__(1189);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(1244);
+__webpack_require__(871);
 
 var _PreviewFunction = __webpack_require__(798);
 
 var _PreviewFunction2 = _interopRequireDefault(_PreviewFunction);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Outline extends _react.Component {
@@ -41816,17 +42413,17 @@ var _redux = __webpack_require__(3);
 var _react = __webpack_require__(0);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
-__webpack_require__(1256);
+__webpack_require__(1161);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class EmptyLines extends _react.Component {
 
   componentDidMount() {
     this.disableEmptyLines();
   }
@@ -41887,20 +42484,16 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
@@ -42013,17 +42606,18 @@ class SourcesTree extends _react.Compone
     // state of ManagedTree, because it depends on item instances
     // being the same. The result is that if a source is added at a
     // later time, all expanded state is lost.
     var sourceTree = this.state.sourceTree;
     if (newSet.size > 0) {
       for (var source of newSet) {
         (0, _sourcesTree.addToTree)(uncollapsedTree, source, this.props.debuggeeUrl);
       }
-      sourceTree = (0, _sourcesTree.collapseTree)(uncollapsedTree);
+      var unsortedTree = (0, _sourcesTree.collapseTree)(uncollapsedTree);
+      sourceTree = (0, _sourcesTree.sortEntireTree)(unsortedTree, nextProps.debuggeeUrl);
     }
 
     this.setState({
       uncollapsedTree,
       sourceTree,
       parentMap: (0, _sourcesTree.createParentMap)(sourceTree)
     });
   }
@@ -42034,17 +42628,17 @@ class SourcesTree extends _react.Compone
 
   selectItem(item) {
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       this.props.selectSource(item.contents.get("id"));
     }
   }
 
   getIcon(item, depth) {
-    if (item.path === "/Webpack") {
+    if (item.path === "/webpack://") {
       return _react2.default.createElement(_Svg2.default, { name: "webpack" });
     }
 
     if (depth === 0) {
       return _react2.default.createElement(_Svg2.default, { name: "domain" });
     }
 
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
@@ -42077,38 +42671,39 @@ class SourcesTree extends _react.Compone
     }
 
     (0, _devtoolsLaunchpad.showMenu)(event, menuOptions);
   }
 
   renderItem(item, depth, focused, _, expanded, _ref) {
     var setExpanded = _ref.setExpanded;
 
-    var arrow = (0, _sourcesTree.nodeHasChildren)(item) ? _react2.default.createElement(_Svg2.default, {
+    var arrow = _react2.default.createElement(_Svg2.default, {
       name: "arrow",
       className: (0, _classnames2.default)({
-        expanded: expanded
+        expanded: expanded,
+        hidden: !(0, _sourcesTree.nodeHasChildren)(item)
       }),
       onClick: e => {
         e.stopPropagation();
         setExpanded(item, !expanded);
       }
-    }) : _react2.default.createElement("i", { className: "no-arrow" });
+    });
 
     var icon = this.getIcon(item, depth);
     var paddingDir = "paddingRight";
     if (document.body && document.body.parentElement) {
       paddingDir = document.body.parentElement.dir == "ltr" ? "paddingLeft" : "paddingRight";
     }
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("node", { focused }),
-        style: { [paddingDir]: `${depth * 15 + 5}px` },
+        style: { [paddingDir]: `${depth * 15}px` },
         key: item.path,
         onClick: () => {
           this.selectItem(item);
           setExpanded(item, !expanded);
         },
         onContextMenu: e => this.onContextMenu(e, item)
       },
       arrow,
@@ -42175,22 +42770,22 @@ class SourcesTree extends _react.Compone
       { className: "sources-list", onKeyDown: onKeyDown },
       tree
     );
   }
 }
 
 SourcesTree.propTypes = {
   sources: _reactImmutableProptypes2.default.map.isRequired,
-  selectSource: _propTypes2.default.func.isRequired,
-  shownSource: _propTypes2.default.string,
+  selectSource: _react.PropTypes.func.isRequired,
+  shownSource: _react.PropTypes.string,
   selectedSource: _reactImmutableProptypes2.default.map,
-  debuggeeUrl: _propTypes2.default.string.isRequired,
-  setExpandedState: _propTypes2.default.func,
-  expanded: _propTypes2.default.any
+  debuggeeUrl: _react.PropTypes.string.isRequired,
+  setExpandedState: _react.PropTypes.func,
+  expanded: _react.PropTypes.any
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     shownSource: (0, _selectors.getShownSource)(state),
     selectedSource: (0, _selectors.getSelectedSource)(state),
     debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state),
     expanded: (0, _selectors.getExpandedState)(state)
@@ -42208,17 +42803,17 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.Workers = undefined;
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(1265);
+__webpack_require__(1162);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _selectors = __webpack_require__(242);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Workers extends _react.PureComponent {
@@ -42322,17 +42917,17 @@ module.exports = "<!-- This Source Code 
 
 var _require = __webpack_require__(0),
     Component = _require.Component,
     createFactory = _require.createFactory,
     dom = _require.DOM,
     PropTypes = _require.PropTypes;
 
 var Tree = createFactory(__webpack_require__(1007).Tree);
-__webpack_require__(1251);
+__webpack_require__(878);
 
 var classnames = __webpack_require__(175);
 var Svg = __webpack_require__(1151);
 
 var _require2 = __webpack_require__(926),
     _require2$REPS = _require2.REPS,
     Rep = _require2$REPS.Rep,
     Grip = _require2$REPS.Grip;
@@ -43509,18 +44104,28 @@ exports.default = (0, _reactRedux.connec
     selectedSource,
     callSites: getCallSites(symbols, breakpoints),
     breakpoints: breakpoints
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(CallSites);
 
 /***/ }),
 /* 1160 */,
-/* 1161 */,
-/* 1162 */,
+/* 1161 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 1162 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 1163 */,
 /* 1164 */,
 /* 1165 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -43564,44 +44169,47 @@ module.exports = networkRequest;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(257);
 
-__webpack_require__(1255);
+__webpack_require__(882);
 
 class CallSite extends _react.Component {
 
   constructor() {
     super();
 
-    this.addCallSite = nextProps => {
-      var _ref = nextProps || this.props,
-          editor = _ref.editor,
-          callSite = _ref.callSite,
-          breakpoint = _ref.breakpoint,
-          source = _ref.source;
-
-      var className = !breakpoint ? "call-site" : "call-site-bp";
-      var sourceId = source.get("id");
-      var editorRange = (0, _editor.toEditorRange)(sourceId, callSite.location);
-      this.marker = (0, _editor.markText)(editor, className, editorRange);
-    };
-
-    this.clearCallSite = () => {
-      if (this.marker) {
-        this.marker.clear();
-        this.marker = null;
-      }
-    };
-
     this.marker = undefined;
+    var self = this;
+    self.addCallSite = this.addCallSite.bind(this);
+    self.clearCallSite = this.clearCallSite.bind(this);
+  }
+
+  addCallSite(nextProps) {
+    var _ref = nextProps || this.props,
+        editor = _ref.editor,
+        callSite = _ref.callSite,
+        breakpoint = _ref.breakpoint,
+        source = _ref.source;
+
+    var className = !breakpoint ? "call-site" : "call-site-bp";
+    var sourceId = source.get("id");
+    var editorRange = (0, _editor.toEditorRange)(sourceId, callSite.location);
+    this.marker = (0, _editor.markText)(editor, className, editorRange);
+  }
+
+  clearCallSite() {
+    if (this.marker) {
+      this.marker.clear();
+      this.marker = null;
+    }
   }
 
   shouldComponentUpdate(nextProps) {
     return this.props.editor !== nextProps.editor;
   }
 
   componentDidMount() {
     var _props = this.props,
@@ -43798,55 +44406,63 @@ module.exports = {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.findFunctionText = findFunctionText;
 
 var _astBreakpointLocation = __webpack_require__(804);
 
-var _indentation = __webpack_require__(1214);
-
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
+function getIndentation(lines) {
+  var firstLine = lines[0];
+  var secondLine = lines[1];
+  var lastLine = lines[lines.length - 1];
+
+  var _getIndentation = line => line && line.match(/^\s*/)[0].length;
+
+  var indentations = [_getIndentation(firstLine), _getIndentation(secondLine), _getIndentation(lastLine)];
+
+  return Math.max.apply(Math, indentations.concat([0]));
+}
+
 function findFunctionText(line, source, symbols) {
   var func = (0, _astBreakpointLocation.findClosestScope)(symbols.functions, { line, column: Infinity });
   if (!func) {
     return null;
   }
 
   var _func$location = func.location,
       start = _func$location.start,
       end = _func$location.end;
 
   var lines = source.text.split("\n");
   var firstLine = lines[start.line - 1].slice(start.column);
   var lastLine = lines[end.line - 1].slice(0, end.column);
   var middle = lines.slice(start.line, end.line - 1);
-  var functionText = [firstLine].concat(_toConsumableArray(middle), [lastLine]).join("\n");
-  var indentedFunctionText = (0, _indentation.correctIndentation)(functionText);
-
-  return indentedFunctionText;
+  var functionLines = [firstLine].concat(_toConsumableArray(middle), [lastLine]);
+
+  var indentation = getIndentation(functionLines);
+  var formattedLines = functionLines.map(_line => _line.replace(new RegExp(`^\\s{0,${indentation - 1}}`), ""));
+
+  return formattedLines.join("\n").trim();
 }
 
 /***/ }),
 /* 1170 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _propTypes = __webpack_require__(20);
-
-var _propTypes2 = _interopRequireDefault(_propTypes);
-
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -43867,17 +44483,17 @@ var _Modal2 = _interopRequireDefault(_Mo
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _ResultList = __webpack_require__(383);
 
 var _ResultList2 = _interopRequireDefault(_ResultList);
 
-__webpack_require__(1271);
+__webpack_require__(962);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function formatSymbol(symbol) {
   return {
     id: `${symbol.name}:${symbol.location.start.line}`,
     title: symbol.name,
     subtitle: `:${symbol.location.start.line}`,
@@ -43885,167 +44501,117 @@ function formatSymbol(symbol) {
     location: symbol.location
   };
 }
 
 class SymbolModal extends _react.Component {
 
   constructor(props) {
     super(props);
-
-    this.onClick = e => {
-      e.stopPropagation();
-    };
-
-    this.onChange = e => {
-      var selectedSource = this.props.selectedSource;
-
-      if (!selectedSource || !selectedSource.get("text")) {
-        return;
-      }
-
-      this.setState({ query: e.target.value });
-      return this.updateResults(e.target.value);
-    };
-
-    this.closeModal = () => {
-      this.props.closeActiveSearch();
-      this.props.clearHighlightLineRange();
-    };
-
-    this.selectResultItem = (e, item) => {
-      var _props = this.props,
-          selectSource = _props.selectSource,
-          selectedSource = _props.selectedSource;
-
-
-      if (!selectedSource || !item) {
-        return;
-      }
-
-      selectSource(selectedSource.get("id"), {
-        line: item.location.start.line
-      });
-
-      this.closeModal();
-    };
-
-    this.updateResults = query => {
-      var _props2 = this.props,
-          symbolType = _props2.symbolType,
-          symbols = _props2.symbols;
-
-
-      var symbolSearchResults = symbols[symbolType];
-      if (query == "") {
-        this.setState({ results: symbolSearchResults });
-        return;
-      }
-
-      symbolSearchResults = (0, _fuzzaldrinPlus.filter)(symbolSearchResults, query, {
-        key: "value"
-      });
-
-      this.setState({ results: symbolSearchResults });
-    };
-
-    this.traverseResults = direction => {
-      var _state = this.state,
-          resultsIndex = _state.resultsIndex,
-          results = _state.results;
-
-      var resultCount = this.resultsCount();
-      var index = resultsIndex + direction;
-      var nextIndex = (index + resultCount) % resultCount;
-
-      this.setState({ resultsIndex: nextIndex });
-
-      if (results) {
-        this.onSelectResultItem(results[nextIndex]);
-      }
-    };
-
-    this.onKeyUp = e => {
-      e.preventDefault();
-      var enabled = this.props.enabled;
-      var _state2 = this.state,
-          results = _state2.results,
-          resultsIndex = _state2.resultsIndex;
-
-
-      if (!enabled || !results) {
-        return;
-      }
-
-      if (e.key === "ArrowUp") {
-        this.traverseResults(-1);
-      } else if (e.key === "ArrowDown") {
-        this.traverseResults(1);
-      } else if (e.key === "Enter") {
-        this.selectResultItem(e, results[resultsIndex]);
-        this.closeModal();
-      } else if (e.key === "Tab") {
-        this.closeModal();
-      }
-    };
-
-    this.renderResults = () => {
-      var _state3 = this.state,
-          resultsIndex = _state3.resultsIndex,
-          results = _state3.results;
-      var enabled = this.props.enabled;
-
-      if (!enabled || !results) {
-        return null;
-      }
-
-      return _react2.default.createElement(_ResultList2.default, {
-        key: "results",
-        items: results,
-        selected: resultsIndex,
-        selectItem: this.selectResultItem,
-        ref: "resultList"
-      });
-    };
-
-    this.buildSummaryMsg = () => {
-      var resultsIndex = this.state.resultsIndex;
-
-      var count = this.resultsCount();
-
-      if (count > 1) {
-        return L10N.getFormatStr("editor.searchResults", resultsIndex + 1, count);
-      } else if (count === 1) {
-        return L10N.getFormatStr("editor.singleResult");
-      }
-    };
-
-    this.buildPlaceHolder = () => {
-      var symbolType = this.props.symbolType;
-
-      return L10N.getFormatStr(`symbolSearch.search.${symbolType}Placeholder`);
-    };
-
     this.state = { results: null, query: "", resultsIndex: 0 };
+
+    var self = this;
+    self.onClick = this.onClick.bind(this);
+    self.closeModal = this.closeModal.bind(this);
+    self.onChange = this.onChange.bind(this);
+    self.onKeyUp = this.onKeyUp.bind(this);
+    self.updateResults = this.updateResults.bind(this);
+    self.traverseResults = this.traverseResults.bind(this);
+    self.renderResults = this.renderResults.bind(this);
+    self.buildSummaryMsg = this.buildSummaryMsg.bind(this);
+    self.buildPlaceHolder = this.buildPlaceHolder.bind(this);
+    self.selectResultItem = this.selectResultItem.bind(this);
   }
 
   componentDidMount() {
     this.updateResults(this.state.query);
   }
 
   componentDidUpdate(prevProps, prevState) {
     if (this.refs.resultList && this.refs.resultList.refs) {
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.resultsIndex);
     }
 
     if (!prevProps.enabled && this.props.enabled) {
       this.updateResults(this.state.query);
     }
   }
 
+  onClick(e) {
+    e.stopPropagation();
+  }
+
+  onChange(e) {
+    var selectedSource = this.props.selectedSource;
+
+    if (!selectedSource || !selectedSource.get("text")) {
+      return;
+    }
+
+    this.setState({ query: e.target.value });
+    return this.updateResults(e.target.value);
+  }
+
+  closeModal() {
+    this.props.closeActiveSearch();
+    this.props.clearHighlightLineRange();
+  }
+
+  selectResultItem(e, item) {
+    var _props = this.props,
+        selectSource = _props.selectSource,
+        selectedSource = _props.selectedSource;
+
+
+    if (!selectedSource || !item) {
+      return;
+    }
+
+    selectSource(selectedSource.get("id"), {
+      line: item.location.start.line
+    });
+
+    this.closeModal();
+  }
+
+  updateResults(query) {
+    var _props2 = this.props,
+        symbolType = _props2.symbolType,
+        symbols = _props2.symbols;
+
+
+    var symbolSearchResults = symbols[symbolType];
+    if (query == "") {
+      this.setState({ results: symbolSearchResults });
+      return;
+    }
+
+    symbolSearchResults = (0, _fuzzaldrinPlus.filter)(symbolSearchResults, query, {
+      key: "value"
+    });
+
+    this.setState({ results: symbolSearchResults });
+  }
+
+  traverseResults(direction) {
+    var _state = this.state,
+        resultsIndex = _state.resultsIndex,
+        results = _state.results;
+
+    var resultCount = this.resultsCount();
+    var index = resultsIndex + direction;
+    var nextIndex = (index + resultCount) % resultCount;
+
+    this.setState({ resultsIndex: nextIndex });
+
+    if (results) {
+      this.onSelectResultItem(results[nextIndex]);
+    }
+  }
+
   onSelectResultItem(item) {
     var _props3 = this.props,
         selectSource = _props3.selectSource,
         selectedSource = _props3.selectedSource,
         symbolType = _props3.symbolType,
         highlightLineRange = _props3.highlightLineRange;
 
 
@@ -44059,16 +44625,59 @@ class SymbolModal extends _react.Compone
       highlightLineRange({
         start: item.location.start.line,
         end: item.location.end.line,
         sourceId: selectedSource.get("id")
       });
     }
   }
 
+  onKeyUp(e) {
+    e.preventDefault();
+    var enabled = this.props.enabled;
+    var _state2 = this.state,
+        results = _state2.results,
+        resultsIndex = _state2.resultsIndex;
+
+
+    if (!enabled || !results) {
+      return;
+    }
+
+    if (e.key === "ArrowUp") {
+      this.traverseResults(-1);
+    } else if (e.key === "ArrowDown") {
+      this.traverseResults(1);
+    } else if (e.key === "Enter") {
+      this.selectResultItem(e, results[resultsIndex]);
+      this.closeModal();
+    } else if (e.key === "Tab") {
+      this.closeModal();
+    }
+  }
+
+  renderResults() {
+    var _state3 = this.state,
+        resultsIndex = _state3.resultsIndex,
+        results = _state3.results;
+    var enabled = this.props.enabled;
+
+    if (!enabled || !results) {
+      return null;
+    }
+
+    return _react2.default.createElement(_ResultList2.default, {
+      key: "results",
+      items: results,
+      selected: resultsIndex,
+      selectItem: this.selectResultItem,
+      ref: "resultList"
+    });
+  }
+
   renderInput() {
     var query = this.state.query;
 
 
     return _react2.default.createElement(
       "div",
       { key: "input", className: "input-wrapper" },
       _react2.default.createElement(_SearchInput2.default, {
@@ -44080,20 +44689,38 @@ class SymbolModal extends _react.Compone
         onKeyUp: this.onKeyUp,
         handleNext: () => this.traverseResults(1),
         handlePrev: () => this.traverseResults(-1),
         handleClose: this.closeModal
       })
     );
   }
 
+  buildSummaryMsg() {
+    var resultsIndex = this.state.resultsIndex;
+
+    var count = this.resultsCount();
+
+    if (count > 1) {
+      return L10N.getFormatStr("editor.searchResults", resultsIndex + 1, count);
+    } else if (count === 1) {
+      return L10N.getFormatStr("editor.singleResult");
+    }
+  }
+
   resultsCount() {
     return this.state.results ? this.state.results.length : 0;
   }
 
+  buildPlaceHolder() {
+    var symbolType = this.props.symbolType;
+
+    return L10N.getFormatStr(`symbolSearch.search.${symbolType}Placeholder`);
+  }
+
   render() {
     var enabled = this.props.enabled;
 
 
     if (!enabled) {
       return null;
     }
 
@@ -44102,17 +44729,17 @@ class SymbolModal extends _react.Compone
       { "in": enabled, handleClose: this.closeModal },
       this.renderInput(),
       this.renderResults()
     );
   }
 }
 
 SymbolModal.contextTypes = {
-  shortcuts: _propTypes2.default.object
+  shortcuts: _react.PropTypes.object
 };
 
 function _getFormattedSymbols(state, source) {
   if (!source) {
     return { variables: [], functions: [] };
   }
 
   var _getSymbols = (0, _selectors.getSymbols)(state, source.toJS()),
@@ -44322,39 +44949,38 @@ function getExpandedState(state) {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.sanitizeInput = sanitizeInput;
 exports.wrapExpression = wrapExpression;
 exports.getValue = getValue;
 
-var _indentation = __webpack_require__(1214);
 
 // replace quotes and slashes that could interfere with the evaluation.
 function sanitizeInput(input) {
   return input.replace(/\\/g, "\\\\").replace(/"/g, "\\$&");
 }
 
 /*
  * wrap the expression input in a try/catch so that it can be safely
  * evaluated.
  *
  * NOTE: we add line after the expression to protect against comments.
 */
 
 
 function wrapExpression(input) {
-  return (0, _indentation.correctIndentation)(`
+  return `eval(\`
     try {
       ${sanitizeInput(input)}
     } catch (e) {
       e
     }
-  `);
+  \`)`.trim();
 }
 
 function getValue(expression) {
   var value = expression.value;
   if (!value) {
     return {
       path: expression.from,
       value: { unavailable: true }
@@ -44503,17 +45129,17 @@ var _Modal = __webpack_require__(332);
 var _Modal2 = _interopRequireDefault(_Modal);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _text = __webpack_require__(389);
 
-__webpack_require__(1227);
+__webpack_require__(1182);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class ShortcutsModal extends _react.Component {
 
   renderPrettyCombos(combo) {
     return combo.split(" ").map(c => _react2.default.createElement(
       "span",
@@ -44623,20 +45249,27 @@ class ShortcutsModal extends _react.Comp
         "in": enabled,
         additionalClass: "shortcuts-modal",
         handleClose: this.props.handleClose
       },
       this.renderShortcutsContent()
     );
   }
 }
+
 exports.ShortcutsModal = ShortcutsModal;
-
-/***/ }),
-/* 1182 */,
+ShortcutsModal.displayName = "ShortcutsModal";
+
+/***/ }),
+/* 1182 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 1183 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 18.200781 11.335548\" id=\"svg2\" version=\"1.1\" inkscape:version=\"0.91 r13725\" sodipodi:docname=\"shortcut.svg\" style=\"fill:#000000\"><path d=\"m -0.90376632,-5.8726701 24.00000032,0 0,24.0000001 -24.00000032,0 z\" id=\"path6\" inkscape:connector-curvature=\"0\" style=\"fill:none\"></path><path id=\"path4160\" style=\"font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:-1.55000007px;word-spacing:0px;fill:#241f1c;fill-opacity:1;stroke:#241f1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"m 0.2,0.2 0,10.935547 1.4785157,0 0,-5.2675782 5.2519531,5.2675782 1.9472656,0 L 3.0632813,5.2976562 8.4910157,0.2 6.5867188,0.2 1.6785157,4.8210938 1.6785157,0.2 Z m 12.490235,0.8840675 0,4.078125 -4.0800787,0 0,1.2460938 4.0800787,0 0,4.0800777 1.230468,0 0,-4.0800777 4.080078,0 0,-1.2460938 -4.080078,0 0,-4.078125 z\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ccccccccccccccccccccccccc\"></path></svg>"
 
 /***/ }),
 /* 1184 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -44703,17 +45336,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-__webpack_require__(1215);
+__webpack_require__(918);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function debugBtn(onClick, type, className, tooltip) {
   var disabled = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
 
   var props = {
     onClick,
@@ -44728,17 +45361,17 @@ function debugBtn(onClick, type, classNa
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
     _react2.default.createElement(_Svg2.default, { name: type })
   );
 }
 
 class UtilsBar extends _react.Component {
 
   renderUtilButtons() {
-    return [debugBtn(this.props.toggleShortcutsModal, "shortcut", "active", L10N.getStr("shortcuts.buttonName"), false)];
+    return [debugBtn(this.props.toggleShortcutsModal, "shortcut", "active", "shortcuts", false)];
   }
 
   render() {
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("command-bar bottom", {
           vertical: !this.props.horizontal
@@ -46111,692 +46744,11 @@ function replaceOriginalVariableName(exp
   // with found generated name.
   const generatedName = foundScope.bindings[originalName];
   const expressionWoOriginalName = expression.substring(originalName.length);
   return `${generatedName}${expressionWoOriginalName}`;
 }
 
 module.exports = { replaceOriginalVariableName };
 
-/***/ }),
-/* 1207 */,
-/* 1208 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.hasSyntaxError = exports.clearSources = exports.setSource = exports.hasSource = exports.getEmptyLines = exports.getNextStep = exports.clearASTs = exports.clearScopes = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getScopes = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
-
-var _devtoolsUtils = __webpack_require__(900);
-
-var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
-
-
-var dispatcher = new WorkerDispatcher();
-var startParserWorker = exports.startParserWorker = dispatcher.start.bind(dispatcher);
-var stopParserWorker = exports.stopParserWorker = dispatcher.stop.bind(dispatcher);
-
-var getClosestExpression = exports.getClosestExpression = dispatcher.task("getClosestExpression");
-var getSymbols = exports.getSymbols = dispatcher.task("getSymbols");
-var getScopes = exports.getScopes = dispatcher.task("getScopes");
-var getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
-var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
-var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
-var clearScopes = exports.clearScopes = dispatcher.task("clearScopes");
-var clearASTs = exports.clearASTs = dispatcher.task("clearASTs");
-var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
-var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
-var hasSource = exports.hasSource = dispatcher.task("hasSource");
-var setSource = exports.setSource = dispatcher.task("setSource");
-var clearSources = exports.clearSources = dispatcher.task("clearSources");
-var hasSyntaxError = exports.hasSyntaxError = dispatcher.task("hasSyntaxError");
-
-/***/ }),
-/* 1209 */,
-/* 1210 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.findSourceMatches = exports.searchSources = exports.getMatches = exports.stopSearchWorker = exports.startSearchWorker = undefined;
-
-var _devtoolsUtils = __webpack_require__(900);
-
-var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
-
-
-var dispatcher = new WorkerDispatcher();
-var startSearchWorker = exports.startSearchWorker = dispatcher.start.bind(dispatcher);
-var stopSearchWorker = exports.stopSearchWorker = dispatcher.stop.bind(dispatcher);
-
-var getMatches = exports.getMatches = dispatcher.task("getMatches");
-var searchSources = exports.searchSources = dispatcher.task("searchSources");
-var findSourceMatches = exports.findSourceMatches = dispatcher.task("findSourceMatches");
-
-/***/ }),
-/* 1211 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = buildQuery;
-
-var _escapeRegExp = __webpack_require__(259);
-
-var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Ignore doing outline matches for less than 3 whitespaces
- *
- * @memberof utils/source-search
- * @static
- */
-function ignoreWhiteSpace(str) {
-  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
-  );
-}
-
-
-function wholeMatch(query, wholeWord) {
-  if (query === "" || !wholeWord) {
-    return query;
-  }
-
-  return `\\b${query}\\b`;
-}
-
-function buildFlags(caseSensitive, isGlobal) {
-  if (caseSensitive && isGlobal) {
-    return "g";
-  }
-
-  if (!caseSensitive && isGlobal) {
-    return "gi";
-  }
-
-  if (!caseSensitive && !isGlobal) {
-    return "i";
-  }
-
-  return;
-}
-
-function buildQuery(originalQuery, modifiers, _ref) {
-  var _ref$isGlobal = _ref.isGlobal,
-      isGlobal = _ref$isGlobal === undefined ? false : _ref$isGlobal,
-      _ref$ignoreSpaces = _ref.ignoreSpaces,
-      ignoreSpaces = _ref$ignoreSpaces === undefined ? false : _ref$ignoreSpaces;
-  var caseSensitive = modifiers.caseSensitive,
-      regexMatch = modifiers.regexMatch,
-      wholeWord = modifiers.wholeWord;
-
-
-  if (originalQuery === "") {
-    return new RegExp(originalQuery);
-  }
-
-  var query = originalQuery;
-  if (ignoreSpaces) {
-    query = ignoreWhiteSpace(query);
-  }
-
-  if (!regexMatch) {
-    query = (0, _escapeRegExp2.default)(query);
-  }
-
-  query = wholeMatch(query, wholeWord);
-  var flags = buildFlags(caseSensitive, isGlobal);
-
-  if (flags) {
-    return new RegExp(query, flags);
-  }
-
-  return new RegExp(query);
-}
-
-/***/ }),
-/* 1212 */,
-/* 1213 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.prettyPrint = exports.stopPrettyPrintWorker = exports.startPrettyPrintWorker = undefined;
-
-var prettyPrint = exports.prettyPrint = (() => {
-  var _ref = _asyncToGenerator(function* (_ref2) {
-    var source = _ref2.source,
-        url = _ref2.url;
-
-    var indent = 2;
-
-    (0, _assert2.default)((0, _source.isJavaScript)(source), "Can't prettify non-javascript files.");
-
-    return yield _prettyPrint({
-      url,
-      indent,
-      source: source.text
-    });
-  });
-
-  return function prettyPrint(_x) {
-    return _ref.apply(this, arguments);
-  };
-})();
-
-var _devtoolsUtils = __webpack_require__(900);
-
-var _source = __webpack_require__(233);
-
-var _assert = __webpack_require__(223);
-
-var _assert2 = _interopRequireDefault(_assert);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
-
-
-var dispatcher = new WorkerDispatcher();
-var startPrettyPrintWorker = exports.startPrettyPrintWorker = dispatcher.start.bind(dispatcher);
-var stopPrettyPrintWorker = exports.stopPrettyPrintWorker = dispatcher.stop.bind(dispatcher);
-var _prettyPrint = dispatcher.task("prettyPrint");
-
-/***/ }),
-/* 1214 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.correctIndentation = correctIndentation;
-function getIndentation(lines) {
-  var firstLine = lines[0];
-  var secondLine = lines[1];
-  var lastLine = lines[lines.length - 1];
-
-  var _getIndentation = line => line && line.match(/^\s*/)[0].length;
-
-  var indentations = [_getIndentation(firstLine), _getIndentation(secondLine), _getIndentation(lastLine)];
-
-  return Math.max.apply(Math, indentations);
-}
-
-function correctIndentation(text) {
-  var lines = text.trim().split("\n");
-  var indentation = getIndentation(lines);
-  var formattedLines = lines.map(_line => _line.replace(new RegExp(`^\\s{0,${indentation - 1}}`), ""));
-
-  return formattedLines.join("\n");
-}
-
-/***/ }),
-/* 1215 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1216 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1217 */,
-/* 1218 */,
-/* 1219 */,
-/* 1220 */,
-/* 1221 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1222 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1223 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1224 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1225 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1226 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1227 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1228 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1229 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1230 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1231 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1232 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1233 */
-/***/ (function(module, exports) {
-
-module.exports = "<svg viewBox=\"0 0 256 296\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\"><g><polygon fill=\"#673AB8\" points=\"128 0 256 73.8999491 256 221.699847 128 295.599796 0 221.699847 0 73.8999491\"></polygon><path d=\"M34.8647584,220.478469 C51.8814262,242.25881 105.959701,225.662965 157.014868,185.774297 C208.070035,145.885628 237.255632,97.428608 220.238964,75.6482664 C203.222296,53.8679249 149.144022,70.4637701 98.0888543,110.352439 C47.0336869,150.241107 17.8480906,198.698127 34.8647584,220.478469 Z M42.1343351,214.798853 C36.4908625,207.575537 38.9565723,193.395881 49.7081913,175.544904 C61.0297348,156.747677 80.2490923,135.997367 103.76847,117.622015 C127.287848,99.2466634 152.071368,85.6181573 173.049166,79.1803727 C192.970945,73.066665 207.325915,74.1045667 212.969387,81.3278822 C218.61286,88.5511977 216.14715,102.730854 205.395531,120.581832 C194.073987,139.379058 174.85463,160.129368 151.335252,178.50472 C127.815874,196.880072 103.032354,210.508578 82.054556,216.946362 C62.1327769,223.06007 47.7778077,222.022168 42.1343351,214.798853 Z\" fill=\"#FFFFFF\"></path><path d=\"M220.238964,220.478469 C237.255632,198.698127 208.070035,150.241107 157.014868,110.352439 C105.959701,70.4637701 51.8814262,53.8679249 34.8647584,75.6482664 C17.8480906,97.428608 47.0336869,145.885628 98.0888543,185.774297 C149.144022,225.662965 203.222296,242.25881 220.238964,220.478469 Z M212.969387,214.798853 C207.325915,222.022168 192.970945,223.06007 173.049166,216.946362 C152.071368,210.508578 127.287848,196.880072 103.76847,178.50472 C80.2490923,160.129368 61.0297348,139.379058 49.7081913,120.581832 C38.9565723,102.730854 36.4908625,88.5511977 42.1343351,81.3278822 C47.7778077,74.1045667 62.1327769,73.066665 82.054556,79.1803727 C103.032354,85.6181573 127.815874,99.2466634 151.335252,117.622015 C174.85463,135.997367 194.073987,156.747677 205.395531,175.544904 C216.14715,193.395881 218.61286,207.575537 212.969387,214.798853 Z\" fill=\"#FFFFFF\"></path><path d=\"M127.551861,167.666971 C138.378632,167.666971 147.155465,158.890139 147.155465,148.063368 C147.155465,137.236596 138.378632,128.459764 127.551861,128.459764 C116.72509,128.459764 107.948257,137.236596 107.948257,148.063368 C107.948257,158.890139 116.72509,167.666971 127.551861,167.666971 L127.551861,167.666971 Z\" fill=\"#FFFFFF\"></path></g></svg>"
-
-/***/ }),
-/* 1234 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1235 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1236 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1237 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1238 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1239 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getDomain = getDomain;
-exports.findNodeInContents = findNodeInContents;
-exports.createTreeNodeMatcher = createTreeNodeMatcher;
-
-var _url = __webpack_require__(334);
-
-var _utils = __webpack_require__(18);
-
-/*
- * Gets domain from url (without www prefix)
- */
-function getDomain(url) {
-  var _parse = (0, _url.parse)(url),
-      host = _parse.host;
-
-  if (!host) {
-    return null;
-  }
-  return host.startsWith("www.") ? host.substr("www.".length) : host;
-}
-
-/*
- * Checks if node name matches debugger host/domain.
- */
-function isExactDomainMatch(part, debuggeeHost) {
-  return part.startsWith("www.") ? part.substr("www.".length) === debuggeeHost : part === debuggeeHost;
-}
-
-/*
- * Function to assist with node search for a defined sorted order, see e.g.
- * `createTreeNodeMatcher`. Returns negative number if the node
- * stands earlier in sorting order, positive number if the node stands later
- * in sorting order, or zero if the node is found.
- */
-
-
-/*
- * Performs a binary search to insert a node into contents. Returns positive
- * number, index of the found child, or negative number, which can be used
- * to calculate a position where a new node can be inserted (`-index - 1`).
- * The matcher is a function that returns result of comparision of a node with
- * lookup value.
- */
-function findNodeInContents(tree, matcher) {
-  var contents = tree.contents;
-
-  if (contents.length === 0) {
-    return { found: false, index: 0 };
-  }
-  var left = 0;
-  var right = contents.length - 1;
-  while (left < right) {
-    var middle = Math.floor((left + right) / 2);
-    if (matcher(contents[middle]) < 0) {
-      left = middle + 1;
-    } else {
-      right = middle;
-    }
-  }
-  var result = matcher(contents[left]);
-  if (result === 0) {
-    return { found: true, index: left };
-  }
-  return { found: false, index: result > 0 ? left : left + 1 };
-}
-
-var IndexName = "(index)";
-
-function createTreeNodeMatcherWithIndex() {
-  return node => node.name === IndexName ? 0 : 1;
-}
-
-function createTreeNodeMatcherWithDebuggeeHost(debuggeeHost) {
-  return node => {
-    if (node.name === IndexName) {
-      return -1;
-    }
-    return isExactDomainMatch(node.name, debuggeeHost) ? 0 : 1;
-  };
-}
-
-function createTreeNodeMatcherWithNameAndOther(part, isDir, debuggeeHost) {
-  return node => {
-    if (node.name === IndexName) {
-      return -1;
-    }
-    if (debuggeeHost && isExactDomainMatch(node.name, debuggeeHost)) {
-      return -1;
-    }
-    var nodeIsDir = (0, _utils.nodeHasChildren)(node);
-    if (nodeIsDir && !isDir) {
-      return -1;
-    } else if (!nodeIsDir && isDir) {
-      return 1;
-    }
-    return node.name.localeCompare(part);
-  };
-}
-
-/*
- * Creates a matcher for findNodeInContents.
- * The sorting order of nodes during comparison is:
- * - "(index)" node
- * - root node with the debuggee host/domain
- * - hosts/directories (not files) sorted by name
- * - files sorted by name
- */
-function createTreeNodeMatcher(part, isDir, debuggeeHost) {
-  if (part === IndexName) {
-    // Specialied matcher, when we are looking for "(index)" position.
-    return createTreeNodeMatcherWithIndex();
-  }
-  if (debuggeeHost && isExactDomainMatch(part, debuggeeHost)) {
-    // Specialied matcher, when we are looking for domain position.
-    return createTreeNodeMatcherWithDebuggeeHost(debuggeeHost);
-  }
-  // Rest of the cases, without mentioned above.
-  return createTreeNodeMatcherWithNameAndOther(part, isDir, debuggeeHost);
-}
-
-/***/ }),
-/* 1240 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1241 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1242 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1243 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1244 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1245 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1246 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1247 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1248 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1249 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1250 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1251 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1252 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1253 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1254 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1255 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1256 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1257 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1258 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1259 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1260 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1261 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1262 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1263 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1264 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1265 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1266 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1267 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1268 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1269 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1270 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1271 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
 /***/ })
 /******/ ]);
 });
\ No newline at end of file
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -65,17 +65,17 @@ return /******/ (function(modules) { // 
 /******/
 /******/ 	// Object.prototype.hasOwnProperty.call
 /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
 /******/
 /******/ 	// __webpack_public_path__
 /******/ 	__webpack_require__.p = "/assets/build";
 /******/
 /******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1272);
+/******/ 	return __webpack_require__(__webpack_require__.s = 339);
 /******/ })
 /************************************************************************/
 /******/ ([
 /* 0 */,
 /* 1 */,
 /* 2 */,
 /* 3 */,
 /* 4 */,
@@ -3844,17 +3844,23 @@ module.exports = toNumber;
 /* 331 */,
 /* 332 */,
 /* 333 */,
 /* 334 */,
 /* 335 */,
 /* 336 */,
 /* 337 */,
 /* 338 */,
-/* 339 */,
+/* 339 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(961);
+
+
+/***/ }),
 /* 340 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var toInteger = __webpack_require__(474);
 var max = Math.max;
 var min = Math.min;
 module.exports = function (index, length) {
   index = toInteger(index);
@@ -28459,26 +28465,146 @@ function basePropertyDeep(path) {
     return baseGet(object, path);
   };
 }
 
 module.exports = basePropertyDeep;
 
 
 /***/ }),
-/* 842 */,
+/* 842 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+exports.getNextStep = getNextStep;
+
+var _debuggerHtml = __webpack_require__(843);
+
+var _types = __webpack_require__(844);
+
+var _closest = __webpack_require__(1055);
+
+var _helpers = __webpack_require__(1052);
+
+function getNextStep(source, pausedPosition) {
+  var awaitExpression = getAwaitExpression(source, pausedPosition);
+  if (!awaitExpression) {
+    return null;
+  }
+  var awaitStatement = awaitExpression.getStatementParent();
+  return getLocationAfterAwaitExpression(awaitStatement, pausedPosition);
+}
+
+function getAwaitExpression(source, pausedPosition) {
+  var closestPath = (0, _closest.getClosestPath)(source, pausedPosition);
+
+  if (!closestPath) {
+    return null;
+  }
+
+  if ((0, _helpers.isAwaitExpression)(closestPath)) {
+    return closestPath;
+  }
+
+  return closestPath.find(p => p.isAwaitExpression());
+}
+
+function getLocationAfterAwaitExpression(statement, position) {
+  var nextStatement = statement.getSibling(statement.key + 1);
+  if (nextStatement.node) {
+    return _extends({}, nextStatement.node.loc.start, {
+      sourceId: position.sourceId
+    });
+  }
+
+  return null;
+}
+
+/***/ }),
 /* 843 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /***/ }),
-/* 844 */,
-/* 845 */,
+/* 844 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/***/ }),
+/* 845 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = getEmptyLines;
+
+var _uniq = __webpack_require__(561);
+
+var _uniq2 = _interopRequireDefault(_uniq);
+
+var _difference = __webpack_require__(1129);
+
+var _difference2 = _interopRequireDefault(_difference);
+
+var _ast = __webpack_require__(1051);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var commentTokens = ["CommentBlock", "CommentLine"];
+
+function fillRange(start, end) {
+  return Array(end - start + 1).fill().map((item, index) => start + index);
+}
+
+// Populates a pre-filled array of every line number,
+// then removes lines which were found to be executable
+function getLines(ast) {
+  return fillRange(0, ast.tokens[ast.tokens.length - 1].loc.end.line);
+}
+
+// The following sequence stores lines which have executable code
+// (contents other than comments or EOF, regardless of line position)
+function getExecutableLines(ast) {
+  var lines = ast.tokens.filter(token => !commentTokens.includes(token.type) && (!token.type || token.type.label && token.type.label != "eof")).map(token => token.loc.start.line - 1);
+
+  return (0, _uniq2.default)(lines);
+}
+
+function getEmptyLines(sourceToJS) {
+  if (!sourceToJS) {
+    return null;
+  }
+
+  var ast = (0, _ast.getAst)(sourceToJS);
+  if (!ast || !ast.comments) {
+    return [];
+  }
+
+  var executableLines = getExecutableLines(ast);
+  var lines = getLines(ast);
+  return (0, _difference2.default)(lines, executableLines);
+}
+
+/***/ }),
 /* 846 */,
 /* 847 */,
 /* 848 */,
 /* 849 */,
 /* 850 */,
 /* 851 */,
 /* 852 */,
 /* 853 */,
@@ -28756,17 +28882,75 @@ module.exports = {
 /* 953 */,
 /* 954 */,
 /* 955 */,
 /* 956 */,
 /* 957 */,
 /* 958 */,
 /* 959 */,
 /* 960 */,
-/* 961 */,
+/* 961 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _closest = __webpack_require__(1055);
+
+var _scopes = __webpack_require__(1049);
+
+var _getSymbols = __webpack_require__(1050);
+
+var _getSymbols2 = _interopRequireDefault(_getSymbols);
+
+var _ast = __webpack_require__(1051);
+
+var _getScopes = __webpack_require__(1186);
+
+var _getScopes2 = _interopRequireDefault(_getScopes);
+
+var _sources = __webpack_require__(1171);
+
+var _getOutOfScopeLocations = __webpack_require__(1072);
+
+var _getOutOfScopeLocations2 = _interopRequireDefault(_getOutOfScopeLocations);
+
+var _steps = __webpack_require__(842);
+
+var _getEmptyLines = __webpack_require__(845);
+
+var _getEmptyLines2 = _interopRequireDefault(_getEmptyLines);
+
+var _validate = __webpack_require__(1207);
+
+var _devtoolsUtils = __webpack_require__(900);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var workerHandler = _devtoolsUtils.workerUtils.workerHandler;
+
+
+self.onmessage = workerHandler({
+  getClosestExpression: _closest.getClosestExpression,
+  getOutOfScopeLocations: _getOutOfScopeLocations2.default,
+  getSymbols: _getSymbols2.default,
+  getScopes: _getScopes2.default,
+  clearSymbols: _getSymbols.clearSymbols,
+  clearScopes: _getScopes.clearScopes,
+  clearASTs: _ast.clearASTs,
+  hasSource: _sources.hasSource,
+  setSource: _sources.setSource,
+  clearSources: _sources.clearSources,
+  getVariablesInScope: _scopes.getVariablesInScope,
+  getNextStep: _steps.getNextStep,
+  getEmptyLines: _getEmptyLines2.default,
+  hasSyntaxError: _validate.hasSyntaxError
+});
+
+/***/ }),
 /* 962 */,
 /* 963 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var baseKeys = __webpack_require__(217),
     getTag = __webpack_require__(198),
     isArguments = __webpack_require__(208),
     isArray = __webpack_require__(70),
@@ -29071,23 +29255,797 @@ exports.parseScriptTags = parseScriptTag
 /* 1041 */,
 /* 1042 */,
 /* 1043 */,
 /* 1044 */,
 /* 1045 */,
 /* 1046 */,
 /* 1047 */,
 /* 1048 */,
-/* 1049 */,
-/* 1050 */,
-/* 1051 */,
-/* 1052 */,
-/* 1053 */,
+/* 1049 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+exports.getVariablesInLocalScope = getVariablesInLocalScope;
+exports.getVariablesInScope = getVariablesInScope;
+exports.isExpressionInScope = isExpressionInScope;
+
+var _toPairs = __webpack_require__(795);
+
+var _toPairs2 = _interopRequireDefault(_toPairs);
+
+var _uniq = __webpack_require__(561);
+
+var _uniq2 = _interopRequireDefault(_uniq);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function getScopeVariables(scope) {
+  var bindings = scope.bindings;
+
+
+  return (0, _toPairs2.default)(bindings).map((_ref) => {
+    var _ref2 = _slicedToArray(_ref, 2),
+        name = _ref2[0],
+        binding = _ref2[1];
+
+    return {
+      name,
+      references: binding.referencePaths
+    };
+  });
+}
+
+function getScopeChain(scope) {
+  var scopes = [];
+
+  do {
+    scopes.push(scope);
+  } while (scope = scope.parent);
+
+  return scopes;
+}
+
+function getVariablesInLocalScope(scope) {
+  return getScopeVariables(scope);
+}
+
+function getVariablesInScope(scope) {
+  var _ref3;
+
+  var scopes = getScopeChain(scope);
+  var scopeVars = scopes.map(getScopeVariables);
+  var vars = (_ref3 = [{ name: "this" }, { name: "arguments" }]).concat.apply(_ref3, _toConsumableArray(scopeVars)).map(variable => variable.name);
+  return (0, _uniq2.default)(vars);
+}
+
+function isExpressionInScope(expression, scope) {
+  if (!scope) {
+    return false;
+  }
+
+  var variables = getVariablesInScope(scope);
+  var firstPart = expression.split(/\./)[0];
+  return variables.includes(firstPart);
+}
+
+/***/ }),
+/* 1050 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = getSymbols;
+exports.formatSymbols = formatSymbols;
+exports.clearSymbols = clearSymbols;
+
+var _ast = __webpack_require__(1051);
+
+var _helpers = __webpack_require__(1052);
+
+var _babelTypes = __webpack_require__(493);
+
+var t = _interopRequireWildcard(_babelTypes);
+
+var _getFunctionName = __webpack_require__(1053);
+
+var _getFunctionName2 = _interopRequireDefault(_getFunctionName);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _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; } }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+var symbolDeclarations = new Map();
+
+function getFunctionParameterNames(path) {
+  return path.node.params.map(param => param.name);
+}
+
+function getVariableNames(path) {
+  if (t.isObjectProperty(path) && !(0, _helpers.isFunction)(path.node.value)) {
+    return [{
+      name: path.node.key.name,
+      location: path.node.loc
+    }];
+  }
+
+  if (!path.node.declarations) {
+    return path.node.params.map(dec => ({
+      name: dec.name,
+      location: dec.loc
+    }));
+  }
+
+  return path.node.declarations.map(dec => ({
+    name: dec.id.name,
+    location: dec.loc
+  }));
+}
+
+function getComments(ast) {
+  if (!ast || !ast.comments) {
+    return [];
+  }
+  return ast.comments.map(comment => ({
+    name: comment.location,
+    location: comment.loc
+  }));
+}
+
+function getClassName(path) {
+  var classDeclaration = path.findParent(_p => _p.isClassDeclaration());
+  if (!classDeclaration) {
+    return null;
+  }
+
+  return classDeclaration.node.id.name;
+}
+
+function extractSymbols(source) {
+  var functions = [];
+  var variables = [];
+  var memberExpressions = [];
+  var callExpressions = [];
+  var objectProperties = [];
+  var identifiers = [];
+
+  var ast = (0, _ast.traverseAst)(source, {
+    enter(path) {
+      if ((0, _helpers.isVariable)(path)) {
+        variables.push.apply(variables, _toConsumableArray(getVariableNames(path)));
+      }
+
+      if ((0, _helpers.isFunction)(path)) {
+        functions.push({
+          name: (0, _getFunctionName2.default)(path),
+          klass: getClassName(path),
+          location: path.node.loc,
+          parameterNames: getFunctionParameterNames(path),
+          identifier: path.node.id
+        });
+      }
+
+      if (t.isClassDeclaration(path)) {
+        variables.push({
+          name: path.node.id.name,
+          location: path.node.loc
+        });
+      }
+
+      if (t.isObjectProperty(path)) {
+        var _path$node$key$loc = path.node.key.loc,
+            start = _path$node$key$loc.start,
+            end = _path$node$key$loc.end,
+            identifierName = _path$node$key$loc.identifierName;
+
+        objectProperties.push({
+          name: identifierName,
+          location: { start, end },
+          expression: getSnippet(path)
+        });
+      }
+
+      if (t.isMemberExpression(path)) {
+        var _path$node$property$l = path.node.property.loc,
+            _start = _path$node$property$l.start,
+            _end = _path$node$property$l.end;
+
+        memberExpressions.push({
+          name: path.node.property.name,
+          location: { start: _start, end: _end },
+          expressionLocation: path.node.loc,
+          expression: getSnippet(path)
+        });
+      }
+
+      if (t.isCallExpression(path)) {
+        var callee = path.node.callee;
+        if (!t.isMemberExpression(callee)) {
+          var _callee$loc = callee.loc,
+              _start2 = _callee$loc.start,
+              _end2 = _callee$loc.end,
+              _identifierName = _callee$loc.identifierName;
+
+          callExpressions.push({
+            name: _identifierName,
+            location: { start: _start2, end: _end2 }
+          });
+        }
+      }
+
+      if (t.isIdentifier(path)) {
+        var _path$node$loc = path.node.loc,
+            _start3 = _path$node$loc.start,
+            _end3 = _path$node$loc.end;
+
+
+        identifiers.push({
+          name: path.node.name,
+          expression: path.node.name,
+          location: { start: _start3, end: _end3 }
+        });
+      }
+
+      if (t.isThisExpression(path.node)) {
+        var _path$node$loc2 = path.node.loc,
+            _start4 = _path$node$loc2.start,
+            _end4 = _path$node$loc2.end;
+
+        identifiers.push({
+          name: "this",
+          location: { start: _start4, end: _end4 },
+          expressionLocation: path.node.loc,
+          expression: "this"
+        });
+      }
+
+      if (t.isVariableDeclarator(path)) {
+        var node = path.node.id;
+        var _path$node$loc3 = path.node.loc,
+            _start5 = _path$node$loc3.start,
+            _end5 = _path$node$loc3.end;
+
+
+        identifiers.push({
+          name: node.name,
+          expression: node.name,
+          location: { start: _start5, end: _end5 }
+        });
+      }
+    }
+  });
+
+  // comments are extracted separately from the AST
+  var comments = getComments(ast);
+
+  return {
+    functions,
+    variables,
+    callExpressions,
+    memberExpressions,
+    objectProperties,
+    comments,
+    identifiers
+  };
+}
+
+function getSymbols(source) {
+  if (symbolDeclarations.has(source.id)) {
+    var _symbols = symbolDeclarations.get(source.id);
+    if (_symbols) {
+      return _symbols;
+    }
+  }
+
+  var symbols = extractSymbols(source);
+  symbolDeclarations.set(source.id, symbols);
+  return symbols;
+}
+
+function extendSnippet(name, expression, path, prevPath) {
+  var computed = path && path.node.computed;
+  var prevComputed = prevPath && prevPath.node.computed;
+  var prevArray = t.isArrayExpression(prevPath);
+  var array = t.isArrayExpression(path);
+
+  if (expression === "") {
+    if (computed) {
+      return `[${name}]`;
+    }
+    return name;
+  }
+
+  if (computed || array) {
+    if (prevComputed || prevArray) {
+      return `[${name}]${expression}`;
+    }
+    return `[${name}].${expression}`;
+  }
+
+  if (prevComputed || prevArray) {
+    return `${name}${expression}`;
+  }
+
+  return `${name}.${expression}`;
+}
+
+function getMemberSnippet(node) {
+  var expression = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
+
+  if (t.isMemberExpression(node)) {
+    var _name = node.property.name;
+
+    return getMemberSnippet(node.object, extendSnippet(_name, expression));
+  }
+
+  if (t.isCallExpression(node)) {
+    return "";
+  }
+
+  if (t.isThisExpression(node)) {
+    return `this.${expression}`;
+  }
+
+  if (t.isIdentifier(node)) {
+    return `${node.name}.${expression}`;
+  }
+
+  return expression;
+}
+
+function getObjectSnippet(path, prevPath) {
+  var expression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+
+  if (!path) {
+    return expression;
+  }
+
+  var name = path.node.key.name;
+
+  var extendedExpression = extendSnippet(name, expression, path, prevPath);
+
+  var nextPrevPath = path;
+  var nextPath = path.parentPath && path.parentPath.parentPath;
+
+  return getSnippet(nextPath, nextPrevPath, extendedExpression);
+}
+
+function getArraySnippet(path, prevPath, expression) {
+  var index = prevPath.parentPath.key;
+  var extendedExpression = extendSnippet(index, expression, path, prevPath);
+
+  var nextPrevPath = path;
+  var nextPath = path.parentPath && path.parentPath.parentPath;
+
+  return getSnippet(nextPath, nextPrevPath, extendedExpression);
+}
+
+function getSnippet(path, prevPath) {
+  var expression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+
+  if (t.isVariableDeclaration(path)) {
+    var node = path.node.declarations[0];
+    var _name2 = node.id.name;
+    return extendSnippet(_name2, expression, path, prevPath);
+  }
+
+  if (t.isVariableDeclarator(path)) {
+    var _node = path.node.id;
+    if (t.isObjectPattern(_node)) {
+      return expression;
+    }
+
+    var _name3 = _node.name;
+    var prop = extendSnippet(_name3, expression, path, prevPath);
+    return prop;
+  }
+
+  if (t.isAssignmentExpression(path)) {
+    var _node2 = path.node.left;
+    var _name4 = t.isMemberExpression(_node2) ? getMemberSnippet(_node2) : _node2.name;
+
+    var _prop = extendSnippet(_name4, expression, path, prevPath);
+    return _prop;
+  }
+
+  if ((0, _helpers.isFunction)(path)) {
+    return expression;
+  }
+
+  if (t.isIdentifier(path)) {
+    var _node3 = path.node;
+    return `${_node3.name}.${expression}`;
+  }
+
+  if (t.isObjectProperty(path)) {
+    return getObjectSnippet(path, prevPath, expression);
+  }
+
+  if (t.isObjectExpression(path)) {
+    var parentPath = prevPath && prevPath.parentPath;
+    return getObjectSnippet(parentPath, prevPath, expression);
+  }
+
+  if (t.isMemberExpression(path)) {
+    return getMemberSnippet(path.node, expression);
+  }
+
+  if (t.isArrayExpression(path)) {
+    return getArraySnippet(path, prevPath, expression);
+  }
+}
+
+function formatSymbols(source) {
+  var symbols = getSymbols(source);
+
+  function formatLocation(loc) {
+    if (!loc) {
+      return "";
+    }
+    var start = loc.start,
+        end = loc.end;
+
+
+    var startLoc = `(${start.line}, ${start.column})`;
+    var endLoc = `(${end.line}, ${end.column})`;
+    return `[${startLoc}, ${endLoc}]`;
+  }
+
+  function summarize(symbol) {
+    var loc = formatLocation(symbol.location);
+    var exprLoc = formatLocation(symbol.expressionLocation);
+    var params = symbol.parameterNames ? symbol.parameterNames.join(", ") : "";
+    var expression = symbol.expression || "";
+    var klass = symbol.klass || "";
+    return `${loc} ${exprLoc} ${expression} ${symbol.name} ${params} ${klass}`;
+  }
+
+  return Object.keys(symbols).map(name => `${name}:\n ${symbols[name].map(summarize).join("\n")}`);
+}
+
+function clearSymbols() {
+  symbolDeclarations = new Map();
+}
+
+/***/ }),
+/* 1051 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.parseExpression = parseExpression;
+exports.getAst = getAst;
+exports.clearASTs = clearASTs;
+exports.traverseAst = traverseAst;
+
+var _parseScriptTags = __webpack_require__(1023);
+
+var _parseScriptTags2 = _interopRequireDefault(_parseScriptTags);
+
+var _babylon = __webpack_require__(435);
+
+var babylon = _interopRequireWildcard(_babylon);
+
+var _babelTraverse = __webpack_require__(436);
+
+var _babelTraverse2 = _interopRequireDefault(_babelTraverse);
+
+var _isEmpty = __webpack_require__(963);
+
+var _isEmpty2 = _interopRequireDefault(_isEmpty);
+
+function _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; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var ASTs = new Map();
+
+function _parse(code, opts) {
+  return babylon.parse(code, Object.assign({}, opts, {
+    sourceType: "module",
+    plugins: ["jsx", "flow", "objectRestSpread"]
+  }));
+}
+
+function parse(text, opts) {
+  var ast = void 0;
+  if (!text) {
+    return;
+  }
+
+  try {
+    ast = _parse(text, opts);
+  } catch (error) {
+    ast = {};
+  }
+
+  return ast;
+}
+
+// Custom parser for parse-script-tags that adapts its input structure to
+// our parser's signature
+function htmlParser(_ref) {
+  var source = _ref.source,
+      line = _ref.line;
+
+  return parse(source, {
+    startLine: line
+  });
+}
+
+function parseExpression(expression, opts) {
+  return babylon.parseExpression(expression, Object.assign({}, opts, { sourceType: "script" }));
+}
+
+function getAst(source) {
+  if (!source || !source.text) {
+    return {};
+  }
+
+  if (ASTs.has(source.id)) {
+    return ASTs.get(source.id);
+  }
+
+  var ast = {};
+  if (source.contentType == "text/html") {
+    ast = (0, _parseScriptTags2.default)(source.text, htmlParser) || {};
+  } else if (source.contentType == "text/javascript") {
+    ast = parse(source.text);
+  }
+
+  ASTs.set(source.id, ast);
+  return ast;
+}
+
+function clearASTs() {
+  ASTs = new Map();
+}
+
+function traverseAst(source, visitor) {
+  var ast = getAst(source);
+  if ((0, _isEmpty2.default)(ast)) {
+    return null;
+  }
+
+  (0, _babelTraverse2.default)(ast, visitor);
+  return ast;
+}
+
+/***/ }),
+/* 1052 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.isLexicalScope = isLexicalScope;
+exports.isFunction = isFunction;
+exports.isAwaitExpression = isAwaitExpression;
+exports.isVariable = isVariable;
+exports.getMemberExpression = getMemberExpression;
+
+var _babelTypes = __webpack_require__(493);
+
+var t = _interopRequireWildcard(_babelTypes);
+
+function _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; } }
+
+function isLexicalScope(path) {
+  return t.isBlockStatement(path) || isFunction(path) || t.isProgram(path);
+}
+
+function isFunction(path) {
+  return t.isFunction(path) || t.isArrowFunctionExpression(path) || t.isObjectMethod(path) || t.isClassMethod(path);
+}
+
+function isAwaitExpression(path) {
+  return t.isAwaitExpression(path) || t.isAwaitExpression(path.container.init) || t.isAwaitExpression(path.parentPath);
+}
+
+function isVariable(path) {
+  return t.isVariableDeclaration(path) || isFunction(path) && path.node.params.length || t.isObjectProperty(path) && !isFunction(path.node.value);
+}
+
+function getMemberExpression(root) {
+  function _getMemberExpression(node, expr) {
+    if (t.isMemberExpression(node)) {
+      expr = [node.property.name].concat(expr);
+      return _getMemberExpression(node.object, expr);
+    }
+
+    if (t.isCallExpression(node)) {
+      return [];
+    }
+
+    if (t.isThisExpression(node)) {
+      return ["this"].concat(expr);
+    }
+
+    return [node.name].concat(expr);
+  }
+
+  var expr = _getMemberExpression(root, []);
+  return expr.join(".");
+}
+
+/***/ }),
+/* 1053 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = getFunctionName;
+function getFunctionName(path) {
+  if (path.node.id) {
+    return path.node.id.name;
+  }
+
+  var parent = path.parent;
+  if (parent.type == "ObjectProperty") {
+    return parent.key.name;
+  }
+
+  if (parent.type == "ObjectExpression" || path.node.type == "ClassMethod") {
+    return path.node.key.name;
+  }
+
+  if (parent.type == "VariableDeclarator") {
+    return parent.id.name;
+  }
+
+  if (parent.type == "AssignmentExpression") {
+    if (parent.left.type == "MemberExpression") {
+      return parent.left.property.name;
+    }
+
+    return parent.left.name;
+  }
+
+  return "anonymous";
+}
+
+/***/ }),
 /* 1054 */,
-/* 1055 */,
+/* 1055 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getClosestExpression = getClosestExpression;
+exports.getClosestScope = getClosestScope;
+exports.getClosestPath = getClosestPath;
+
+var _babelTypes = __webpack_require__(493);
+
+var t = _interopRequireWildcard(_babelTypes);
+
+var _ast = __webpack_require__(1051);
+
+var _helpers = __webpack_require__(1052);
+
+var _contains = __webpack_require__(1127);
+
+function _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; } }
+
+function getNodeValue(node) {
+  if (t.isThisExpression(node)) {
+    return "this";
+  }
+
+  return node.name;
+}
+
+function getClosestMemberExpression(source, token, location) {
+  var expression = null;
+  (0, _ast.traverseAst)(source, {
+    enter(path) {
+      var node = path.node;
+
+      if (!(0, _contains.nodeContainsPosition)(node, location)) {
+        return path.skip();
+      }
+
+      if (t.isMemberExpression(node) && node.property.name === token) {
+        var memberExpression = (0, _helpers.getMemberExpression)(node);
+        expression = {
+          expression: memberExpression,
+          location: node.loc
+        };
+      }
+    }
+  });
+
+  return expression;
+}
+
+function getClosestExpression(source, token, location) {
+  var memberExpression = getClosestMemberExpression(source, token, location);
+  if (memberExpression) {
+    return memberExpression;
+  }
+
+  var path = getClosestPath(source, location);
+  if (!path || !path.node) {
+    return;
+  }
+
+  var node = path.node;
+
+  return { expression: getNodeValue(node), location: node.loc };
+}
+
+function getClosestScope(source, location) {
+  var closestPath = null;
+
+  (0, _ast.traverseAst)(source, {
+    enter(path) {
+      if (!(0, _contains.nodeContainsPosition)(path.node, location)) {
+        return path.skip();
+      }
+
+      if ((0, _helpers.isLexicalScope)(path)) {
+        closestPath = path;
+      }
+    }
+  });
+
+  if (!closestPath) {
+    return;
+  }
+
+  return closestPath.scope;
+}
+
+function getClosestPath(source, location) {
+  var closestPath = null;
+
+  (0, _ast.traverseAst)(source, {
+    enter(path) {
+      if (!(0, _contains.nodeContainsPosition)(path.node, location)) {
+        return path.skip();
+      }
+      closestPath = path;
+    }
+  });
+
+  return closestPath;
+}
+
+/***/ }),
 /* 1056 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* WEBPACK VAR INJECTION */(function(module) {
 
 function assembleStyles () {
 	var styles = {
@@ -29166,17 +30124,116 @@ Object.defineProperty(module, 'exports',
 /* 1064 */,
 /* 1065 */,
 /* 1066 */,
 /* 1067 */,
 /* 1068 */,
 /* 1069 */,
 /* 1070 */,
 /* 1071 */,
-/* 1072 */,
+/* 1072 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _get = __webpack_require__(1073);
+
+var _get2 = _interopRequireDefault(_get);
+
+var _contains = __webpack_require__(1127);
+
+var _getSymbols2 = __webpack_require__(1050);
+
+var _getSymbols3 = _interopRequireDefault(_getSymbols2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function findSymbols(source) {
+  var _getSymbols = (0, _getSymbols3.default)(source),
+      functions = _getSymbols.functions,
+      comments = _getSymbols.comments;
+
+  return { functions, comments };
+}
+
+/**
+ * Returns the location for a given function path. If the path represents a
+ * function declaration, the location will begin after the function identifier
+ * but before the function parameters.
+ */
+
+function getLocation(func) {
+  var location = _extends({}, func.location);
+
+  // if the function has an identifier, start the block after it so the
+  // identifier is included in the "scope" of its parent
+  var identifierEnd = (0, _get2.default)("identifier.loc.end", func);
+  if (identifierEnd) {
+    location.start = identifierEnd;
+  }
+
+  return location;
+}
+
+/**
+ * Reduces an array of locations to remove items that are completely enclosed
+ * by another location in the array.
+ */
+function removeOverlaps(locations, location) {
+  // support reducing without an initializing array
+  if (!Array.isArray(locations)) {
+    locations = [locations];
+  }
+
+  var contains = locations.filter(a => (0, _contains.containsLocation)(a, location)).length > 0;
+
+  if (!contains) {
+    locations.push(location);
+  }
+
+  return locations;
+}
+
+/**
+ * Sorts an array of locations by start position
+ */
+function sortByStart(a, b) {
+  if (a.start.line < b.start.line) {
+    return -1;
+  } else if (a.start.line === b.start.line) {
+    return a.start.column - b.start.column;
+  }
+
+  return 1;
+}
+
+/**
+ * Returns an array of locations that are considered out of scope for the given
+ * location.
+ */
+function getOutOfScopeLocations(source, position) {
+  var _findSymbols = findSymbols(source),
+      functions = _findSymbols.functions,
+      comments = _findSymbols.comments;
+
+  var commentLocations = comments.map(c => c.location);
+
+  return functions.map(getLocation).concat(commentLocations).filter(loc => !(0, _contains.containsPosition)(loc, position)).reduce(removeOverlaps, []).sort(sortByStart);
+}
+
+exports.default = getOutOfScopeLocations;
+
+/***/ }),
 /* 1073 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var convert = __webpack_require__(1074),
     func = convert('get', __webpack_require__(67));
 
 func.placeholder = __webpack_require__(1077);
 module.exports = func;
@@ -31759,17 +32816,44 @@ module.exports = toPath;
 /* 1119 */,
 /* 1120 */,
 /* 1121 */,
 /* 1122 */,
 /* 1123 */,
 /* 1124 */,
 /* 1125 */,
 /* 1126 */,
-/* 1127 */,
+/* 1127 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.containsPosition = containsPosition;
+exports.containsLocation = containsLocation;
+exports.nodeContainsPosition = nodeContainsPosition;
+function containsPosition(a, b) {
+  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
+  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
+
+  return startsBefore && endsAfter;
+}
+
+function containsLocation(a, b) {
+  return containsPosition(a, b.start) && containsPosition(a, b.end);
+}
+
+function nodeContainsPosition(node, position) {
+  return containsPosition(node.loc, position);
+}
+
+/***/ }),
 /* 1128 */,
 /* 1129 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var baseDifference = __webpack_require__(1131),
     baseFlatten = __webpack_require__(707),
     baseRest = __webpack_require__(411),
     isArrayLikeObject = __webpack_require__(1155);
@@ -31951,32 +33035,105 @@ module.exports = isArrayLikeObject;
 /* 1163 */,
 /* 1164 */,
 /* 1165 */,
 /* 1166 */,
 /* 1167 */,
 /* 1168 */,
 /* 1169 */,
 /* 1170 */,
-/* 1171 */,
+/* 1171 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.hasSource = hasSource;
+exports.setSource = setSource;
+exports.getSource = getSource;
+exports.clearSources = clearSources;
+
+
+var cachedSources = new Map();
+
+function hasSource(sourceId) {
+  return cachedSources.has(sourceId);
+}
+
+function setSource(source) {
+  cachedSources.set(source.id, source);
+}
+
+function getSource(sourceId) {
+  if (!cachedSources.has(sourceId)) {
+    throw new Error(`${sourceId} was not provided.`);
+  }
+  return cachedSources.get(sourceId);
+}
+
+function clearSources() {
+  cachedSources = new Map();
+}
+
+/***/ }),
 /* 1172 */,
 /* 1173 */,
 /* 1174 */,
 /* 1175 */,
 /* 1176 */,
 /* 1177 */,
 /* 1178 */,
 /* 1179 */,
 /* 1180 */,
 /* 1181 */,
 /* 1182 */,
 /* 1183 */,
 /* 1184 */,
 /* 1185 */,
-/* 1186 */,
+/* 1186 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = getScopes;
+exports.clearScopes = clearScopes;
+
+var _ast = __webpack_require__(1051);
+
+var _sources = __webpack_require__(1171);
+
+var _parser = __webpack_require__(1187);
+
+var parsedScopesCache = new Map();
+
+function getScopes(location) {
+  var sourceId = location.sourceId;
+
+  var parsedScopes = parsedScopesCache.get(sourceId);
+  if (!parsedScopes) {
+    var visitor = (0, _parser.createParseJSScopeVisitor)(sourceId);
+    (0, _ast.traverseAst)((0, _sources.getSource)(sourceId), visitor.traverseVisitor);
+    parsedScopes = visitor.toParsedScopes();
+    parsedScopesCache.set(sourceId, parsedScopes);
+  }
+  return (0, _parser.findScopes)(parsedScopes, location);
+}
+
+function clearScopes() {
+  parsedScopesCache = new Map();
+}
+
+/***/ }),
 /* 1187 */
 /***/ (function(module, exports) {
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 function createTempScope(type, parent, loc) {
@@ -32229,1266 +33386,28 @@ module.exports = {
 /* 1199 */,
 /* 1200 */,
 /* 1201 */,
 /* 1202 */,
 /* 1203 */,
 /* 1204 */,
 /* 1205 */,
 /* 1206 */,
-/* 1207 */,
-/* 1208 */,
-/* 1209 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.parseExpression = parseExpression;
-exports.getAst = getAst;
-exports.clearASTs = clearASTs;
-exports.traverseAst = traverseAst;
-
-var _parseScriptTags = __webpack_require__(1023);
-
-var _parseScriptTags2 = _interopRequireDefault(_parseScriptTags);
-
-var _babylon = __webpack_require__(435);
-
-var babylon = _interopRequireWildcard(_babylon);
-
-var _babelTraverse = __webpack_require__(436);
-
-var _babelTraverse2 = _interopRequireDefault(_babelTraverse);
-
-var _isEmpty = __webpack_require__(963);
-
-var _isEmpty2 = _interopRequireDefault(_isEmpty);
-
-function _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; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var ASTs = new Map();
-
-function _parse(code, opts) {
-  return babylon.parse(code, Object.assign({}, opts, {
-    sourceType: "module",
-    plugins: ["jsx", "flow", "objectRestSpread"]
-  }));
-}
-
-function parse(text, opts) {
-  var ast = void 0;
-  if (!text) {
-    return;
-  }
-
-  try {
-    ast = _parse(text, opts);
-  } catch (error) {
-    ast = {};
-  }
-
-  return ast;
-}
-
-// Custom parser for parse-script-tags that adapts its input structure to
-// our parser's signature
-function htmlParser(_ref) {
-  var source = _ref.source,
-      line = _ref.line;
-
-  return parse(source, {
-    startLine: line
-  });
-}
-
-function parseExpression(expression, opts) {
-  return babylon.parseExpression(expression, Object.assign({}, opts, { sourceType: "script" }));
-}
-
-function getAst(source) {
-  if (!source || !source.text) {
-    return {};
-  }
-
-  if (ASTs.has(source.id)) {
-    return ASTs.get(source.id);
-  }
-
-  var ast = {};
-  var contentType = source.contentType;
-
-  if (contentType == "text/html") {
-    ast = (0, _parseScriptTags2.default)(source.text, htmlParser) || {};
-  } else if (contentType && contentType.includes("javascript")) {
-    ast = parse(source.text);
-  }
-
-  ASTs.set(source.id, ast);
-  return ast;
-}
-
-function clearASTs() {
-  ASTs = new Map();
-}
-
-function traverseAst(source, visitor) {
-  var ast = getAst(source);
-  if ((0, _isEmpty2.default)(ast)) {
-    return null;
-  }
-
-  (0, _babelTraverse2.default)(ast, visitor);
-  return ast;
-}
-
-/***/ }),
-/* 1210 */,
-/* 1211 */,
-/* 1212 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isLexicalScope = isLexicalScope;
-exports.isFunction = isFunction;
-exports.isAwaitExpression = isAwaitExpression;
-exports.isYieldExpression = isYieldExpression;
-exports.isVariable = isVariable;
-exports.getMemberExpression = getMemberExpression;
-
-var _babelTypes = __webpack_require__(493);
-
-var t = _interopRequireWildcard(_babelTypes);
-
-function _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; } }
-
-function isLexicalScope(path) {
-  return t.isBlockStatement(path) || isFunction(path) || t.isProgram(path);
-}
-
-function isFunction(path) {
-  return t.isFunction(path) || t.isArrowFunctionExpression(path) || t.isObjectMethod(path) || t.isClassMethod(path);
-}
-
-function isAwaitExpression(path) {
-  return t.isAwaitExpression(path) || t.isAwaitExpression(path.container.init) || t.isAwaitExpression(path.parentPath);
-}
-
-function isYieldExpression(path) {
-  return t.isYieldExpression(path) || t.isYieldExpression(path.container.init) || t.isYieldExpression(path.parentPath);
-}
-
-function isVariable(path) {
-  return t.isVariableDeclaration(path) || isFunction(path) && path.node.params.length || t.isObjectProperty(path) && !isFunction(path.node.value);
-}
-
-function getMemberExpression(root) {
-  function _getMemberExpression(node, expr) {
-    if (t.isMemberExpression(node)) {
-      expr = [node.property.name].concat(expr);
-      return _getMemberExpression(node.object, expr);
-    }
-
-    if (t.isCallExpression(node)) {
-      return [];
-    }
-
-    if (t.isThisExpression(node)) {
-      return ["this"].concat(expr);
-    }
-
-    return [node.name].concat(expr);
-  }
-
-  var expr = _getMemberExpression(root, []);
-  return expr.join(".");
-}
-
-/***/ }),
-/* 1213 */,
-/* 1214 */,
-/* 1215 */,
-/* 1216 */,
-/* 1217 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getClosestExpression = getClosestExpression;
-exports.getClosestScope = getClosestScope;
-exports.getClosestPath = getClosestPath;
-
-var _babelTypes = __webpack_require__(493);
-
-var t = _interopRequireWildcard(_babelTypes);
-
-var _ast = __webpack_require__(1209);
-
-var _helpers = __webpack_require__(1212);
-
-var _contains = __webpack_require__(1218);
-
-function _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; } }
-
-function getNodeValue(node) {
-  if (t.isThisExpression(node)) {
-    return "this";
-  }
-
-  return node.name;
-}
-
-function getClosestMemberExpression(source, token, location) {
-  var expression = null;
-  (0, _ast.traverseAst)(source, {
-    enter(path) {
-      var node = path.node;
-
-      if (!(0, _contains.nodeContainsPosition)(node, location)) {
-        return path.skip();
-      }
-
-      if (t.isMemberExpression(node) && node.property.name === token) {
-        var memberExpression = (0, _helpers.getMemberExpression)(node);
-        expression = {
-          expression: memberExpression,
-          location: node.loc
-        };
-      }
-    }
-  });
-
-  return expression;
-}
-
-function getClosestExpression(source, token, location) {
-  var memberExpression = getClosestMemberExpression(source, token, location);
-  if (memberExpression) {
-    return memberExpression;
-  }
-
-  var path = getClosestPath(source, location);
-  if (!path || !path.node) {
-    return;
-  }
-
-  var node = path.node;
-
-  return { expression: getNodeValue(node), location: node.loc };
-}
-
-function getClosestScope(source, location) {
-  var closestPath = null;
-
-  (0, _ast.traverseAst)(source, {
-    enter(path) {
-      if (!(0, _contains.nodeContainsPosition)(path.node, location)) {
-        return path.skip();
-      }
-
-      if ((0, _helpers.isLexicalScope)(path)) {
-        closestPath = path;
-      }
-    }
-  });
-
-  if (!closestPath) {
-    return;
-  }
-
-  return closestPath.scope;
-}
-
-function getClosestPath(source, location) {
-  var closestPath = null;
-
-  (0, _ast.traverseAst)(source, {
-    enter(path) {
-      if (!(0, _contains.nodeContainsPosition)(path.node, location)) {
-        return path.skip();
-      }
-      closestPath = path;
-    }
-  });
-
-  return closestPath;
-}
-
-/***/ }),
-/* 1218 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.containsPosition = containsPosition;
-exports.containsLocation = containsLocation;
-exports.nodeContainsPosition = nodeContainsPosition;
-function containsPosition(a, b) {
-  var startsBefore = a.start.line < b.line || a.start.line === b.line && a.start.column <= b.column;
-  var endsAfter = a.end.line > b.line || a.end.line === b.line && a.end.column >= b.column;
-
-  return startsBefore && endsAfter;
-}
-
-function containsLocation(a, b) {
-  return containsPosition(a, b.start) && containsPosition(a, b.end);
-}
-
-function nodeContainsPosition(node, position) {
-  return containsPosition(node.loc, position);
-}
-
-/***/ }),
-/* 1219 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getSymbols;
-exports.formatSymbols = formatSymbols;
-exports.clearSymbols = clearSymbols;
-
-var _ast = __webpack_require__(1209);
-
-var _helpers = __webpack_require__(1212);
-
-var _babelTypes = __webpack_require__(493);
-
-var t = _interopRequireWildcard(_babelTypes);
-
-var _getFunctionName = __webpack_require__(1275);
-
-var _getFunctionName2 = _interopRequireDefault(_getFunctionName);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _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; } }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-var symbolDeclarations = new Map();
-
-function getFunctionParameterNames(path) {
-  return path.node.params.map(param => param.name);
-}
-
-function getVariableNames(path) {
-  if (t.isObjectProperty(path) && !(0, _helpers.isFunction)(path.node.value)) {
-    return [{
-      name: path.node.key.name,
-      location: path.node.loc
-    }];
-  }
-
-  if (!path.node.declarations) {
-    return path.node.params.map(dec => ({
-      name: dec.name,
-      location: dec.loc
-    }));
-  }
-
-  return path.node.declarations.map(dec => ({
-    name: dec.id.name,
-    location: dec.loc
-  }));
-}
-
-function getComments(ast) {
-  if (!ast || !ast.comments) {
-    return [];
-  }
-  return ast.comments.map(comment => ({
-    name: comment.location,
-    location: comment.loc
-  }));
-}
-
-function getClassName(path) {
-  var classDeclaration = path.findParent(_p => _p.isClassDeclaration());
-  if (!classDeclaration) {
-    return null;
-  }
-
-  return classDeclaration.node.id.name;
-}
-
-function extractSymbols(source) {
-  var functions = [];
-  var variables = [];
-  var memberExpressions = [];
-  var callExpressions = [];
-  var objectProperties = [];
-  var identifiers = [];
-
-  var ast = (0, _ast.traverseAst)(source, {
-    enter(path) {
-      if ((0, _helpers.isVariable)(path)) {
-        variables.push.apply(variables, _toConsumableArray(getVariableNames(path)));
-      }
-
-      if ((0, _helpers.isFunction)(path)) {
-        functions.push({
-          name: (0, _getFunctionName2.default)(path),
-          klass: getClassName(path),
-          location: path.node.loc,
-          parameterNames: getFunctionParameterNames(path),
-          identifier: path.node.id
-        });
-      }
-
-      if (t.isClassDeclaration(path)) {
-        variables.push({
-          name: path.node.id.name,
-          location: path.node.loc
-        });
-      }
-
-      if (t.isObjectProperty(path)) {
-        var _path$node$key$loc = path.node.key.loc,
-            start = _path$node$key$loc.start,
-            end = _path$node$key$loc.end,
-            identifierName = _path$node$key$loc.identifierName;
-
-        objectProperties.push({
-          name: identifierName,
-          location: { start, end },
-          expression: getSnippet(path)
-        });
-      }
-
-      if (t.isMemberExpression(path)) {
-        var _path$node$property$l = path.node.property.loc,
-            _start = _path$node$property$l.start,
-            _end = _path$node$property$l.end;
-
-        memberExpressions.push({
-          name: path.node.property.name,
-          location: { start: _start, end: _end },
-          expressionLocation: path.node.loc,
-          expression: getSnippet(path)
-        });
-      }
-
-      if (t.isCallExpression(path)) {
-        var callee = path.node.callee;
-        if (!t.isMemberExpression(callee)) {
-          var _callee$loc = callee.loc,
-              _start2 = _callee$loc.start,
-              _end2 = _callee$loc.end,
-              _identifierName = _callee$loc.identifierName;
-
-          callExpressions.push({
-            name: _identifierName,
-            location: { start: _start2, end: _end2 }
-          });
-        }
-      }
-
-      if (t.isIdentifier(path)) {
-        var _path$node$loc = path.node.loc,
-            _start3 = _path$node$loc.start,
-            _end3 = _path$node$loc.end;
-
-
-        identifiers.push({
-          name: path.node.name,
-          expression: path.node.name,
-          location: { start: _start3, end: _end3 }
-        });
-      }
-
-      if (t.isThisExpression(path.node)) {
-        var _path$node$loc2 = path.node.loc,
-            _start4 = _path$node$loc2.start,
-            _end4 = _path$node$loc2.end;
-
-        identifiers.push({
-          name: "this",
-          location: { start: _start4, end: _end4 },
-          expressionLocation: path.node.loc,
-          expression: "this"
-        });
-      }
-
-      if (t.isVariableDeclarator(path)) {
-        var node = path.node.id;
-        var _path$node$loc3 = path.node.loc,
-            _start5 = _path$node$loc3.start,
-            _end5 = _path$node$loc3.end;
-
-
-        identifiers.push({
-          name: node.name,
-          expression: node.name,
-          location: { start: _start5, end: _end5 }
-        });
-      }
-    }
-  });
-
-  // comments are extracted separately from the AST
-  var comments = getComments(ast);
-
-  return {
-    functions,
-    variables,
-    callExpressions,
-    memberExpressions,
-    objectProperties,
-    comments,
-    identifiers
-  };
-}
-
-function getSymbols(source) {
-  if (symbolDeclarations.has(source.id)) {
-    var _symbols = symbolDeclarations.get(source.id);
-    if (_symbols) {
-      return _symbols;
-    }
-  }
-
-  var symbols = extractSymbols(source);
-  symbolDeclarations.set(source.id, symbols);
-  return symbols;
-}
-
-function extendSnippet(name, expression, path, prevPath) {
-  var computed = path && path.node.computed;
-  var prevComputed = prevPath && prevPath.node.computed;
-  var prevArray = t.isArrayExpression(prevPath);
-  var array = t.isArrayExpression(path);
-
-  if (expression === "") {
-    if (computed) {
-      return `[${name}]`;
-    }
-    return name;
-  }
-
-  if (computed || array) {
-    if (prevComputed || prevArray) {
-      return `[${name}]${expression}`;
-    }
-    return `[${name}].${expression}`;
-  }
-
-  if (prevComputed || prevArray) {
-    return `${name}${expression}`;
-  }
-
-  return `${name}.${expression}`;
-}
-
-function getMemberSnippet(node) {
-  var expression = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
-
-  if (t.isMemberExpression(node)) {
-    var _name = node.property.name;
-
-    return getMemberSnippet(node.object, extendSnippet(_name, expression));
-  }
-
-  if (t.isCallExpression(node)) {
-    return "";
-  }
-
-  if (t.isThisExpression(node)) {
-    return `this.${expression}`;
-  }
-
-  if (t.isIdentifier(node)) {
-    return `${node.name}.${expression}`;
-  }
-
-  return expression;
-}
-
-function getObjectSnippet(path, prevPath) {
-  var expression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
-
-  if (!path) {
-    return expression;
-  }
-
-  var name = path.node.key.name;
-
-  var extendedExpression = extendSnippet(name, expression, path, prevPath);
-
-  var nextPrevPath = path;
-  var nextPath = path.parentPath && path.parentPath.parentPath;
-
-  return getSnippet(nextPath, nextPrevPath, extendedExpression);
-}
-
-function getArraySnippet(path, prevPath, expression) {
-  var index = prevPath.parentPath.key;
-  var extendedExpression = extendSnippet(index, expression, path, prevPath);
-
-  var nextPrevPath = path;
-  var nextPath = path.parentPath && path.parentPath.parentPath;
-
-  return getSnippet(nextPath, nextPrevPath, extendedExpression);
-}
-
-function getSnippet(path, prevPath) {
-  var expression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
-
-  if (t.isVariableDeclaration(path)) {
-    var node = path.node.declarations[0];
-    var _name2 = node.id.name;
-    return extendSnippet(_name2, expression, path, prevPath);
-  }
-
-  if (t.isVariableDeclarator(path)) {
-    var _node = path.node.id;
-    if (t.isObjectPattern(_node)) {
-      return expression;
-    }
-
-    var _name3 = _node.name;
-    var prop = extendSnippet(_name3, expression, path, prevPath);
-    return prop;
-  }
-
-  if (t.isAssignmentExpression(path)) {
-    var _node2 = path.node.left;
-    var _name4 = t.isMemberExpression(_node2) ? getMemberSnippet(_node2) : _node2.name;
-
-    var _prop = extendSnippet(_name4, expression, path, prevPath);
-    return _prop;
-  }
-
-  if ((0, _helpers.isFunction)(path)) {
-    return expression;
-  }
-
-  if (t.isIdentifier(path)) {
-    var _node3 = path.node;
-    return `${_node3.name}.${expression}`;
-  }
-
-  if (t.isObjectProperty(path)) {
-    return getObjectSnippet(path, prevPath, expression);
-  }
-
-  if (t.isObjectExpression(path)) {
-    var parentPath = prevPath && prevPath.parentPath;
-    return getObjectSnippet(parentPath, prevPath, expression);
-  }
-
-  if (t.isMemberExpression(path)) {
-    return getMemberSnippet(path.node, expression);
-  }
-
-  if (t.isArrayExpression(path)) {
-    return getArraySnippet(path, prevPath, expression);
-  }
-}
-
-function formatSymbols(source) {
-  var symbols = getSymbols(source);
-
-  function formatLocation(loc) {
-    if (!loc) {
-      return "";
-    }
-    var start = loc.start,
-        end = loc.end;
-
-
-    var startLoc = `(${start.line}, ${start.column})`;
-    var endLoc = `(${end.line}, ${end.column})`;
-    return `[${startLoc}, ${endLoc}]`;
-  }
-
-  function summarize(symbol) {
-    var loc = formatLocation(symbol.location);
-    var exprLoc = formatLocation(symbol.expressionLocation);
-    var params = symbol.parameterNames ? symbol.parameterNames.join(", ") : "";
-    var expression = symbol.expression || "";
-    var klass = symbol.klass || "";
-    return `${loc} ${exprLoc} ${expression} ${symbol.name} ${params} ${klass}`;
-  }
-
-  return Object.keys(symbols).map(name => `${name}:\n ${symbols[name].map(summarize).join("\n")}`);
-}
-
-function clearSymbols() {
-  symbolDeclarations = new Map();
-}
-
-/***/ }),
-/* 1220 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.hasSource = hasSource;
-exports.setSource = setSource;
-exports.getSource = getSource;
-exports.clearSources = clearSources;
-
-
-var cachedSources = new Map();
-
-function hasSource(sourceId) {
-  return cachedSources.has(sourceId);
-}
-
-function setSource(source) {
-  cachedSources.set(source.id, source);
-}
-
-function getSource(sourceId) {
-  if (!cachedSources.has(sourceId)) {
-    throw new Error(`${sourceId} was not provided.`);
-  }
-  return cachedSources.get(sourceId);
-}
-
-function clearSources() {
-  cachedSources = new Map();
-}
-
-/***/ }),
-/* 1221 */,
-/* 1222 */,
-/* 1223 */,
-/* 1224 */,
-/* 1225 */,
-/* 1226 */,
-/* 1227 */,
-/* 1228 */,
-/* 1229 */,
-/* 1230 */,
-/* 1231 */,
-/* 1232 */,
-/* 1233 */,
-/* 1234 */,
-/* 1235 */,
-/* 1236 */,
-/* 1237 */,
-/* 1238 */,
-/* 1239 */,
-/* 1240 */,
-/* 1241 */,
-/* 1242 */,
-/* 1243 */,
-/* 1244 */,
-/* 1245 */,
-/* 1246 */,
-/* 1247 */,
-/* 1248 */,
-/* 1249 */,
-/* 1250 */,
-/* 1251 */,
-/* 1252 */,
-/* 1253 */,
-/* 1254 */,
-/* 1255 */,
-/* 1256 */,
-/* 1257 */,
-/* 1258 */,
-/* 1259 */,
-/* 1260 */,
-/* 1261 */,
-/* 1262 */,
-/* 1263 */,
-/* 1264 */,
-/* 1265 */,
-/* 1266 */,
-/* 1267 */,
-/* 1268 */,
-/* 1269 */,
-/* 1270 */,
-/* 1271 */,
-/* 1272 */
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(1273);
-
-
-/***/ }),
-/* 1273 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _closest = __webpack_require__(1217);
-
-var _scopes = __webpack_require__(1274);
-
-var _getSymbols = __webpack_require__(1219);
-
-var _getSymbols2 = _interopRequireDefault(_getSymbols);
-
-var _ast = __webpack_require__(1209);
-
-var _getScopes = __webpack_require__(1276);
-
-var _getScopes2 = _interopRequireDefault(_getScopes);
-
-var _sources = __webpack_require__(1220);
-
-var _getOutOfScopeLocations = __webpack_require__(1277);
-
-var _getOutOfScopeLocations2 = _interopRequireDefault(_getOutOfScopeLocations);
-
-var _steps = __webpack_require__(1278);
-
-var _getEmptyLines = __webpack_require__(1280);
-
-var _getEmptyLines2 = _interopRequireDefault(_getEmptyLines);
-
-var _validate = __webpack_require__(1281);
-
-var _devtoolsUtils = __webpack_require__(900);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var workerHandler = _devtoolsUtils.workerUtils.workerHandler;
-
-
-self.onmessage = workerHandler({
-  getClosestExpression: _closest.getClosestExpression,
-  getOutOfScopeLocations: _getOutOfScopeLocations2.default,
-  getSymbols: _getSymbols2.default,
-  getScopes: _getScopes2.default,
-  clearSymbols: _getSymbols.clearSymbols,
-  clearScopes: _getScopes.clearScopes,
-  clearASTs: _ast.clearASTs,
-  hasSource: _sources.hasSource,
-  setSource: _sources.setSource,
-  clearSources: _sources.clearSources,
-  getVariablesInScope: _scopes.getVariablesInScope,
-  getNextStep: _steps.getNextStep,
-  getEmptyLines: _getEmptyLines2.default,
-  hasSyntaxError: _validate.hasSyntaxError
-});
-
-/***/ }),
-/* 1274 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-exports.getVariablesInLocalScope = getVariablesInLocalScope;
-exports.getVariablesInScope = getVariablesInScope;
-exports.isExpressionInScope = isExpressionInScope;
-
-var _toPairs = __webpack_require__(795);
-
-var _toPairs2 = _interopRequireDefault(_toPairs);
-
-var _uniq = __webpack_require__(561);
-
-var _uniq2 = _interopRequireDefault(_uniq);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-function getScopeVariables(scope) {
-  var bindings = scope.bindings;
-
-
-  return (0, _toPairs2.default)(bindings).map((_ref) => {
-    var _ref2 = _slicedToArray(_ref, 2),
-        name = _ref2[0],
-        binding = _ref2[1];
-
-    return {
-      name,
-      references: binding.referencePaths
-    };
-  });
-}
-
-function getScopeChain(scope) {
-  var scopes = [];
-
-  do {
-    scopes.push(scope);
-  } while (scope = scope.parent);
-
-  return scopes;
-}
-
-function getVariablesInLocalScope(scope) {
-  return getScopeVariables(scope);
-}
-
-function getVariablesInScope(scope) {
-  var _ref3;
-
-  var scopes = getScopeChain(scope);
-  var scopeVars = scopes.map(getScopeVariables);
-  var vars = (_ref3 = [{ name: "this" }, { name: "arguments" }]).concat.apply(_ref3, _toConsumableArray(scopeVars)).map(variable => variable.name);
-  return (0, _uniq2.default)(vars);
-}
-
-function isExpressionInScope(expression, scope) {
-  if (!scope) {
-    return false;
-  }
-
-  var variables = getVariablesInScope(scope);
-  var firstPart = expression.split(/\./)[0];
-  return variables.includes(firstPart);
-}
-
-/***/ }),
-/* 1275 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getFunctionName;
-function getFunctionName(path) {
-  if (path.node.id) {
-    return path.node.id.name;
-  }
-
-  var parent = path.parent;
-  if (parent.type == "ObjectProperty") {
-    return parent.key.name;
-  }
-
-  if (parent.type == "ObjectExpression" || path.node.type == "ClassMethod") {
-    return path.node.key.name;
-  }
-
-  if (parent.type == "VariableDeclarator") {
-    return parent.id.name;
-  }
-
-  if (parent.type == "AssignmentExpression") {
-    if (parent.left.type == "MemberExpression") {
-      return parent.left.property.name;
-    }
-
-    return parent.left.name;
-  }
-
-  return "anonymous";
-}
-
-/***/ }),
-/* 1276 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getScopes;
-exports.clearScopes = clearScopes;
-
-var _ast = __webpack_require__(1209);
-
-var _sources = __webpack_require__(1220);
-
-var _parser = __webpack_require__(1187);
-
-var parsedScopesCache = new Map();
-
-function getScopes(location) {
-  var sourceId = location.sourceId;
-
-  var parsedScopes = parsedScopesCache.get(sourceId);
-  if (!parsedScopes) {
-    var visitor = (0, _parser.createParseJSScopeVisitor)(sourceId);
-    (0, _ast.traverseAst)((0, _sources.getSource)(sourceId), visitor.traverseVisitor);
-    parsedScopes = visitor.toParsedScopes();
-    parsedScopesCache.set(sourceId, parsedScopes);
-  }
-  return (0, _parser.findScopes)(parsedScopes, location);
-}
-
-function clearScopes() {
-  parsedScopesCache = new Map();
-}
-
-/***/ }),
-/* 1277 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _get = __webpack_require__(1073);
-
-var _get2 = _interopRequireDefault(_get);
-
-var _contains = __webpack_require__(1218);
-
-var _getSymbols2 = __webpack_require__(1219);
-
-var _getSymbols3 = _interopRequireDefault(_getSymbols2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function findSymbols(source) {
-  var _getSymbols = (0, _getSymbols3.default)(source),
-      functions = _getSymbols.functions,
-      comments = _getSymbols.comments;
-
-  return { functions, comments };
-}
-
-/**
- * Returns the location for a given function path. If the path represents a
- * function declaration, the location will begin after the function identifier
- * but before the function parameters.
- */
-
-function getLocation(func) {
-  var location = _extends({}, func.location);
-
-  // if the function has an identifier, start the block after it so the
-  // identifier is included in the "scope" of its parent
-  var identifierEnd = (0, _get2.default)("identifier.loc.end", func);
-  if (identifierEnd) {
-    location.start = identifierEnd;
-  }
-
-  return location;
-}
-
-/**
- * Reduces an array of locations to remove items that are completely enclosed
- * by another location in the array.
- */
-function removeOverlaps(locations, location) {
-  // support reducing without an initializing array
-  if (!Array.isArray(locations)) {
-    locations = [locations];
-  }
-
-  var contains = locations.filter(a => (0, _contains.containsLocation)(a, location)).length > 0;
-
-  if (!contains) {
-    locations.push(location);
-  }
-
-  return locations;
-}
-
-/**
- * Sorts an array of locations by start position
- */
-function sortByStart(a, b) {
-  if (a.start.line < b.start.line) {
-    return -1;
-  } else if (a.start.line === b.start.line) {
-    return a.start.column - b.start.column;
-  }
-
-  return 1;
-}
-
-/**
- * Returns an array of locations that are considered out of scope for the given
- * location.
- */
-function getOutOfScopeLocations(source, position) {
-  var _findSymbols = findSymbols(source),
-      functions = _findSymbols.functions,
-      comments = _findSymbols.comments;
-
-  var commentLocations = comments.map(c => c.location);
-
-  return functions.map(getLocation).concat(commentLocations).filter(loc => !(0, _contains.containsPosition)(loc, position)).reduce(removeOverlaps, []).sort(sortByStart);
-}
-
-exports.default = getOutOfScopeLocations;
-
-/***/ }),
-/* 1278 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-exports.getNextStep = getNextStep;
-
-var _debuggerHtml = __webpack_require__(843);
-
-var _types = __webpack_require__(1279);
-
-var _closest = __webpack_require__(1217);
-
-var _helpers = __webpack_require__(1212);
-
-function getNextStep(source, pausedPosition) {
-  var currentExpression = getSteppableExpression(source, pausedPosition);
-  if (!currentExpression) {
-    return null;
-  }
-  var currentStatement = currentExpression.getStatementParent();
-  return _getNextStep(currentStatement, pausedPosition);
-}
-
-function getSteppableExpression(source, pausedPosition) {
-  var closestPath = (0, _closest.getClosestPath)(source, pausedPosition);
-
-  if (!closestPath) {
-    return null;
-  }
-
-  if ((0, _helpers.isAwaitExpression)(closestPath) || (0, _helpers.isYieldExpression)(closestPath)) {
-    return closestPath;
-  }
-
-  return closestPath.find(p => p.isAwaitExpression() || p.isYieldExpression());
-}
-
-function _getNextStep(statement, position) {
-  var nextStatement = statement.getSibling(statement.key + 1);
-  if (nextStatement.node) {
-    return _extends({}, nextStatement.node.loc.start, {
-      sourceId: position.sourceId
-    });
-  }
-
-  return null;
-}
-
-/***/ }),
-/* 1279 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-/***/ }),
-/* 1280 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getEmptyLines;
-
-var _uniq = __webpack_require__(561);
-
-var _uniq2 = _interopRequireDefault(_uniq);
-
-var _difference = __webpack_require__(1129);
-
-var _difference2 = _interopRequireDefault(_difference);
-
-var _ast = __webpack_require__(1209);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var commentTokens = ["CommentBlock", "CommentLine"];
-
-function fillRange(start, end) {
-  return Array(end - start + 1).fill().map((item, index) => start + index);
-}
-
-// Populates a pre-filled array of every line number,
-// then removes lines which were found to be executable
-function getLines(ast) {
-  return fillRange(0, ast.tokens[ast.tokens.length - 1].loc.end.line);
-}
-
-// The following sequence stores lines which have executable code
-// (contents other than comments or EOF, regardless of line position)
-function getExecutableLines(ast) {
-  var lines = ast.tokens.filter(token => !commentTokens.includes(token.type) && (!token.type || token.type.label && token.type.label != "eof")).map(token => token.loc.start.line - 1);
-
-  return (0, _uniq2.default)(lines);
-}
-
-function getEmptyLines(sourceToJS) {
-  if (!sourceToJS) {
-    return null;
-  }
-
-  var ast = (0, _ast.getAst)(sourceToJS);
-  if (!ast || !ast.comments) {
-    return [];
-  }
-
-  var executableLines = getExecutableLines(ast);
-  var lines = getLines(ast);
-  return (0, _difference2.default)(lines, executableLines);
-}
-
-/***/ }),
-/* 1281 */
+/* 1207 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.hasSyntaxError = hasSyntaxError;
 
-var _ast = __webpack_require__(1209);
+var _ast = __webpack_require__(1051);
 
 function hasSyntaxError(input) {
   try {
     (0, _ast.parseExpression)(input);
     return false;
   } catch (e) {
     return `${e.name} : ${e.message}`;
   }
--- a/devtools/client/debugger/new/pretty-print-worker.js
+++ b/devtools/client/debugger/new/pretty-print-worker.js
@@ -65,83 +65,26 @@ return /******/ (function(modules) { // 
 /******/
 /******/ 	// Object.prototype.hasOwnProperty.call
 /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
 /******/
 /******/ 	// __webpack_public_path__
 /******/ 	__webpack_require__.p = "/assets/build";
 /******/
 /******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1282);
+/******/ 	return __webpack_require__(__webpack_require__.s = 380);
 /******/ })
 /************************************************************************/
 /******/ ({
 
-/***/ 1282:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(1283);
-
-
-/***/ }),
-
-/***/ 1283:
+/***/ 380:
 /***/ (function(module, exports, __webpack_require__) {
 
-"use strict";
-
-
-var _prettyFast = __webpack_require__(802);
-
-var _prettyFast2 = _interopRequireDefault(_prettyFast);
-
-var _devtoolsUtils = __webpack_require__(900);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var workerHandler = _devtoolsUtils.workerUtils.workerHandler;
-
-
-function prettyPrint(_ref) {
-  var url = _ref.url,
-      indent = _ref.indent,
-      source = _ref.source;
-
-  var prettified = (0, _prettyFast2.default)(source, {
-    url: url,
-    indent: " ".repeat(indent)
-  });
-
-  return {
-    code: prettified.code,
-    mappings: invertMappings(prettified.map._mappings)
-  };
-}
-
-function invertMappings(mappings) {
-  return mappings._array.map(m => {
-    var mapping = {
-      generated: {
-        line: m.originalLine,
-        column: m.originalColumn
-      }
-    };
-    if (m.source) {
-      mapping.source = m.source;
-      mapping.original = {
-        line: m.generatedLine,
-        column: m.generatedColumn
-      };
-      mapping.name = m.name;
-    }
-    return mapping;
-  });
-}
-
-self.onmessage = workerHandler({ prettyPrint });
+module.exports = __webpack_require__(964);
+
 
 /***/ }),
 
 /***/ 381:
 /***/ (function(module, exports, __webpack_require__) {
 
 var require;var require;(function(f){if(true){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.acorn = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 // A recursive descent parser operates by defining functions for all
@@ -7584,12 +7527,69 @@ function streamingWorkerHandler(publicIn
 }
 
 module.exports = {
   WorkerDispatcher,
   workerHandler,
   streamingWorkerHandler
 };
 
+/***/ }),
+
+/***/ 964:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _prettyFast = __webpack_require__(802);
+
+var _prettyFast2 = _interopRequireDefault(_prettyFast);
+
+var _devtoolsUtils = __webpack_require__(900);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var workerHandler = _devtoolsUtils.workerUtils.workerHandler;
+
+
+function prettyPrint(_ref) {
+  var url = _ref.url,
+      indent = _ref.indent,
+      source = _ref.source;
+
+  var prettified = (0, _prettyFast2.default)(source, {
+    url: url,
+    indent: " ".repeat(indent)
+  });
+
+  return {
+    code: prettified.code,
+    mappings: invertMappings(prettified.map._mappings)
+  };
+}
+
+function invertMappings(mappings) {
+  return mappings._array.map(m => {
+    var mapping = {
+      generated: {
+        line: m.originalLine,
+        column: m.originalColumn
+      }
+    };
+    if (m.source) {
+      mapping.source = m.source;
+      mapping.original = {
+        line: m.generatedLine,
+        column: m.generatedColumn
+      };
+      mapping.name = m.name;
+    }
+    return mapping;
+  });
+}
+
+self.onmessage = workerHandler({ prettyPrint });
+
 /***/ })
 
 /******/ });
 });
\ No newline at end of file
--- a/devtools/client/debugger/new/search-worker.js
+++ b/devtools/client/debugger/new/search-worker.js
@@ -65,17 +65,17 @@ return /******/ (function(modules) { // 
 /******/
 /******/ 	// Object.prototype.hasOwnProperty.call
 /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
 /******/
 /******/ 	// __webpack_public_path__
 /******/ 	__webpack_require__.p = "/assets/build";
 /******/
 /******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1284);
+/******/ 	return __webpack_require__(__webpack_require__.s = 382);
 /******/ })
 /************************************************************************/
 /******/ ({
 
 /***/ 10:
 /***/ (function(module, exports, __webpack_require__) {
 
 var Symbol = __webpack_require__(7);
@@ -259,16 +259,178 @@ function arrayMap(array, iteratee) {
   return result;
 }
 
 module.exports = arrayMap;
 
 
 /***/ }),
 
+/***/ 1123:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _getMatches = __webpack_require__(1173);
+
+var _getMatches2 = _interopRequireDefault(_getMatches);
+
+var _projectSearch = __webpack_require__(1140);
+
+var _devtoolsUtils = __webpack_require__(900);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var workerHandler = _devtoolsUtils.workerUtils.workerHandler;
+
+
+self.onmessage = workerHandler({ getMatches: _getMatches2.default, findSourceMatches: _projectSearch.findSourceMatches });
+
+/***/ }),
+
+/***/ 1138:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = buildQuery;
+
+var _escapeRegExp = __webpack_require__(259);
+
+var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function ignoreWhiteSpace(str) {
+  return (/^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str
+  );
+}
+
+
+function wholeMatch(query, wholeWord) {
+  if (query === "" || !wholeWord) {
+    return query;
+  }
+
+  return `\\b${query}\\b`;
+}
+
+function buildFlags(caseSensitive, isGlobal) {
+  if (caseSensitive && isGlobal) {
+    return "g";
+  }
+
+  if (!caseSensitive && isGlobal) {
+    return "gi";
+  }
+
+  if (!caseSensitive && !isGlobal) {
+    return "i";
+  }
+
+  return;
+}
+
+function buildQuery(originalQuery, modifiers, _ref) {
+  var _ref$isGlobal = _ref.isGlobal,
+      isGlobal = _ref$isGlobal === undefined ? false : _ref$isGlobal,
+      _ref$ignoreSpaces = _ref.ignoreSpaces,
+      ignoreSpaces = _ref$ignoreSpaces === undefined ? false : _ref$ignoreSpaces;
+  var caseSensitive = modifiers.caseSensitive,
+      regexMatch = modifiers.regexMatch,
+      wholeWord = modifiers.wholeWord;
+
+
+  if (originalQuery === "") {
+    return new RegExp(originalQuery);
+  }
+
+  var query = originalQuery;
+  if (ignoreSpaces) {
+    query = ignoreWhiteSpace(query);
+  }
+
+  if (!regexMatch) {
+    query = (0, _escapeRegExp2.default)(query);
+  }
+
+  query = wholeMatch(query, wholeWord);
+  var flags = buildFlags(caseSensitive, isGlobal);
+
+  if (flags) {
+    return new RegExp(query, flags);
+  }
+
+  return new RegExp(query);
+}
+
+/***/ }),