Backed out changeset 656d53c7fd81 (bug 1406551) as requested by jdescottes. r=backout
authorSebastian Hengst <archaeopteryx@coole-files.de>
Tue, 10 Oct 2017 19:22:37 +0200
changeset 427964 76c5694baa724b9ce8c6ee87109bff2970d3f6a7
parent 427963 29feebd767db2f160e1c2cfc3c573d4b0b2b0e5e
child 427967 5f7ed7b8415bfb5654b296175230d9dc92cacddd
push id97
push userfmarier@mozilla.com
push dateSat, 14 Oct 2017 01:12:59 +0000
reviewersbackout
bugs1406551
milestone58.0a1
backs out656d53c7fd810507564844a6b0b732c116ad8efd
Backed out changeset 656d53c7fd81 (bug 1406551) as requested by jdescottes. r=backout
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: ed61626e63720c5b8c354e5f26e31aec8d95539c
-
-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;
 }
@@ -1542,38 +1537,24 @@ html[dir="rtl"] .managed-tree .tree .nod
   text-align: center;
   padding: 0.5em;
   user-select: none;
   font-size: 12px;
 }
 
 .outline-list {
   list-style-type: none;
+  padding-left: 0px;
   width: 100%;
-  padding: 10px;
-  margin: 0;
-}
-
-.outline-list__class-list {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-  padding-left: 10px;
-}
-
-.outline-list h2 {
-  font-weight: normal;
-  font-size: 1em;
-  margin: 10px 0;
-  color: var(--theme-body-color);
 }
 
 .outline-list__element {
   color: blue;
   padding-bottom: 0.2rem;
+  padding-left: 1rem;
   padding-right: 0.5rem;
   padding-top: 0.2rem;
   cursor: default;
 }
 
 .outline-list__element:hover {
   background: var(--theme-toolbar-background-hover);
 }
@@ -1591,16 +1572,50 @@ html[dir="rtl"] .managed-tree .tree .nod
 
 .function-signature .paren {
   color: var(--object-color);
 }
 
 .function-signature .comma {
   color: var(--object-color);
 }
+.conditional-breakpoint-panel {
+  cursor: initial;
+  margin: 1em 0;
+  position: relative;
+  display: flex;
+  align-items: center;
+  background: var(--theme-toolbar-background);
+  border-top: 1px solid var(--theme-splitter-color);
+  border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.conditional-breakpoint-panel .prompt {
+  font-size: 1.8em;
+  color: var(--theme-conditional-breakpoint-color);
+  padding-left: 3px;
+  padding-right: 3px;
+  padding-bottom: 3px;
+  text-align: right;
+  width: 30px;
+}
+
+.conditional-breakpoint-panel input {
+  margin: 5px 10px;
+  width: calc(100% - 4em);
+  border: none;
+  background: var(--theme-toolbar-background);
+  font-size: 14px;
+  color: var(--theme-conditional-breakpoint-color);
+  line-height: 30px;
+}
+
+.conditional-breakpoint-panel input:focus {
+  outline-width: 0;
+}
 .toggle-button-start,
 .toggle-button-end {
   transform: translate(0, 0px);
   transition: transform 0.25s ease-in-out;
   padding: 5px 5px;
 }
 
 .toggle-button-start.vertical,
@@ -2309,50 +2324,16 @@ html[dir="rtl"] .arrow svg,
 }
 
 .theme-dark .call-site-bp::before {
   border-bottom-color: #dd4d4d;
 }
 .empty-line .CodeMirror-linenumber {
   opacity: 0.5;
 }
-.conditional-breakpoint-panel {
-  cursor: initial;
-  margin: 1em 0;
-  position: relative;
-  display: flex;
-  align-items: center;
-  background: var(--theme-toolbar-background);
-  border-top: 1px solid var(--theme-splitter-color);
-  border-bottom: 1px solid var(--theme-splitter-color);
-}
-
-.conditional-breakpoint-panel .prompt {
-  font-size: 1.8em;
-  color: var(--theme-conditional-breakpoint-color);
-  padding-left: 3px;
-  padding-right: 3px;
-  padding-bottom: 3px;
-  text-align: right;
-  width: 30px;
-}
-
-.conditional-breakpoint-panel input {
-  margin: 5px 10px;
-  width: calc(100% - 4em);
-  border: none;
-  background: var(--theme-toolbar-background);
-  font-size: 14px;
-  color: var(--theme-conditional-breakpoint-color);
-  line-height: 30px;
-}
-
-.conditional-breakpoint-panel input:focus {
-  outline-width: 0;
-}
 .editor-wrapper {
   --debug-line-border: rgb(145, 188, 219);
   --debug-expression-background: rgba(202, 227, 255, 0.5);
   --editor-searchbar-height: 27px;
   --editor-second-searchbar-height: 27px;
 }
 
 .theme-dark .editor-wrapper {
@@ -2367,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);
@@ -2638,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,
@@ -3039,16 +3024,17 @@ html .breakpoints-list .breakpoint.pause
 .accordion .header-buttons button::-moz-focus-inner {
   border: none;
 }
 .command-bar {
   flex: 0 0 29px;
   border-bottom: 1px solid var(--theme-splitter-color);
   display: flex;
   overflow: hidden;
+  position: sticky;
   z-index: 1;
   background-color: var(--theme-toolbar-background);
 }
 
 html[dir="rtl"] .command-bar {
   border-right: 1px solid var(--theme-splitter-color);
 }
 
@@ -3153,37 +3139,32 @@ html .command-bar > button:disabled {
 .scopes-pane {
   overflow: auto;
 }
 
 .scopes-list .function-signature {
   display: inline-block;
 }
 .secondary-panes {
-  overflow: scroll;
   display: flex;
   flex-direction: column;
   flex: 1;
   white-space: nowrap;
   --breakpoint-expression-right-clear-space: 36px;
 }
 
 /*
   We apply overflow to the container with the commandbar.
   This allows the commandbar to remain fixed when scrolling
   until the content completely ends. Not just the height of
   the wrapper.
   Ref: https://github.com/devtools-html/debugger.html/issues/3426
 */
-
-.secondary-panes-wrapper {
-  height: 100%;
-  width: 100%;
-  display: flex;
-  flex-direction: column;
+.secondary-panes--sticky-commandbar {
+  overflow-y: scroll;
 }
 
 .secondary-panes .accordion {
   flex: 1 0 auto;
 }
 
 .pane {
   color: var(--theme-body-color);
@@ -3230,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,19 +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 => {
-    var status = action.status == "done" ? "<-" : "->";
-    var asyncMsg = !action.status ? "" : status;
-    console.log(action, asyncMsg);
+    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__) {
 
@@ -13595,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) {
@@ -13889,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);
@@ -13911,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"],
@@ -14603,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);
@@ -14702,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 }
   },
@@ -14866,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__) {
@@ -15031,17 +14984,16 @@ var _extends = Object.assign || function
  */
 
 exports.initialState = initialState;
 exports.getBreakpoints = getBreakpoints;
 exports.getBreakpoint = getBreakpoint;
 exports.getBreakpointsDisabled = getBreakpointsDisabled;
 exports.getBreakpointsLoading = getBreakpointsLoading;
 exports.getBreakpointsForSource = getBreakpointsForSource;
-exports.getBreakpointForLine = getBreakpointForLine;
 
 var _immutable = __webpack_require__(146);
 
 var I = _interopRequireWildcard(_immutable);
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
@@ -15197,24 +15149,16 @@ function getBreakpointsForSource(state, 
   var breakpoints = getBreakpoints(state);
 
   return breakpoints.filter(bp => {
     var location = isGeneratedSource ? bp.generatedLocation || bp.location : bp.location;
     return location.sourceId === sourceId;
   });
 }
 
-function getBreakpointForLine(state, sourceId, line) {
-  if (!sourceId) {
-    return I.Map();
-  }
-  var breakpoints = getBreakpointsForSource(state, sourceId);
-  return breakpoints.find(breakpoint => breakpoint.location.line === line);
-}
-
 var getHiddenBreakpoint = exports.getHiddenBreakpoint = (0, _reselect.createSelector)(getBreakpoints, function (breakpoints) {
   var hiddenBreakpoints = breakpoints.valueSeq().filter(breakpoint => breakpoint.hidden).first();
   return hiddenBreakpoints;
 });
 
 var getHiddenBreakpointLocation = exports.getHiddenBreakpointLocation = (0, _reselect.createSelector)(getHiddenBreakpoint, function (hiddenBreakpoint) {
   if (!hiddenBreakpoint) {
     return null;
@@ -15390,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;
@@ -15573,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);
 }
 
@@ -15649,43 +15579,41 @@ exports.default = update;
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.State = undefined;
 exports.getActiveSearch = getActiveSearch;
-exports.getContextMenu = getContextMenu;
 exports.getFileSearchQueryState = getFileSearchQueryState;
 exports.getFileSearchModifierState = getFileSearchModifierState;
 exports.getSearchResults = getSearchResults;
 exports.getFrameworkGroupingState = getFrameworkGroupingState;
 exports.getSymbolSearchType = getSymbolSearchType;
 exports.getShownSource = getShownSource;
 exports.getPaneCollapse = getPaneCollapse;
 exports.getHighlightedLineRange = getHighlightedLineRange;
-exports.getConditionalPanelLine = getConditionalPanelLine;
+exports.getConditionalBreakpointPanel = getConditionalBreakpointPanel;
 
 var _makeRecord = __webpack_require__(230);
 
 var _makeRecord2 = _interopRequireDefault(_makeRecord);
 
 var _prefs = __webpack_require__(226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /**
  * UI reducer
  * @module reducers/ui
  */
 
 var State = exports.State = (0, _makeRecord2.default)({
   activeSearch: null,
-  contextMenu: {},
   fileSearchQuery: "",
   fileSearchModifiers: (0, _makeRecord2.default)({
     caseSensitive: _prefs.prefs.fileSearchCaseSensitive,
     wholeWord: _prefs.prefs.fileSearchWholeWord,
     regexMatch: _prefs.prefs.fileSearchRegexMatch
   })(),
   symbolSearchType: "functions",
   searchResults: {
@@ -15694,17 +15622,17 @@ var State = exports.State = (0, _makeRec
     index: -1,
     count: 0
   },
   shownSource: "",
   startPanelCollapsed: _prefs.prefs.startPanelCollapsed,
   endPanelCollapsed: _prefs.prefs.endPanelCollapsed,
   frameworkGroupingOn: _prefs.prefs.frameworkGroupingOn,
   highlightedLineRange: undefined,
-  conditionalPanelLine: null
+  conditionalBreakpointPanel: null
 });
 
 function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : State();
   var action = arguments[1];
 
   switch (action.type) {
     case "TOGGLE_ACTIVE_SEARCH":
@@ -15747,21 +15675,16 @@ function update() {
         return state.setIn(["fileSearchModifiers", action.modifier], actionVal);
       }
 
     case "SET_SYMBOL_SEARCH_TYPE":
       {
         return state.set("symbolSearchType", action.symbolType);
       }
 
-    case "SET_CONTEXT_MENU":
-      {
-        return state.set("contextMenu", action.contextMenu);
-      }
-
     case "SHOW_SOURCE":
       {
         return state.set("shownSource", action.sourceUrl);
       }
 
     case "TOGGLE_PANE":
       {
         if (action.position == "start") {
@@ -15785,39 +15708,32 @@ function update() {
         lineRange = { start: _start, end: _end, sourceId: _sourceId };
       }
 
       return state.set("highlightedLineRange", lineRange);
 
     case "CLEAR_HIGHLIGHT_LINES":
       return state.set("highlightedLineRange", {});
 
-    case "OPEN_CONDITIONAL_PANEL":
-      return state.set("conditionalPanelLine", action.line);
-
-    case "CLOSE_CONDITIONAL_PANEL":
-      return state.set("conditionalPanelLine", null);
+    case "TOGGLE_CONDITIONAL_BREAKPOINT_PANEL":
+      return state.set("conditionalBreakpointPanel", action.line);
 
     default:
       {
         return state;
       }
   }
 }
 
 // NOTE: we'd like to have the app state fully typed
 // https://github.com/devtools-html/debugger.html/blob/master/src/reducers/sources.js#L179-L185
 function getActiveSearch(state) {
   return state.ui.get("activeSearch");
 }
 
-function getContextMenu(state) {
-  return state.ui.get("contextMenu");
-}
-
 function getFileSearchQueryState(state) {
   return state.ui.get("fileSearchQuery");
 }
 
 function getFileSearchModifierState(state) {
   return state.ui.get("fileSearchModifiers");
 }
 
@@ -15844,18 +15760,18 @@ function getPaneCollapse(state, position
 
   return state.ui.get("endPanelCollapsed");
 }
 
 function getHighlightedLineRange(state) {
   return state.ui.get("highlightedLineRange");
 }
 
-function getConditionalPanelLine(state) {
-  return state.ui.get("conditionalPanelLine");
+function getConditionalBreakpointPanel(state) {
+  return state.ui.get("conditionalBreakpointPanel");
 }
 
 exports.default = update;
 
 /***/ }),
 /* 241 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -15925,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);
 
@@ -16003,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 */
@@ -16021,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);
 
@@ -16047,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);
@@ -16115,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);
   }
 
@@ -16147,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;
 
 
@@ -16327,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);
 
@@ -16456,18 +16360,16 @@ var _breakpoint = __webpack_require__(10
 var _addBreakpoint = __webpack_require__(1136);
 
 var _addBreakpoint2 = _interopRequireDefault(_addBreakpoint);
 
 var _remapLocations = __webpack_require__(188);
 
 var _remapLocations2 = _interopRequireDefault(_remapLocations);
 
-var _ast = __webpack_require__(1058);
-
 var _syncBreakpoint = __webpack_require__(1137);
 
 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"); }); }; }
 /* 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/. */
@@ -16857,22 +16759,20 @@ function setBreakpointCondition(location
 
 function toggleBreakpoint(line, column) {
   return (_ref33) => {
     var dispatch = _ref33.dispatch,
         getState = _ref33.getState,
         client = _ref33.client,
         sourceMaps = _ref33.sourceMaps;
 
-    var state = getState();
-    var selectedSource = (0, _selectors.getSelectedSource)(state);
-    var bp = (0, _selectors.getBreakpointAtLocation)(state, { line, column });
-    var isEmptyLine = (0, _ast.isEmptyLineInSource)(state, line, selectedSource.toJS());
-
-    if (isEmptyLine || bp && bp.loading) {
+    var selectedSource = (0, _selectors.getSelectedSource)(getState());
+    var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
+
+    if (bp && bp.loading) {
       return;
     }
 
     if (bp) {
       // NOTE: it's possible the breakpoint has slid to a column
       return dispatch(removeBreakpoint({
         sourceId: bp.location.sourceId,
         sourceUrl: bp.location.sourceUrl,
@@ -17283,60 +17183,26 @@ function isSlowBuffer (obj) {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getMappedExpression = undefined;
-
-/**
- * Gets information about original variable names from the source map
- * and replaces all posible generated names.
- */
-var getMappedExpression = exports.getMappedExpression = (() => {
-  var _ref9 = _asyncToGenerator(function* (_ref10, generatedLocation, expression) {
-    var sourceMaps = _ref10.sourceMaps;
-
-    var astScopes = yield parser.getScopes(generatedLocation);
-
-    var generatedScopes = yield sourceMaps.getLocationScopes(generatedLocation, astScopes);
-
-    if (!generatedScopes) {
-      return expression;
-    }
-
-    return (0, _utils.replaceOriginalVariableName)(expression, generatedScopes);
-  });
-
-  return function getMappedExpression(_x4, _x5, _x6) {
-    return _ref9.apply(this, arguments);
-  };
-})();
-
 exports.addExpression = addExpression;
 exports.updateExpression = updateExpression;
 exports.deleteExpression = deleteExpression;
 exports.evaluateExpressions = evaluateExpressions;
 
 var _selectors = __webpack_require__(242);
 
-var _promise = __webpack_require__(193);
-
-var _utils = __webpack_require__(1206);
-
-var _sources = __webpack_require__(254);
-
-var _devtoolsSourceMap = __webpack_require__(898);
-
 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"); }); }; }
 
 /**
@@ -17439,56 +17305,31 @@ function evaluateExpressions() {
   })();
 }
 
 function evaluateExpression(expression) {
   return (() => {
     var _ref7 = _asyncToGenerator(function* (_ref8) {
       var dispatch = _ref8.dispatch,
           getState = _ref8.getState,
-          client = _ref8.client,
-          sourceMaps = _ref8.sourceMaps;
+          client = _ref8.client;
 
       if (!expression.input) {
         console.warn("Expressions should not be empty");
         return;
       }
 
-      var input = expression.input;
-      var error = yield parser.hasSyntaxError(input);
-      if (error) {
-        return dispatch({
-          type: "EVALUATE_EXPRESSION",
-          input: expression.input,
-          value: { input: expression.input, result: error }
-        });
-      }
-
-      var frame = (0, _selectors.getSelectedFrame)(getState());
-
-      if (frame) {
-        var location = frame.location,
-            generatedLocation = frame.generatedLocation;
-
-        var source = (0, _selectors.getSource)(getState(), location.sourceId);
-        var sourceId = source.get("id");
-
-        if (!(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
-          var generatedSourceId = generatedLocation.sourceId;
-          yield dispatch((0, _sources.ensureParserHasSourceText)(generatedSourceId));
-
-          input = yield getMappedExpression({ sourceMaps }, generatedLocation, input);
-        }
-      }
-
+      var error = yield parser.hasSyntaxError(expression.input);
       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)(input), { frameId })
+        value
       });
     });
 
     return function (_x3) {
       return _ref7.apply(this, arguments);
     };
   })();
 }
@@ -17721,35 +17562,49 @@ var checkSelectedSource = (() => {
     }
   });
 
   return function checkSelectedSource(_x, _x2, _x3) {
     return _ref.apply(this, arguments);
   };
 })();
 
+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, _breakpoints.syncBreakpoint)(source.id, pendingBreakpoint));
+    }
+  });
+
+  return function checkPendingBreakpoint(_x4, _x5, _x6, _x7) {
+    return _ref2.apply(this, arguments);
+  };
+})();
+
 var checkPendingBreakpoints = (() => {
-  var _ref2 = _asyncToGenerator(function* (state, dispatch, sourceId) {
-    // source may have been modified by selectSource
-    var source = (0, _selectors.getSource)(state, sourceId).toJS();
+  var _ref3 = _asyncToGenerator(function* (state, dispatch, source) {
     var pendingBreakpoints = (0, _selectors.getPendingBreakpointsForSource)(state, source.url);
     if (!pendingBreakpoints.size) {
       return;
     }
 
     // load the source text if there is a pending breakpoint for it
     yield dispatch((0, _loadSourceText.loadSourceText)(source));
     var pendingBreakpointsArray = pendingBreakpoints.valueSeq().toJS();
     for (var pendingBreakpoint of pendingBreakpointsArray) {
-      yield dispatch((0, _breakpoints.syncBreakpoint)(sourceId, pendingBreakpoint));
-    }
-  });
-
-  return function checkPendingBreakpoints(_x4, _x5, _x6) {
-    return _ref2.apply(this, arguments);
+      yield checkPendingBreakpoint(state, dispatch, pendingBreakpoint, source);
+    }
+  });
+
+  return function checkPendingBreakpoints(_x8, _x9, _x10) {
+    return _ref3.apply(this, arguments);
   };
 })();
 
 /**
  * Handler for the debugger client's unsolicited newSource notification.
  * @memberof actions/sources
  * @static
  */
@@ -17790,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 }; }
@@ -17813,106 +17668,101 @@ function _asyncToGenerator(fn) { return 
 
 /**
  * Redux actions for the sources state
  * @module actions/sources
  */
 
 function newSource(source) {
   return (() => {
-    var _ref3 = _asyncToGenerator(function* (_ref4) {
-      var dispatch = _ref4.dispatch,
-          getState = _ref4.getState;
+    var _ref4 = _asyncToGenerator(function* (_ref5) {
+      var dispatch = _ref5.dispatch,
+          getState = _ref5.getState;
 
       var _source = (0, _selectors.getSource)(getState(), source.id);
       if (_source) {
         return;
       }
 
       dispatch({ type: "ADD_SOURCE", source });
 
       if (_prefs.prefs.clientSourceMapsEnabled) {
         yield dispatch(loadSourceMap(source));
       }
 
       yield checkSelectedSource(getState(), dispatch, source);
-      yield checkPendingBreakpoints(getState(), dispatch, source.id);
-    });
-
-    return function (_x7) {
-      return _ref3.apply(this, arguments);
+      yield checkPendingBreakpoints(getState(), dispatch, source);
+    });
+
+    return function (_x11) {
+      return _ref4.apply(this, arguments);
     };
   })();
 }
 
 function newSources(sources) {
   return (() => {
-    var _ref5 = _asyncToGenerator(function* (_ref6) {
-      var dispatch = _ref6.dispatch,
-          getState = _ref6.getState;
+    var _ref6 = _asyncToGenerator(function* (_ref7) {
+      var dispatch = _ref7.dispatch,
+          getState = _ref7.getState;
 
       var filteredSources = sources.filter(function (source) {
         return !(0, _selectors.getSource)(getState(), source.id);
       });
 
       for (var source of filteredSources) {
         yield dispatch(newSource(source));
       }
     });
 
-    return function (_x8) {
-      return _ref5.apply(this, arguments);
+    return function (_x12) {
+      return _ref6.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceMap(generatedSource) {
   return (() => {
-    var _ref7 = _asyncToGenerator(function* (_ref8) {
-      var dispatch = _ref8.dispatch,
-          getState = _ref8.getState,
-          sourceMaps = _ref8.sourceMaps;
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          sourceMaps = _ref9.sourceMaps;
 
       var urls = yield sourceMaps.getOriginalURLs(generatedSource);
       if (!urls) {
         // If this source doesn't have a sourcemap, do nothing.
         return;
       }
 
+      var state = getState();
       var originalSources = urls.map(function (originalUrl) {
         return {
           url: originalUrl,
           id: sourceMaps.generatedToOriginalId(generatedSource.id, originalUrl),
           isPrettyPrinted: false,
           isWasm: false,
           isBlackBoxed: false,
           loadedState: "unloaded"
         };
       });
 
       dispatch({ type: "ADD_SOURCES", sources: originalSources });
 
-      originalSources.forEach((() => {
-        var _ref9 = _asyncToGenerator(function* (source) {
-          yield checkSelectedSource(getState(), dispatch, source);
-          checkPendingBreakpoints(getState(), dispatch, source.id);
-        });
-
-        return function (_x10) {
-          return _ref9.apply(this, arguments);
-        };
-      })());
-    });
-
-    return function (_x9) {
-      return _ref7.apply(this, arguments);
+      originalSources.forEach(function (source) {
+        checkSelectedSource(state, dispatch, source);
+        checkPendingBreakpoints(state, dispatch, source);
+      });
+    });
+
+    return function (_x13) {
+      return _ref8.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Deterministically select a source that has a given URL. This will
  * work regardless of the connection status or if the source exists
  * yet. This exists mostly for external things to interact with the
@@ -17937,17 +17787,17 @@ function selectSourceURL(url) {
           type: "SELECT_SOURCE_URL",
           url: url,
           tabIndex: options.tabIndex,
           line: options.line
         });
       }
     });
 
-    return function (_x12) {
+    return function (_x15) {
       return _ref10.apply(this, arguments);
     };
   })();
 }
 
 /**
  * @memberof actions/sources
  * @static
@@ -18014,17 +17864,17 @@ function jumpToMappedLocation(sourceLoca
         pairedLocation = yield (0, _sourceMaps.getGeneratedLocation)(getState(), source.toJS(), sourceLocation, sourceMaps);
       } else {
         pairedLocation = yield sourceMaps.getOriginalLocation(sourceLocation, source.toJS());
       }
 
       return dispatch(selectSource(pairedLocation.sourceId, { line: pairedLocation.line }));
     });
 
-    return function (_x14) {
+    return function (_x17) {
       return _ref14.apply(this, arguments);
     };
   })();
 }
 
 function addTab(source, tabIndex) {
   return {
     type: "ADD_TAB",
@@ -18131,17 +17981,17 @@ function togglePrettyPrint(sourceId) {
       yield dispatch((0, _breakpoints.remapBreakpoints)(sourceId));
       yield dispatch((0, _ast.setEmptyLines)(newPrettySource.id));
 
       return dispatch(selectSource(newPrettySource.id, {
         line: selectedOriginalLocation.line
       }));
     });
 
-    return function (_x15) {
+    return function (_x18) {
       return _ref18.apply(this, arguments);
     };
   })();
 }
 
 function toggleBlackBox(source) {
   return (() => {
     var _ref21 = _asyncToGenerator(function* (_ref22) {
@@ -18155,17 +18005,17 @@ function toggleBlackBox(source) {
 
       return dispatch({
         type: "BLACKBOX",
         source,
         [_promise.PROMISE]: client.blackBox(id, isBlackBoxed)
       });
     });
 
-    return function (_x16) {
+    return function (_x19) {
       return _ref21.apply(this, arguments);
     };
   })();
 }
 
 /**
   Load the text for all the available sources
  * @memberof actions/sources
@@ -18193,17 +18043,17 @@ function loadAllSources() {
         // If there is a current search query we search
         // each of the source texts as they get loaded
         if (query) {
           yield dispatch((0, _projectTextSearch.searchSource)(source.id, query));
         }
       }
     });
 
-    return function (_x17) {
+    return function (_x20) {
       return _ref23.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Ensures parser has source text
  *
@@ -18217,17 +18067,17 @@ function ensureParserHasSourceText(sourc
           getState = _ref28.getState;
 
       if (!(yield parser.hasSource(sourceId))) {
         yield dispatch((0, _loadSourceText.loadSourceText)((0, _selectors.getSource)(getState(), sourceId).toJS()));
         yield parser.setSource((0, _selectors.getSource)(getState(), sourceId).toJS());
       }
     });
 
-    return function (_x18) {
+    return function (_x21) {
       return _ref27.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 255 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -18277,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);
   }
 
@@ -18565,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;
@@ -18614,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 };
@@ -18684,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
@@ -19094,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
   };
 }
@@ -19131,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);
 
@@ -19177,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 */,
@@ -19245,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
@@ -19401,52 +19306,44 @@ module.exports = baseHas;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.DebugLine = undefined;
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(257);
 
 var _sourceDocuments = __webpack_require__(260);
 
-var _reactRedux = __webpack_require__(1189);
-
-var _selectors = __webpack_require__(242);
-
 class DebugLine extends _react.Component {
 
   constructor() {
     super();
     this.state = { debugExpression: { clear: () => {} } };
   }
 
-  componentDidMount() {
+  componentWillMount() {
     this.setDebugLine(this.props.selectedFrame, this.props.selectedLocation, this.props.editor);
   }
 
   componentWillReceiveProps(nextProps) {
     this.clearDebugLine(this.props.selectedFrame, this.props.editor);
     this.setDebugLine(nextProps.selectedFrame, nextProps.selectedLocation, nextProps.editor);
   }
 
   componentWillUnmount() {
     this.clearDebugLine(this.props.selectedFrame, this.props.editor);
   }
 
   setDebugLine(selectedFrame, selectedLocation, editor) {
-    if (!selectedFrame) {
-      return;
-    }
     var location = selectedFrame.location,
         sourceId = selectedFrame.location.sourceId;
 
     var _toEditorPosition = (0, _editor.toEditorPosition)(sourceId, location),
         line = _toEditorPosition.line,
         column = _toEditorPosition.column;
 
     var doc = (0, _sourceDocuments.getDocument)(sourceId);
@@ -19458,19 +19355,16 @@ class DebugLine extends _react.Component
     var debugExpression = (0, _editor.markText)(editor, "debug-expression", {
       start: { line, column },
       end: { line, column: null }
     });
     this.setState({ debugExpression });
   }
 
   clearDebugLine(selectedFrame, editor) {
-    if (!selectedFrame) {
-      return;
-    }
     var _selectedFrame$locati = selectedFrame.location,
         line = _selectedFrame$locati.line,
         sourceId = _selectedFrame$locati.sourceId;
     var debugExpression = this.state.debugExpression;
 
     if (debugExpression) {
       debugExpression.clear();
     }
@@ -19483,22 +19377,17 @@ class DebugLine extends _react.Component
 
     doc.removeLineClass(editorLine, "line", "new-debug-line");
   }
 
   render() {
     return null;
   }
 }
-
-exports.DebugLine = DebugLine;
-exports.default = (0, _reactRedux.connect)(state => ({
-  selectedLocation: (0, _selectors.getSelectedLocation)(state),
-  selectedFrame: (0, _selectors.getSelectedFrame)(state)
-}))(DebugLine);
+exports.default = DebugLine;
 
 /***/ }),
 /* 314 */,
 /* 315 */,
 /* 316 */,
 /* 317 */,
 /* 318 */,
 /* 319 */
@@ -19513,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);
   };
@@ -19569,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; } }
@@ -19591,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) {
@@ -19667,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);
     };
   })();
 }
@@ -19935,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
@@ -20023,94 +19901,84 @@ function navigated() {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.setContextMenu = setContextMenu;
 exports.closeActiveSearch = closeActiveSearch;
 exports.setActiveSearch = setActiveSearch;
 exports.toggleFrameworkGrouping = toggleFrameworkGrouping;
 exports.setSelectedSymbolType = setSelectedSymbolType;
 exports.setFileSearchQuery = setFileSearchQuery;
 exports.updateSearchResults = updateSearchResults;
 exports.toggleFileSearchModifier = toggleFileSearchModifier;
 exports.showSource = showSource;
 exports.togglePaneCollapse = togglePaneCollapse;
 exports.highlightLineRange = highlightLineRange;
 exports.clearHighlightLineRange = clearHighlightLineRange;
-exports.openConditionalPanel = openConditionalPanel;
-exports.closeConditionalPanel = closeConditionalPanel;
+exports.toggleConditionalBreakpointPanel = toggleConditionalBreakpointPanel;
 
 var _selectors = __webpack_require__(242);
 
 var _sourceSearch = __webpack_require__(1144);
 
-function setContextMenu(type, event) {
+function closeActiveSearch() {
   return (_ref) => {
-    var dispatch = _ref.dispatch;
-
-    dispatch({ type: "SET_CONTEXT_MENU", contextMenu: { type, event } });
-  };
-}
-
-function closeActiveSearch() {
-  return (_ref2) => {
-    var getState = _ref2.getState,
-        dispatch = _ref2.dispatch;
+    var getState = _ref.getState,
+        dispatch = _ref.dispatch;
 
     var activeSearch = (0, _selectors.getActiveSearch)(getState());
 
     if (activeSearch == "source") {
       dispatch((0, _sourceSearch.clearSourceSearchQuery)());
     }
 
     dispatch({
       type: "TOGGLE_ACTIVE_SEARCH",
       value: null
     });
   };
 }
 
 function setActiveSearch(activeSearch) {
-  return (_ref3) => {
-    var dispatch = _ref3.dispatch,
-        getState = _ref3.getState;
+  return (_ref2) => {
+    var dispatch = _ref2.dispatch,
+        getState = _ref2.getState;
 
     var activeSearchState = (0, _selectors.getActiveSearch)(getState());
     if (activeSearchState === activeSearch) {
       return;
     }
 
     dispatch({
       type: "TOGGLE_ACTIVE_SEARCH",
       value: activeSearch
     });
   };
 }
 
 function toggleFrameworkGrouping(toggleValue) {
-  return (_ref4) => {
-    var dispatch = _ref4.dispatch,
-        getState = _ref4.getState;
+  return (_ref3) => {
+    var dispatch = _ref3.dispatch,
+        getState = _ref3.getState;
 
     dispatch({
       type: "TOGGLE_FRAMEWORK_GROUPING",
       value: toggleValue
     });
   };
 }
 
 function setSelectedSymbolType(symbolType) {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch,
-        getState = _ref5.getState;
+  return (_ref4) => {
+    var dispatch = _ref4.dispatch,
+        getState = _ref4.getState;
 
     dispatch({
       type: "SET_SYMBOL_SEARCH_TYPE",
       symbolType
     });
   };
 }
 
@@ -20128,19 +19996,19 @@ function updateSearchResults(results) {
   };
 }
 
 function toggleFileSearchModifier(modifier) {
   return { type: "TOGGLE_FILE_SEARCH_MODIFIER", modifier };
 }
 
 function showSource(sourceId) {
-  return (_ref6) => {
-    var dispatch = _ref6.dispatch,
-        getState = _ref6.getState;
+  return (_ref5) => {
+    var dispatch = _ref5.dispatch,
+        getState = _ref5.getState;
 
     var source = (0, _selectors.getSource)(getState(), sourceId);
 
     dispatch({
       type: "SHOW_SOURCE",
       sourceUrl: ""
     });
 
@@ -20175,29 +20043,23 @@ function highlightLineRange(location) {
  * @static
  */
 function clearHighlightLineRange() {
   return {
     type: "CLEAR_HIGHLIGHT_LINES"
   };
 }
 
-function openConditionalPanel(line) {
-  return {
-    type: "OPEN_CONDITIONAL_PANEL",
+function toggleConditionalBreakpointPanel(line) {
+  return {
+    type: "TOGGLE_CONDITIONAL_BREAKPOINT_PANEL",
     line: line
   };
 }
 
-function closeConditionalPanel() {
-  return {
-    type: "CLOSE_CONDITIONAL_PANEL"
-  };
-}
-
 /***/ }),
 /* 322 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -20246,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",
@@ -20296,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;
 
@@ -21727,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);
@@ -21959,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;
@@ -21992,34 +21853,32 @@ var svg = {
   angular: __webpack_require__(247),
   arrow: __webpack_require__(348),
   backbone: __webpack_require__(997),
   blackBox: __webpack_require__(349),
   breakpoint: __webpack_require__(350),
   "column-breakpoint": __webpack_require__(998),
   "case-match": __webpack_require__(351),
   close: __webpack_require__(352),
-  choo: __webpack_require__(1290),
   dojo: __webpack_require__(806),
   domain: __webpack_require__(353),
   file: __webpack_require__(354),
   folder: __webpack_require__(355),
   globe: __webpack_require__(356),
   jquery: __webpack_require__(999),
   underscore: __webpack_require__(1117),
   lodash: __webpack_require__(1118),
   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),
@@ -22424,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,
@@ -22568,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;
 
@@ -22612,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);
@@ -22769,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);
     }
 
@@ -22831,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) {
@@ -22852,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;
 
 
@@ -22889,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__) {
@@ -22934,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);
 
@@ -22958,23 +22819,35 @@ var _reactImmutableProptypes2 = _interop
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
+var _devtoolsConfig = __webpack_require__(828);
+
+var _GutterMenu = __webpack_require__(655);
+
+var _GutterMenu2 = _interopRequireDefault(_GutterMenu);
+
+var _EditorMenu = __webpack_require__(656);
+
+var _EditorMenu2 = _interopRequireDefault(_EditorMenu);
+
+var _ConditionalPanel = __webpack_require__(711);
+
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _source = __webpack_require__(233);
 
-var _devtoolsConfig = __webpack_require__(828);
-
-var _devtoolsSourceEditor = __webpack_require__(994);
+var _function = __webpack_require__(1169);
+
+var _ast = __webpack_require__(1058);
 
 var _selectors = __webpack_require__(242);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _Footer = __webpack_require__(427);
@@ -23008,162 +22881,63 @@ var _CallSites2 = _interopRequireDefault
 var _DebugLine = __webpack_require__(313);
 
 var _DebugLine2 = _interopRequireDefault(_DebugLine);
 
 var _EmptyLines = __webpack_require__(1146);
 
 var _EmptyLines2 = _interopRequireDefault(_EmptyLines);
 
-var _GutterMenu = __webpack_require__(655);
-
-var _GutterMenu2 = _interopRequireDefault(_GutterMenu);
-
-var _EditorMenu = __webpack_require__(656);
-
-var _EditorMenu2 = _interopRequireDefault(_EditorMenu);
-
-var _ConditionalPanel = __webpack_require__(711);
-
-var _ConditionalPanel2 = _interopRequireDefault(_ConditionalPanel);
-
 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,
-          conditionalPanelLine = _props2.conditionalPanelLine,
-          closeConditionalPanel = _props2.closeConditionalPanel,
-          addOrToggleDisabledBreakpoint = _props2.addOrToggleDisabledBreakpoint,
-          continueToHere = _props2.continueToHere;
-
-      // ignore right clicks in the gutter
-
-      if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed") || !selectedSource) {
-        return;
-      }
-
-      if (conditionalPanelLine) {
-        return closeConditionalPanel();
-      }
-
-      if (gutter === "CodeMirror-foldgutter") {
-        return;
-      }
-
-      var sourceLine = (0, _editor.toSourceLine)(selectedSource.get("id"), line);
-
-      if (ev.altKey) {
-        return continueToHere(sourceLine);
-      }
-
-      if (ev.shiftKey) {
-        return addOrToggleDisabledBreakpoint(sourceLine);
-      }
-      return toggleBreakpoint(sourceLine);
-    };
-
-    this.onGutterContextMenu = event => {
-      return this.props.setContextMenu("Gutter", event);
-    };
-
-    this.toggleConditionalPanel = line => {
-      var _props3 = this.props,
-          conditionalPanelLine = _props3.conditionalPanelLine,
-          closeConditionalPanel = _props3.closeConditionalPanel,
-          openConditionalPanel = _props3.openConditionalPanel;
-
-      if (conditionalPanelLine) {
-        return closeConditionalPanel();
-      }
-
-      return openConditionalPanel(line);
-    };
-
-    this.closeConditionalPanel = () => {
-      return this.props.closeConditionalPanel();
-    };
-
+    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);
+    this.setText(nextProps);
     (0, _editor.resizeBreakpointGutter)(this.state.editor.codeMirror);
   }
 
   setupEditor() {
     var editor = (0, _editor.createEditor)();
 
     // disables the default search shortcuts
 
@@ -23196,49 +22970,42 @@ class Editor extends _react.PureComponen
       }
     };
 
     var codeMirrorGutter = codeMirror.getGutterElement();
     codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility);
     codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility);
 
     if (!(0, _devtoolsConfig.isFirefox)()) {
-      codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => {
-        event.stopPropagation();
-        event.preventDefault();
-        return this.onGutterContextMenu(event);
-      });
-
-      codeMirror.on("contextmenu", (cm, event) => this.openMenu(event));
-    } else {
-      codeMirrorWrapper.addEventListener("contextmenu", event => {
-        event.stopPropagation();
-        event.preventDefault();
-        return this.openMenu(event);
-      });
+      codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
+
+      codeMirror.on("contextmenu", (cm, event) => this.openMenu(event, editor));
+    } else {
+      codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event, editor));
     }
 
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
+    this.cbPanel = null;
     var editor = this.setupEditor();
 
-    var _props4 = this.props,
-        selectedSource = _props4.selectedSource,
-        selectedLocation = _props4.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.toggleConditionalPanel);
+    shortcuts.on(L10N.getStr("toggleCondPanel.key"), this.onToggleBreakpoint);
     shortcuts.on("Esc", this.onEscape);
     shortcuts.on(searchAgainPrevKey, this.onSearchAgain);
     shortcuts.on(searchAgainKey, this.onSearchAgain);
 
     if (selectedLocation && !!selectedLocation.line) {
       this.pendingJumpLocation = selectedLocation;
     }
 
@@ -23254,28 +23021,23 @@ class Editor extends _react.PureComponen
     var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
     var shortcuts = this.context.shortcuts;
     shortcuts.off(L10N.getStr("toggleBreakpoint.key"));
     shortcuts.off(L10N.getStr("toggleCondPanel.key"));
     shortcuts.off(searchAgainPrevKey);
     shortcuts.off(searchAgainKey);
   }
 
-  componentWillUpdate(nextProps) {
-    this.setText(nextProps);
-    this.setSize(nextProps);
-  }
-
   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 _props5 = this.props,
-        selectedLocation = _props5.selectedLocation,
-        selectedSource = _props5.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) {
@@ -23284,17 +23046,41 @@ class Editor extends _react.PureComponen
         this.pendingJumpLocation = null;
       }
     }
 
     // Only update and jump around in real source texts. This will
     // keep the jump state around until the real source text is
     // loaded.
     if (selectedSource && selectedSource.has("text")) {
-      this.flashLine();
+      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;
 
@@ -23313,44 +23099,205 @@ 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.
    */
-
-
-  openMenu(event) {
-    var setContextMenu = this.props.setContextMenu;
-
-
-    if (event.target.classList.contains("CodeMirror-linenumber")) {
-      return setContextMenu("Gutter", event);
-    }
-
-    return setContextMenu("Editor", event);
+  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 _props4 = this.props,
+        selectedLocation = _props4.selectedLocation,
+        selectedFrame = _props4.selectedFrame;
+
+    return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
+  }
+
+  openMenu(event, editor) {
+    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 _props6 = this.props,
-        selectedLocation = _props6.selectedLocation,
-        jumpToMappedLocation = _props6.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.
-  flashLine() {
+  highlightLine() {
     if (!this.pendingJumpLocation) {
       return;
     }
 
     // Make sure to clean up after ourselves. Not only does this
     // cancel any existing animation, but it avoids it from
     // happening ever again (in case CodeMirror re-applies the
     // class, etc).
@@ -23382,55 +23329,58 @@ class Editor extends _react.PureComponen
       return;
     }
 
     if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
       this.state.editor.codeMirror.setSize();
     }
   }
 
-  setText(props) {
-    var selectedSource = props.selectedSource;
-
+  setText(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
-    if (!selectedSource) {
-      return this.showMessage("");
-    }
-
-    if (!(0, _source.isLoaded)(selectedSource.toJS())) {
-      return (0, _editor.showLoading)(this.state.editor);
-    }
-
-    if (selectedSource.get("error")) {
-      return this.showMessage(selectedSource.get("error"));
-    }
-
-    if (selectedSource) {
-      return (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS());
+    if (!nextProps.selectedSource) {
+      if (this.props.selectedSource) {
+        return this.showMessage("");
+      }
+
+      return;
+    }
+
+    if (!(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
+      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) {
-    var editor = this.state.editor;
-
-    if (!editor) {
-      return;
-    }
-
-    (0, _editor.resetLineNumberFormat)(editor);
+    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 _props7 = this.props,
-        selectedSource = _props7.selectedSource,
-        horizontal = _props7.horizontal,
-        searchOn = _props7.searchOn;
+    var _props10 = this.props,
+        selectedSource = _props10.selectedSource,
+        horizontal = _props10.horizontal,
+        searchOn = _props10.searchOn;
 
 
     var subtractions = [];
 
     if ((0, _editor.shouldShowFooter)(selectedSource, horizontal)) {
       subtractions.push(cssVars.footerHeight);
     }
 
@@ -23439,133 +23389,229 @@ class Editor extends _react.PureComponen
       subtractions.push(cssVars.secondSearchbarHeight);
     }
 
     return {
       height: subtractions.length === 0 ? "100%" : `calc(100% - ${subtractions.join(" - ")})`
     };
   }
 
+  renderHighlightLines() {
+    var highlightedLineRange = this.props.highlightedLineRange;
+
+
+    if (!highlightedLineRange || !this.state.editor) {
+      return;
+    }
+
+    return _react2.default.createElement(_HighlightLines2.default, {
+      editor: this.state.editor,
+      highlightedLineRange: highlightedLineRange
+    });
+  }
+
   renderHitCounts() {
-    var _props8 = this.props,
-        hitCount = _props8.hitCount,
-        selectedSource = _props8.selectedSource;
+    var _props11 = this.props,
+        hitCount = _props11.hitCount,
+        selectedSource = _props11.selectedSource;
 
 
     if (!selectedSource || !(0, _source.isLoaded)(selectedSource.toJS()) || !hitCount || !this.state.editor) {
       return;
     }
 
     return hitCount.filter(marker => marker.get("count") > 0).map(marker => _react2.default.createElement(_HitMarker2.default, {
       key: marker.get("line"),
       hitData: marker.toJS(),
       editor: this.state.editor.codeMirror
     }));
   }
 
-  renderItems() {
-    var _props9 = this.props,
-        selectedSource = _props9.selectedSource,
-        horizontal = _props9.horizontal;
-    var editor = this.state.editor;
-
-
-    if (!editor || !selectedSource || !(0, _source.isLoaded)(selectedSource.toJS())) {
+  renderPreview() {
+    var selectedSource = this.props.selectedSource;
+
+    if (!this.state.editor || !selectedSource) {
       return null;
     }
-    return _react2.default.createElement(
-      "div",
-      null,
-      _react2.default.createElement(_DebugLine2.default, { editor: editor }),
-      _react2.default.createElement(_EmptyLines2.default, { editor: editor }),
-      _react2.default.createElement(_Breakpoints2.default, { editor: editor }),
-      _react2.default.createElement(_CallSites2.default, { editor: editor }),
-      _react2.default.createElement(_Preview2.default, { editor: editor }),
-      ";",
-      _react2.default.createElement(_Footer2.default, { editor: editor, horizontal: horizontal }),
-      _react2.default.createElement(_HighlightLines2.default, { editor: editor }),
-      _react2.default.createElement(_EditorMenu2.default, { editor: editor }),
-      _react2.default.createElement(_GutterMenu2.default, { editor: editor }),
-      _react2.default.createElement(_ConditionalPanel2.default, { editor: editor }),
-      this.renderHitCounts()
-    );
+
+    return _react2.default.createElement(_Preview2.default, { editor: this.state.editor });
+  }
+
+  renderCallSites() {
+    var editor = this.state.editor;
+
+    if (!editor || !(0, _devtoolsConfig.isEnabled)("columnBreakpoints")) {
+      return null;
+    }
+    return _react2.default.createElement(_CallSites2.default, { editor: editor });
   }
 
   renderSearchBar() {
-    var editor = this.state.editor;
-
-
-    if (!editor) {
+    var _props12 = this.props,
+        selectSource = _props12.selectSource,
+        selectedSource = _props12.selectedSource,
+        highlightLineRange = _props12.highlightLineRange,
+        clearHighlightLineRange = _props12.clearHighlightLineRange;
+
+
+    if (!this.state.editor) {
+      return null;
+    }
+
+    return _react2.default.createElement(_SearchBar2.default, {
+      editor: this.state.editor,
+      selectSource: selectSource,
+      selectedSource: selectedSource,
+      highlightLineRange: highlightLineRange,
+      clearHighlightLineRange: clearHighlightLineRange
+    });
+  }
+
+  renderFooter() {
+    var horizontal = this.props.horizontal;
+
+
+    if (!this.state.editor) {
+      return null;
+    }
+    return _react2.default.createElement(_Footer2.default, { editor: this.state.editor, horizontal: horizontal });
+  }
+
+  renderBreakpoints() {
+    if (!this.state.editor) {
       return null;
     }
 
-    return _react2.default.createElement(_SearchBar2.default, { editor: editor });
-  }
-
-  render() {
-    var coverageOn = this.props.coverageOn;
+    return _react2.default.createElement(_Breakpoints2.default, { editor: this.state.editor });
+  }
+
+  renderEmptyLines() {
+    if (!this.state.editor) {
+      return null;
+    }
+
+    return _react2.default.createElement(_EmptyLines2.default, { editor: this.state.editor });
+  }
+
+  renderDebugLine() {
+    var editor = this.state.editor;
+    var _props13 = this.props,
+        selectedLocation = _props13.selectedLocation,
+        selectedFrame = _props13.selectedFrame;
+
+    if (!editor || !selectedLocation || !selectedFrame || !selectedLocation.line || selectedFrame.location.sourceId !== selectedLocation.sourceId) {
+      return null;
+    }
+
+    return _react2.default.createElement(_DebugLine2.default, {
+      editor: editor,
+      selectedFrame: selectedFrame,
+      selectedLocation: selectedLocation
+    });
+  }
+
+  render() {
+    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.renderItems()
+      this.renderHighlightLines(),
+      this.renderHitCounts(),
+      this.renderFooter(),
+      this.renderPreview(),
+      this.renderCallSites(),
+      this.renderDebugLine(),
+      this.renderBreakpoints(),
+      this.renderEmptyLines()
     );
   }
 }
 
 Editor.propTypes = {
-  hitCount: _propTypes2.default.object,
-  selectedLocation: _propTypes2.default.object,
+  breakpoints: _reactImmutableProptypes2.default.map,
+  hitCount: _react.PropTypes.object,
+  selectedLocation: _react.PropTypes.object,
   selectedSource: _reactImmutableProptypes2.default.map,
-  searchOn: _propTypes2.default.bool,
-  addOrToggleDisabledBreakpoint: _propTypes2.default.func,
-  toggleBreakpoint: _propTypes2.default.func,
-  selectSource: _propTypes2.default.func,
-  jumpToMappedLocation: _propTypes2.default.func,
-  coverageOn: _propTypes2.default.bool,
-  selectedFrame: _propTypes2.default.object,
-  searchModifiers: _propTypes2.default.object,
-  query: _propTypes2.default.string,
-  horizontal: _propTypes2.default.bool,
-  startPanelSize: _propTypes2.default.number,
-  endPanelSize: _propTypes2.default.number,
-  conditionalPanelLine: _propTypes2.default.number,
-  openConditionalPanel: _propTypes2.default.func,
-  closeConditionalPanel: _propTypes2.default.func,
-  continueToHere: _propTypes2.default.func,
-  setContextMenu: _propTypes2.default.func
+  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: _react.PropTypes.bool.isRequired,
+    regexMatch: _react.PropTypes.bool.isRequired,
+    wholeWord: _react.PropTypes.bool.isRequired
+  }).isRequired,
+  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);
-  var sourceId = selectedSource ? selectedSource.get("id") : "";
-  return {
-    selectedLocation: (0, _selectors.getSelectedLocation)(state),
+
+  return {
+    selectedLocation,
     selectedSource,
+    highlightedLineRange: (0, _selectors.getHighlightedLineRange)(state),
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
+    loadedObjects: (0, _selectors.getLoadedObjects)(state),
+    breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
     hitCount: (0, _selectors.getHitCountForSource)(state, sourceId),
     selectedFrame: (0, _selectors.getSelectedFrame)(state),
+    pauseData: (0, _selectors.getPause)(state),
+    coverageOn: (0, _selectors.getCoverageEnabled)(state),
     query: (0, _selectors.getFileSearchQueryState)(state),
-    modifiers: (0, _selectors.getFileSearchModifierState)(state),
-    coverageOn: (0, _selectors.getCoverageEnabled)(state),
-    conditionalPanelLine: (0, _selectors.getConditionalPanelLine)(state)
+    searchModifiers: (0, _selectors.getFileSearchModifierState)(state),
+    linesInScope: (0, _selectors.getInScopeLines)(state),
+    getFunctionText: line => (0, _function.findFunctionText)(line, selectedSource.toJS(), (0, _selectors.getSymbols)(state, selectedSource.toJS())),
+    isEmptyLine: line => (0, _ast.isEmptyLineInSource)(state, line, selectedSource.toJS()),
+    conditionalBreakpointPanel: (0, _selectors.getConditionalBreakpointPanel)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Editor);
 
 /***/ }),
 /* 427 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -23602,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,
@@ -23781,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,
@@ -23837,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);
 
@@ -23863,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");
@@ -23900,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,
@@ -24162,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;
@@ -24191,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");
@@ -24218,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",
@@ -24269,27 +24322,24 @@ 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",
-    selectedSource: (0, _selectors.getSelectedSource)(state),
-    selectedLocation: (0, _selectors.getSelectedLocation)(state),
     query: (0, _selectors.getFileSearchQueryState)(state),
     modifiers: (0, _selectors.getFileSearchModifierState)(state),
-    highlightedLineRange: (0, _selectors.getHighlightedLineRange)(state),
     searchResults: (0, _selectors.getSearchResults)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SearchBar);
 
 /***/ }),
 /* 434 */,
 /* 435 */,
 /* 436 */,
@@ -24502,61 +24552,264 @@ 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";
 
 
 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.gutterMenu = gutterMenu;
-
-var _react = __webpack_require__(0);
+exports.default = GutterMenu;
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
-var _redux = __webpack_require__(3);
-
-var _reactRedux = __webpack_require__(1189);
-
-var _editor = __webpack_require__(257);
-
-var _selectors = __webpack_require__(242);
-
-var _actions = __webpack_require__(244);
-
-var _actions2 = _interopRequireDefault(_actions);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
-
-function gutterMenu(_ref) {
+function GutterMenu(_ref) {
   var breakpoint = _ref.breakpoint,
       line = _ref.line,
       event = _ref.event,
       pauseData = _ref.pauseData,
       toggleBreakpoint = _ref.toggleBreakpoint,
-      openConditionalPanel = _ref.openConditionalPanel,
+      showConditionalPanel = _ref.showConditionalPanel,
       toggleDisabledBreakpoint = _ref.toggleDisabledBreakpoint,
       isCbPanelOpen = _ref.isCbPanelOpen,
       closeConditionalPanel = _ref.closeConditionalPanel,
       continueToHere = _ref.continueToHere;
 
   event.stopPropagation();
   event.preventDefault();
 
@@ -24600,17 +24853,17 @@ function gutterMenu(_ref) {
         closeConditionalPanel();
       }
     }
   }, breakpoint ? gutterItems.removeBreakpoint : gutterItems.addBreakpoint);
 
   var conditionalBreakpoint = Object.assign({
     accesskey: "C",
     disabled: false,
-    click: () => openConditionalPanel(line)
+    click: () => showConditionalPanel(line)
   }, breakpoint && breakpoint.condition ? gutterItems.editConditional : gutterItems.addConditional);
 
   var items = [toggleBreakpointItem, conditionalBreakpoint];
 
   if (pauseData) {
     var continueToHereItem = _extends({
       accesskey: L10N.getStr("editor.continueToHere.accesskey"),
       disabled: false,
@@ -24626,96 +24879,57 @@ function gutterMenu(_ref) {
       click: () => toggleDisabledBreakpoint(line)
     }, breakpoint.disabled ? gutterItems.enableBreakpoint : gutterItems.disableBreakpoint);
     items.push(disableBreakpoint);
   }
 
   (0, _devtoolsLaunchpad.showMenu)(event, items);
 }
 
-class GutterContextMenuComponent extends _react.PureComponent {
-
-  constructor() {
-    super();
-  }
-
-  shouldComponentUpdate(nextProps) {
-    return nextProps.contextMenu.type === "Gutter";
-  }
-
-  componentWillUpdate(nextProps) {
-    // clear the context menu since it is open
-    this.props.setContextMenu("", null);
-    return this.showMenu(nextProps);
-  }
-
-  showMenu(nextProps) {
-    var contextMenu = nextProps.contextMenu,
-        props = _objectWithoutProperties(nextProps, ["contextMenu"]);
-
-    var event = contextMenu.event;
-
-    var sourceId = props.selectedSource ? props.selectedSource.get("id") : "";
-    var line = (0, _editor.lineAtHeight)(props.editor, sourceId, event);
-    var breakpoint = nextProps.breakpoints.find(bp => bp.location.line === line);
-
-    gutterMenu(_extends({ event, sourceId, line, breakpoint }, props));
-  }
-
-  render() {
-    return null;
-  }
-}
-
-exports.default = (0, _reactRedux.connect)(state => {
-  return {
-    selectedLocation: (0, _selectors.getSelectedLocation)(state),
-    selectedSource: (0, _selectors.getSelectedSource)(state),
-    breakpoints: (0, _selectors.getVisibleBreakpoints)(state),
-    pauseData: (0, _selectors.getPause)(state),
-    contextMenu: (0, _selectors.getContextMenu)(state)
-  };
-}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(GutterContextMenuComponent);
-
 /***/ }),
 /* 656 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
-var _react = __webpack_require__(0);
+var EditorMenu = (() => {
+  var _ref2 = _asyncToGenerator(function* (options) {
+    var event = options.event,
+        onGutterContextMenu = options.onGutterContextMenu;
+
+
+    if (event.target.classList.contains("CodeMirror-linenumber")) {
+      return onGutterContextMenu(event);
+    }
+
+    event.stopPropagation();
+    event.preventDefault();
+
+    (0, _devtoolsLaunchpad.showMenu)(event, getMenuItems(event, options));
+  });
+
+  return function EditorMenu(_x) {
+    return _ref2.apply(this, arguments);
+  };
+})();
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _clipboard = __webpack_require__(423);
 
 var _editor = __webpack_require__(257);
 
-var _redux = __webpack_require__(3);
-
-var _reactRedux = __webpack_require__(1189);
-
-var _function = __webpack_require__(1169);
-
-var _selectors = __webpack_require__(242);
-
-var _actions = __webpack_require__(244);
-
-var _actions2 = _interopRequireDefault(_actions);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
+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 getMenuItems(event, _ref) {
   var editor = _ref.editor,
       selectedLocation = _ref.selectedLocation,
       selectedSource = _ref.selectedSource,
       showSource = _ref.showSource,
       onGutterContextMenu = _ref.onGutterContextMenu,
       jumpToMappedLocation = _ref.jumpToMappedLocation,
@@ -24807,55 +25021,17 @@ function getMenuItems(event, _ref) {
 
   if (textSelected) {
     menuItems.push(watchExpressionLabel);
   }
 
   return menuItems;
 }
 
-class EditorMenu extends _react.PureComponent {
-
-  constructor() {
-    super();
-  }
-
-  shouldComponentUpdate(nextProps) {
-    return nextProps.contextMenu.type === "Editor";
-  }
-
-  componentWillUpdate(nextProps) {
-    // clear the context menu since it is open
-    this.props.setContextMenu("", null);
-    return this.showMenu(nextProps);
-  }
-
-  showMenu(nextProps) {
-    var contextMenu = nextProps.contextMenu,
-        options = _objectWithoutProperties(nextProps, ["contextMenu"]);
-
-    var event = contextMenu.event;
-
-    (0, _devtoolsLaunchpad.showMenu)(event, getMenuItems(event, options));
-  }
-
-  render() {
-    return null;
-  }
-}
-
-exports.default = (0, _reactRedux.connect)(state => {
-  var selectedSource = (0, _selectors.getSelectedSource)(state);
-  return {
-    selectedLocation: (0, _selectors.getSelectedLocation)(state),
-    selectedSource,
-    contextMenu: (0, _selectors.getContextMenu)(state),
-    getFunctionText: line => (0, _function.findFunctionText)(line, selectedSource.toJS(), (0, _selectors.getSymbols)(state, selectedSource.toJS()))
-  };
-}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EditorMenu);
+exports.default = EditorMenu;
 
 /***/ }),
 /* 657 */,
 /* 658 */,
 /* 659 */,
 /* 660 */,
 /* 661 */,
 /* 662 */,
@@ -24925,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
     };
   }
@@ -25091,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;
 
 /***/ }),
@@ -25120,157 +25303,87 @@ exports.default = Popover;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.ConditionalPanel = undefined;
+exports.renderConditionalPanel = undefined;
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
-var _redux = __webpack_require__(3);
-
-var _reactRedux = __webpack_require__(1189);
-
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
-__webpack_require__(1246);
-
-var _editor = __webpack_require__(257);
-
-var _actions = __webpack_require__(244);
-
-var _actions2 = _interopRequireDefault(_actions);
-
-var _selectors = __webpack_require__(242);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-class ConditionalPanel extends _react.PureComponent {
-
-  constructor() {
-    super();
-
-    this.setInput = node => {
-      this.input = node;
-    };
-
-    this.saveAndClose = () => {
-      if (this.input) {
-        this.setBreakpoint(this.input.value);
-      }
-
-      this.props.closeConditionalPanel();
-    };
-
-    this.onKey = e => {
-      if (e.key === "Enter") {
-        this.saveAndClose();
-      } else if (e.key === "Escape") {
-        this.props.closeConditionalPanel();
-      }
-    };
-
-    this.cbPanel = null;
-    this.input = {};
-  }
-
-  setBreakpoint(condition) {
-    var _props = this.props,
-        selectedLocation = _props.selectedLocation,
-        line = _props.line;
-
-    var sourceId = selectedLocation ? selectedLocation.sourceId : "";
-    var location = { sourceId, line };
-    return this.props.setBreakpointCondition(location, { condition });
-  }
-
-  clearConditionalPanel() {
-    if (this.cbPanel) {
-      this.cbPanel.clear();
-      this.cbPanel = null;
-    }
-  }
-
-  componentWillUpdate(nextProps) {
-    if (nextProps.line) {
-      return this.renderToWidget(nextProps);
-    }
-    return this.clearConditionalPanel();
-  }
-
-  renderToWidget(props) {
-    var selectedLocation = props.selectedLocation,
-        line = props.line,
-        editor = props.editor;
-
-    var sourceId = selectedLocation ? selectedLocation.sourceId : "";
-
-    var editorLine = (0, _editor.toEditorLine)(sourceId, line);
-    this.cbPanel = editor.codeMirror.addLineWidget(editorLine, this.renderConditionalPanel(props), {
-      coverGutter: true,
-      noHScroll: false
-    });
-    this.input.focus();
-  }
-
-  renderConditionalPanel(props) {
-    var breakpoint = props.breakpoint;
-
-    var condition = breakpoint ? breakpoint.condition : "";
-    var panel = document.createElement("div");
-    _reactDom2.default.render(_react2.default.createElement(
-      "div",
-      { className: "conditional-breakpoint-panel" },
-      _react2.default.createElement(
-        "div",
-        { className: "prompt" },
-        "\xBB"
-      ),
-      _react2.default.createElement("input", {
-        defaultValue: condition,
-        placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
-        onKeyDown: this.onKey,
-        ref: this.setInput
-      }),
-      _react2.default.createElement(_Close2.default, {
-        handleClick: this.props.closeConditionalPanel,
-        buttonClass: "big",
-        tooltip: L10N.getStr("editor.conditionalPanel.close")
-      })
-    ), panel);
-    return panel;
-  }
-
-  render() {
-    return null;
-  }
-}
-
-exports.ConditionalPanel = ConditionalPanel;
-exports.default = (0, _reactRedux.connect)(state => {
-  var line = (0, _selectors.getConditionalPanelLine)(state);
-  var selectedLocation = (0, _selectors.getSelectedLocation)(state);
-  return {
-    selectedLocation,
-    breakpoint: (0, _selectors.getBreakpointForLine)(state, selectedLocation.sourceId, line),
-    line
-  };
-}, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(ConditionalPanel);
+__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;
+
+  var panel = document.createElement("div");
+  var input = null;
+
+  function setInput(node) {
+    input = node;
+  }
+
+  function saveAndClose() {
+    if (input) {
+      setBreakpoint(input.value);
+    }
+
+    closePanel();
+  }
+
+  function onKey(e) {
+    if (e.key === "Enter") {
+      saveAndClose();
+    } else if (e.key === "Escape") {
+      closePanel();
+    }
+  }
+
+  _reactDom2.default.render(_react2.default.createElement(
+    "div",
+    { className: "conditional-breakpoint-panel" },
+    _react2.default.createElement(
+      "div",
+      { className: "prompt" },
+      "\xBB"
+    ),
+    _react2.default.createElement("input", {
+      defaultValue: condition,
+      placeholder: L10N.getStr("editor.conditionalPanel.placeholder"),
+      onKeyDown: onKey,
+      ref: setInput
+    }),
+    _react2.default.createElement(_Close2.default, {
+      handleClick: closePanel,
+      buttonClass: "big",
+      tooltip: L10N.getStr("editor.conditionalPanel.close")
+    })
+  ), panel);
+
+  return panel;
+}
+
+exports.renderConditionalPanel = renderConditionalPanel;
 
 /***/ }),
 /* 712 */,
 /* 713 */,
 /* 714 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -25481,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);
 
@@ -25555,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) {
@@ -25730,41 +25839,37 @@ class SecondaryPanes extends _react.Comp
       horizontal: this.props.horizontal,
       toggleShortcutsModal: this.props.toggleShortcutsModal
     });
   }
 
   render() {
     return _react2.default.createElement(
       "div",
-      { className: "secondary-panes-wrapper" },
+      { className: "secondary-panes secondary-panes--sticky-commandbar" },
       _react2.default.createElement(_CommandBar2.default, { horizontal: this.props.horizontal }),
-      _react2.default.createElement(
-        "div",
-        { className: "secondary-panes" },
-        this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout()
-      ),
+      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);
@@ -25797,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);
 
@@ -26042,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;
   }
 
@@ -26320,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, {
@@ -26351,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
     );
   }
 }
@@ -26419,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";
 }
 
@@ -26656,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,
@@ -26953,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);
 
@@ -27067,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();
@@ -27146,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)
     );
   }
 }
@@ -27172,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);
 
@@ -27200,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;
 
 
@@ -27370,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)
@@ -27417,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,
@@ -27456,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
           ),
@@ -27513,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);
@@ -27576,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);
@@ -27697,25 +27767,25 @@ class SourceTabs extends _react.PureComp
         togglePrettyPrint = _props.togglePrettyPrint;
 
 
     var closeTabLabel = L10N.getStr("sourceTabs.closeTab");
     var closeOtherTabsLabel = L10N.getStr("sourceTabs.closeOtherTabs");
     var closeTabsToEndLabel = L10N.getStr("sourceTabs.closeTabsToEnd");
     var closeAllTabsLabel = L10N.getStr("sourceTabs.closeAllTabs");
     var revealInTreeLabel = L10N.getStr("sourceTabs.revealInTree");
-    var copyLinkLabel = L10N.getStr("copySourceUri2");
+    var copyLinkLabel = L10N.getStr("sourceTabs.copyLink");
     var prettyPrintLabel = L10N.getStr("sourceTabs.prettyPrint");
 
     var closeTabKey = L10N.getStr("sourceTabs.closeTab.accesskey");
     var closeOtherTabsKey = L10N.getStr("sourceTabs.closeOtherTabs.accesskey");
     var closeTabsToEndKey = L10N.getStr("sourceTabs.closeTabsToEnd.accesskey");
     var closeAllTabsKey = L10N.getStr("sourceTabs.closeAllTabs.accesskey");
     var revealInTreeKey = L10N.getStr("sourceTabs.revealInTree.accesskey");
-    var copyLinkKey = L10N.getStr("copySourceUri2.accesskey");
+    var copyLinkKey = L10N.getStr("sourceTabs.copyLink.accesskey");
     var prettyPrintKey = L10N.getStr("sourceTabs.prettyPrint.accesskey");
 
     var tabs = sourceTabs.map(t => t.get("id"));
     var otherTabs = sourceTabs.filter(t => t.get("id") !== tab);
     var sourceTab = sourceTabs.find(t => t.get("id") == tab);
     var tabURLs = sourceTabs.map(thisTab => thisTab.get("url"));
     var otherTabURLs = otherTabs.map(thisTab => thisTab.get("url"));
 
@@ -27926,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, {
@@ -28047,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 = {
@@ -28334,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);
 }
 
@@ -28448,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) {
@@ -28539,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);
@@ -28562,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);
@@ -28686,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,
@@ -28761,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",
@@ -28795,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,
@@ -28872,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)
     );
   }
@@ -28918,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);
 
@@ -29082,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;
@@ -30128,23 +30377,19 @@ var onConnect = exports.onConnect = (() 
     tabTarget.on("will-navigate", actions.willNavigate);
     tabTarget.on("navigate", actions.navigated);
 
     yield threadClient.reconfigure({
       observeAsmJS: true,
       wasmBinarySource: supportsWasm
     });
 
-    // NOTE: The Worker and Browser Content toolboxes do not have a parent
-    // with a listWorkers function
-    if (threadClient._parent && threadClient._parent.listWorkers) {
-      threadClient._parent.listWorkers().then(function (workers) {
-        return actions.setWorkers(workers);
-      });
-    }
+    threadClient._parent.listWorkers().then(function (workers) {
+      return actions.setWorkers(workers);
+    });
 
     // In Firefox, we need to initially request all of the sources. This
     // usually fires off individual `newSource` notifications as the
     // debugger finds them, but there may be existing sources already in
     // the debugger (if it's paused already, or if loading the page from
     // bfcache) so explicity fire `newSource` events for all returned
     // sources.
     var sources = yield _commands.clientCommands.fetchSources();
@@ -31065,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);
@@ -31377,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
@@ -31435,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);
 
@@ -31481,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.
@@ -31784,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 &&
@@ -32326,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
@@ -32411,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);
@@ -33496,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); } }
 
@@ -35179,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
@@ -36029,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.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.
@@ -38385,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);
 
@@ -38504,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");
 
@@ -38570,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, {
@@ -38828,20 +39200,16 @@ function isUnderscore(frame) {
 function isLodash(frame) {
   return getFrameUrl(frame).match(/lodash/i);
 }
 
 function isEmber(frame) {
   return getFrameUrl(frame).match(/ember/i);
 }
 
-function isChoo(frame) {
-  return getFrameUrl(frame).match(/choo/i);
-}
-
 function isVueJS(frame) {
   return getFrameUrl(frame).match(/vue\.js/i);
 }
 
 function isRxJs(frame) {
   return getFrameUrl(frame).match(/rxjs/i);
 }
 
@@ -38852,57 +39220,44 @@ 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";
   }
 
   if (isNodeInternal(frame)) {
     return "Node";
   }
 
   if (isExpress(frame)) {
     return "Express";
   }
 
-  if (isChoo(frame)) {
-    return "Choo";
-  }
-
   if (isPug(frame)) {
     return "Pug";
   }
 
   if (isExtJs(frame)) {
     return "ExtJS";
   }
 
@@ -39116,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,
@@ -39185,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(
@@ -39262,20 +39620,16 @@ Group.displayName = "Group";
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _lodash = __webpack_require__(2);
 
-var _reactRedux = __webpack_require__(1189);
-
-var _selectors = __webpack_require__(242);
-
 class HighlightLines extends _react.Component {
 
   constructor() {
     super();
     this.highlightLineRange = this.highlightLineRange.bind(this);
   }
 
   componentDidMount() {
@@ -39338,19 +39692,17 @@ class HighlightLines extends _react.Comp
       });
     });
   }
 
   render() {
     return null;
   }
 }
-exports.default = (0, _reactRedux.connect)(state => ({
-  highlightedLineRange: (0, _selectors.getHighlightedLineRange)(state)
-}))(HighlightLines);
+exports.default = HighlightLines;
 
 /***/ }),
 /* 1026 */,
 /* 1027 */,
 /* 1028 */,
 /* 1029 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -39364,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;
@@ -39799,21 +40151,16 @@ function update() {
         });
       }
 
     case "RESUMED":
       {
         return state.set("outOfScopeLocations", null);
       }
 
-    case "NAVIGATE":
-      {
-        return initialState();
-      }
-
     default:
       {
         return state;
       }
   }
 }
 
 // NOTE: we'd like to have the app state fully typed
@@ -39867,41 +40214,65 @@ exports.default = update;
 
 
 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; };
 
+/**
+ * Gets information about original variable names from the source map
+ * and replaces all posible generated names.
+ */
+var getSourcemapedExpression = (() => {
+  var _ref = _asyncToGenerator(function* (_ref2, generatedLocation, expression) {
+    var sourceMaps = _ref2.sourceMaps;
+
+    var astScopes = yield (0, _parser.getScopes)(generatedLocation);
+
+    var generatedScopes = yield sourceMaps.getLocationScopes(generatedLocation, astScopes);
+
+    if (!generatedScopes) {
+      return expression;
+    }
+
+    return (0, _utils.replaceOriginalVariableName)(expression, generatedScopes);
+  });
+
+  return function getSourcemapedExpression(_x, _x2, _x3) {
+    return _ref.apply(this, arguments);
+  };
+})();
+
 exports.setSymbols = setSymbols;
 exports.setEmptyLines = setEmptyLines;
 exports.setOutOfScopeLocations = setOutOfScopeLocations;
 exports.clearPreview = clearPreview;
 exports.setPreview = setPreview;
 
 var _selectors = __webpack_require__(242);
 
 var _sources = __webpack_require__(254);
 
-var _expressions = __webpack_require__(252);
-
 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) {
   return (() => {
-    var _ref = _asyncToGenerator(function* (_ref2) {
-      var dispatch = _ref2.dispatch,
-          getState = _ref2.getState;
+    var _ref3 = _asyncToGenerator(function* (_ref4) {
+      var dispatch = _ref4.dispatch,
+          getState = _ref4.getState;
 
       var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
       if (!sourceRecord) {
         return;
       }
 
       var source = sourceRecord.toJS();
       if (!source.text || (0, _selectors.hasSymbols)(getState(), source)) {
@@ -39912,27 +40283,27 @@ function setSymbols(sourceId) {
 
       dispatch({
         type: "SET_SYMBOLS",
         source,
         symbols
       });
     });
 
-    return function (_x) {
-      return _ref.apply(this, arguments);
+    return function (_x4) {
+      return _ref3.apply(this, arguments);
     };
   })();
 }
 
 function setEmptyLines(sourceId) {
   return (() => {
-    var _ref3 = _asyncToGenerator(function* (_ref4) {
-      var dispatch = _ref4.dispatch,
-          getState = _ref4.getState;
+    var _ref5 = _asyncToGenerator(function* (_ref6) {
+      var dispatch = _ref6.dispatch,
+          getState = _ref6.getState;
 
       var sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
       if (!sourceRecord) {
         return;
       }
 
       var source = sourceRecord.toJS();
       if (!source.text) {
@@ -39943,27 +40314,27 @@ function setEmptyLines(sourceId) {
 
       dispatch({
         type: "SET_EMPTY_LINES",
         source,
         emptyLines
       });
     });
 
-    return function (_x2) {
-      return _ref3.apply(this, arguments);
+    return function (_x5) {
+      return _ref5.apply(this, arguments);
     };
   })();
 }
 
 function setOutOfScopeLocations() {
   return (() => {
-    var _ref5 = _asyncToGenerator(function* (_ref6) {
-      var dispatch = _ref6.dispatch,
-          getState = _ref6.getState;
+    var _ref7 = _asyncToGenerator(function* (_ref8) {
+      var dispatch = _ref8.dispatch,
+          getState = _ref8.getState;
 
       var location = (0, _selectors.getSelectedLocation)(getState());
       if (!location) {
         return;
       }
 
       var source = (0, _selectors.getSource)(getState(), location.sourceId);
 
@@ -39977,27 +40348,27 @@ function setOutOfScopeLocations() {
       var locations = yield (0, _parser.getOutOfScopeLocations)(source.toJS(), location);
 
       return dispatch({
         type: "OUT_OF_SCOPE_LOCATIONS",
         locations
       });
     });
 
-    return function (_x3) {
-      return _ref5.apply(this, arguments);
+    return function (_x6) {
+      return _ref7.apply(this, arguments);
     };
   })();
 }
 
 function clearPreview() {
-  return (_ref7) => {
-    var dispatch = _ref7.dispatch,
-        getState = _ref7.getState,
-        client = _ref7.client;
+  return (_ref9) => {
+    var dispatch = _ref9.dispatch,
+        getState = _ref9.getState,
+        client = _ref9.client;
 
     var currentSelection = (0, _selectors.getPreview)(getState());
     if (!currentSelection) {
       return;
     }
 
     return dispatch({
       type: "CLEAR_SELECTION"
@@ -40019,21 +40390,21 @@ function findBestMatch(symbols, tokenPos
     }
 
     return found;
   }, {});
 }
 
 function setPreview(token, tokenPos, cursorPos) {
   return (() => {
-    var _ref8 = _asyncToGenerator(function* (_ref9) {
-      var dispatch = _ref9.dispatch,
-          getState = _ref9.getState,
-          client = _ref9.client,
-          sourceMaps = _ref9.sourceMaps;
+    var _ref10 = _asyncToGenerator(function* (_ref11) {
+      var dispatch = _ref11.dispatch,
+          getState = _ref11.getState,
+          client = _ref11.client,
+          sourceMaps = _ref11.sourceMaps;
 
       var currentSelection = (0, _selectors.getPreview)(getState());
       if (currentSelection && currentSelection.updating) {
         return;
       }
 
       yield dispatch({
         type: "SET_PREVIEW",
@@ -40056,43 +40427,43 @@ function setPreview(token, tokenPos, cur
 
           var sourceId = source.get("id");
           if (location && !(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
             var generatedLocation = yield sourceMaps.getGeneratedLocation(_extends({}, location.start, { sourceId }), source.toJS());
 
             var generatedSourceId = generatedLocation.sourceId;
             yield dispatch((0, _sources.ensureParserHasSourceText)(generatedSourceId));
 
-            expression = yield (0, _expressions.getMappedExpression)({ sourceMaps }, generatedLocation, expression);
+            expression = yield getSourcemapedExpression({ dispatch, sourceMaps }, generatedLocation, expression);
           }
 
           var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
 
-          var _ref11 = yield client.evaluate(expression, {
+          var _ref13 = yield client.evaluate(expression, {
             frameId: selectedFrame.id
           }),
-              result = _ref11.result;
+              result = _ref13.result;
 
           if (result === undefined) {
             return;
           }
 
           return {
             expression,
             result,
             location,
             tokenPos,
             cursorPos
           };
         })()
       });
     });
 
-    return function (_x4) {
-      return _ref8.apply(this, arguments);
+    return function (_x7) {
+      return _ref10.apply(this, arguments);
     };
   })();
 }
 
 /***/ }),
 /* 1060 */,
 /* 1061 */,
 /* 1062 */,
@@ -40102,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);
 
@@ -40126,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 {
@@ -40334,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 */,
@@ -40398,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 */
@@ -40437,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;
   }
 
@@ -40562,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
@@ -40604,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;
   }
@@ -41275,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);
 
@@ -41318,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);
 
@@ -41445,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)
@@ -41482,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);
 
@@ -41537,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";
 
@@ -41569,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);
@@ -41815,24 +42311,22 @@ 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);
 
-var _lodash = __webpack_require__(2);
-
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Outline extends _react.Component {
 
   selectItem(location) {
     var _props = this.props,
         selectedSource = _props.selectedSource,
         selectSource = _props.selectSource;
@@ -41865,65 +42359,34 @@ class Outline extends _react.Component {
         key: `${name}:${location.start.line}:${location.start.column}`,
         className: "outline-list__element",
         onClick: () => this.selectItem(location)
       },
       _react2.default.createElement(_PreviewFunction2.default, { func: { name, parameterNames } })
     );
   }
 
-  renderClassFunctions(functions) {
-    var classFunctions = functions.filter(func => func.name != "anonymous" && !!func.klass);
-
-    if (classFunctions.length == 0) {
-      return null;
-    }
-
-    var klass = classFunctions[0].klass;
-    var klassFunc = (0, _lodash.find)(functions, func => func.name === klass);
-
-    return _react2.default.createElement(
-      "div",
-      { className: "outline-list__class" },
-      _react2.default.createElement(
-        "h2",
-        null,
-        klassFunc ? this.renderFunction(klassFunc) : klass
-      ),
-      _react2.default.createElement(
-        "ul",
-        { className: "outline-list__class-list" },
-        classFunctions.map(func => this.renderFunction(func))
-      )
-    );
-  }
-
-  renderFunctions(functions) {
-    var classes = (0, _lodash.uniq)(functions.map(func => func.klass));
-
-    var namedFunctions = functions.filter(func => func.name != "anonymous" && !func.klass && !classes.includes(func.name));
-
+  renderFunctions(symbols) {
     return _react2.default.createElement(
       "ul",
       { className: "outline-list" },
-      namedFunctions.map(func => this.renderFunction(func)),
-      this.renderClassFunctions(functions)
+      symbols.map(func => this.renderFunction(func))
     );
   }
 
   render() {
     var symbols = this.props.symbols;
 
 
     var symbolsToDisplay = symbols.functions.filter(func => func.name != "anonymous");
 
     return _react2.default.createElement(
       "div",
       { className: "outline" },
-      symbolsToDisplay.length > 0 ? this.renderFunctions(symbols.functions) : this.renderPlaceholder()
+      symbolsToDisplay.length > 0 ? this.renderFunctions(symbolsToDisplay) : this.renderPlaceholder()
     );
   }
 }
 
 exports.Outline = Outline;
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
@@ -41950,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();
   }
@@ -42017,46 +42480,50 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _redux = __webpack_require__(3);
+
+var _reactRedux = __webpack_require__(1189);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-var _redux = __webpack_require__(3);
-
-var _reactRedux = __webpack_require__(1189);
+var _reactImmutableProptypes = __webpack_require__(150);
+
+var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
+
+var _immutable = __webpack_require__(146);
 
 var _selectors = __webpack_require__(242);
 
+var _sourcesTree = __webpack_require__(39);
+
+var _ManagedTree = __webpack_require__(419);
+
+var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
+
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
-var _ManagedTree = __webpack_require__(419);
-
-var _ManagedTree2 = _interopRequireDefault(_ManagedTree);
-
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-var _sourcesTree = __webpack_require__(39);
-
-var _immutable = __webpack_require__(146);
-
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _clipboard = __webpack_require__(423);
 
 var _utils = __webpack_require__(234);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
@@ -42139,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)
     });
   }
@@ -42160,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)) {
@@ -42203,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,
@@ -42299,29 +42768,26 @@ class SourcesTree extends _react.Compone
     return _react2.default.createElement(
       "div",
       { className: "sources-list", onKeyDown: onKeyDown },
       tree
     );
   }
 }
 
-// Utils
-
-
-// Components
-
-
-// Types
-
-
-// Redux
-
-
-// React
+SourcesTree.propTypes = {
+  sources: _reactImmutableProptypes2.default.map.isRequired,
+  selectSource: _react.PropTypes.func.isRequired,
+  shownSource: _react.PropTypes.string,
+  selectedSource: _reactImmutableProptypes2.default.map,
+  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)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourcesTree);
@@ -42337,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 {
@@ -42451,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;
@@ -43638,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/. */
@@ -43693,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,
@@ -43927,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);
 
@@ -43996,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}`,
@@ -44014,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;
 
 
@@ -44188,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, {
@@ -44209,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;
     }
 
@@ -44231,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()),
@@ -44451,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 }
@@ -44632,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",
@@ -44752,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__) {
@@ -44832,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,
@@ -44857,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
@@ -46240,716 +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
-
-/***/ }),
-/* 1272 */,
-/* 1273 */,
-/* 1274 */,
-/* 1275 */,
-/* 1276 */,
-/* 1277 */,
-/* 1278 */,
-/* 1279 */,
-/* 1280 */,
-/* 1281 */,
-/* 1282 */,
-/* 1283 */,
-/* 1284 */,
-/* 1285 */,
-/* 1286 */,
-/* 1287 */,
-/* 1288 */,
-/* 1289 */,
-/* 1290 */
-/***/ (function(module, exports) {
-
-module.exports = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 512 512\" enable-background=\"new 0 0 512 512\" xml:space=\"preserve\"><g id=\"Layer_2\"><path fill=\"#132028\" d=\"M190.475,376V203.308H81.266c-27.129,0-50.139,26-58.222,62.035c-9.877,1.302-17.62,13.541-17.62,28.455 c0,14.914,7.743,27.153,17.62,28.455c7.291,32.507,26.733,56.84,50.385,61.294v68.669h395.95V376H190.475z\"></path></g><g id=\"Layer_3\"><path fill=\"#575A5B\" d=\"M490.712,427.977c0,30.941-25.082,56.023-56.023,56.023c-25.804,0-47.519-17.451-54.023-41.19 c-6.504,23.739-28.219,41.19-54.023,41.19c-30.941,0-56.023-25.082-56.023-56.023c0-30.941,25.082-56.023,56.023-56.023 c25.804,0,47.519,17.451,54.023,41.19c6.504-23.739,28.219-41.19,54.023-41.19C465.629,371.954,490.712,397.036,490.712,427.977z M161.24,203.308l29.75-113.845H94.232l29.75,113.845h-13.668c-33.865,0-61.319,40.513-61.319,90.489 c0,49.976,27.453,90.489,61.319,90.489H294.27V203.308H161.24z M162.321,420.431c-13.164,0-24.458,8.002-29.285,19.408 c-4.826-11.405-16.121-19.408-29.284-19.408c-17.554,0-31.785,14.23-31.785,31.784c0,17.554,14.23,31.785,31.785,31.785 c13.164,0,24.458-8.002,29.284-19.408C137.863,475.998,149.157,484,162.321,484c17.554,0,31.784-14.23,31.784-31.785 C194.106,434.661,179.875,420.431,162.321,420.431z\"></path></g><g id=\"Layer_4\"><path fill=\"#FFB636\" d=\"M200.78,384.287h-16.028c-20.105,0-36.403-40.513-36.403-90.489c0-49.976,16.298-90.489,36.403-90.489 h16.028c-20.105,0-36.403,40.513-36.403,90.489C164.378,343.773,180.676,384.287,200.78,384.287z M122.236,293.797 c0-49.976,16.298-90.489,36.403-90.489H142.61c-20.105,0-36.403,40.513-36.403,90.489c0,49.976,16.298,90.489,36.403,90.489h16.028 C138.534,384.287,122.236,343.773,122.236,293.797z\"></path></g><g id=\"Layer_5\"><path fill=\"#FF473E\" d=\"M489.353,384.287H294.27V85.761h195.083V384.287z M74.21,384.103h-7.99c-2.436,0-4.707,1.48-6.035,3.934 l-43.633,80.594C13.436,474.387,16.874,482,22.587,482h52.826c4.027,0,7.271-3.968,7.199-8.806l-1.203-80.594 C81.339,387.883,78.136,384.103,74.21,384.103z\"></path></g><g id=\"Layer_6\"><path fill=\"#EF2020\" d=\"M497.28,66.397H286.342c-5.92,0-10.72,4.8-10.72,10.72v1.626c0,5.92,4.8,10.72,10.72,10.72H497.28 c5.921,0,10.72-4.8,10.72-10.72v-1.626C508,71.197,503.201,66.397,497.28,66.397z\"></path></g><g id=\"Layer_7\"><path fill=\"#76DFFF\" d=\"M371.466,257.523h-40.952c-3.976,0-7.2-3.224-7.2-7.2V124.018c0-3.976,3.224-7.2,7.2-7.2h40.952 c3.976,0,7.2,3.224,7.2,7.2v126.305C378.666,254.3,375.442,257.523,371.466,257.523z M460.474,250.323V124.018 c0-3.976-3.224-7.2-7.2-7.2h-40.952c-3.976,0-7.2,3.224-7.2,7.2v126.305c0,3.976,3.224,7.2,7.2,7.2h40.952 C457.251,257.523,460.474,254.3,460.474,250.323z\"></path></g><g id=\"Layer_8\"><path fill=\"#132028\" d=\"M489.353,339.586H294.27v-36.582h195.083V339.586z M111.17,52L94.206,89.463h96.758L174,52H111.17z M326.643,414.954c-7.192,0-13.023,5.831-13.023,13.023S319.451,441,326.643,441c7.192,0,13.023-5.831,13.023-13.023 S333.835,414.954,326.643,414.954z M434.689,414.954c-7.192,0-13.023,5.831-13.023,13.023S427.496,441,434.689,441 s13.023-5.831,13.023-13.023S441.881,414.954,434.689,414.954z M103.752,444.827c-4.081,0-7.389,3.308-7.389,7.389 s3.308,7.389,7.389,7.389c4.081,0,7.389-3.308,7.389-7.389S107.833,444.827,103.752,444.827z M162.321,444.827 c-4.081,0-7.389,3.308-7.389,7.389s3.308,7.389,7.389,7.389s7.389-3.308,7.389-7.389S166.402,444.827,162.321,444.827z\"></path></g><g id=\"Layer_9\"><path fill=\"#FFB636\" d=\"M196.709,444.208h-92.957c-4.91,0-8.891-3.98-8.891-8.891s3.98-8.891,8.891-8.891h90.449l36.759-22.53 c1.398-0.857,3.006-1.311,4.646-1.311H459.54c4.91,0,8.891,3.98,8.891,8.891s-3.98,8.891-8.891,8.891H238.114l-36.759,22.53 C199.957,443.755,198.349,444.208,196.709,444.208z\"></path></g><g id=\"Layer_10\"><path fill=\"#ADB7BC\" d=\"M69.849,393.079c-5.787,0-10.485-4.685-10.5-10.475c-0.014-5.799,4.676-10.512,10.475-10.525l413.924-1 c0.009,0,0.018,0,0.026,0c5.787,0,10.485,4.685,10.499,10.475c0.014,5.799-4.676,10.512-10.475,10.525l-413.924,1 C69.867,393.079,69.857,393.079,69.849,393.079z\"></path></g></svg>"
-
 /***/ })
 /******/ ]);
 });
\ 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);
@@ -24231,17 +24237,17 @@ exports.default = function (rawLines, li
 var _jsTokens = __webpack_require__(630);
 
 var _jsTokens2 = _interopRequireDefault(_jsTokens);
 
 var _esutils = __webpack_require__(530);
 
 var _esutils2 = _interopRequireDefault(_esutils);
 
-var _chalk = __webpack_require__(1291);
+var _chalk = __webpack_require__(631);
 
 var _chalk2 = _interopRequireDefault(_chalk);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function getDefs(chalk) {
   return {
     keyword: chalk.cyan,
@@ -24338,17 +24344,140 @@ exports.matchToToken = function(match) {
   else if (match[10]) token.type = "name"
   else if (match[11]) token.type = "punctuator"
   else if (match[12]) token.type = "whitespace"
   return token
 }
 
 
 /***/ }),
-/* 631 */,
+/* 631 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {
+var escapeStringRegexp = __webpack_require__(632);
+var ansiStyles = __webpack_require__(1056);
+var stripAnsi = __webpack_require__(634);
+var hasAnsi = __webpack_require__(636);
+var supportsColor = __webpack_require__(637);
+var defineProps = Object.defineProperties;
+var isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(Object({"NODE_ENV":"production","TARGET":"firefox-panel"}).TERM);
+
+function Chalk(options) {
+	// detect mode if not set manually
+	this.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled;
+}
+
+// use bright blue on Windows as the normal blue color is illegible
+if (isSimpleWindowsTerm) {
+	ansiStyles.blue.open = '\u001b[94m';
+}
+
+var styles = (function () {
+	var ret = {};
+
+	Object.keys(ansiStyles).forEach(function (key) {
+		ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
+
+		ret[key] = {
+			get: function () {
+				return build.call(this, this._styles.concat(key));
+			}
+		};
+	});
+
+	return ret;
+})();
+
+var proto = defineProps(function chalk() {}, styles);
+
+function build(_styles) {
+	var builder = function () {
+		return applyStyle.apply(builder, arguments);
+	};
+
+	builder._styles = _styles;
+	builder.enabled = this.enabled;
+	// __proto__ is used because we must return a function, but there is
+	// no way to create a function with a different prototype.
+	/* eslint-disable no-proto */
+	builder.__proto__ = proto;
+
+	return builder;
+}
+
+function applyStyle() {
+	// support varags, but simply cast to string in case there's only one arg
+	var args = arguments;
+	var argsLen = args.length;
+	var str = argsLen !== 0 && String(arguments[0]);
+
+	if (argsLen > 1) {
+		// don't slice `arguments`, it prevents v8 optimizations
+		for (var a = 1; a < argsLen; a++) {
+			str += ' ' + args[a];
+		}
+	}
+
+	if (!this.enabled || !str) {
+		return str;
+	}
+
+	var nestedStyles = this._styles;
+	var i = nestedStyles.length;
+
+	// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
+	// see https://github.com/chalk/chalk/issues/58
+	// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
+	var originalDim = ansiStyles.dim.open;
+	if (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) {
+		ansiStyles.dim.open = '';
+	}
+
+	while (i--) {
+		var code = ansiStyles[nestedStyles[i]];
+
+		// Replace any instances already present with a re-opening code
+		// otherwise only the part of the string until said closing code
+		// will be colored, and the rest will simply be 'plain'.
+		str = code.open + str.replace(code.closeRe, code.open) + code.close;
+	}
+
+	// Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.
+	ansiStyles.dim.open = originalDim;
+
+	return str;
+}
+
+function init() {
+	var ret = {};
+
+	Object.keys(styles).forEach(function (name) {
+		ret[name] = {
+			get: function () {
+				return build.call(this, [name]);
+			}
+		};
+	});
+
+	return ret;
+}
+
+defineProps(Chalk.prototype, init());
+
+module.exports = new Chalk();
+module.exports.styles = ansiStyles;
+module.exports.hasColor = hasAnsi;
+module.exports.stripColor = stripAnsi;
+module.exports.supportsColor = supportsColor;
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(120)))
+
+/***/ }),
 /* 632 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
 
@@ -24393,17 +24522,74 @@ module.exports = function () {
 "use strict";
 
 var ansiRegex = __webpack_require__(635);
 var re = new RegExp(ansiRegex().source); // remove the `g` flag
 module.exports = re.test.bind(re);
 
 
 /***/ }),
-/* 637 */,
+/* 637 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {
+var argv = process.argv;
+
+var terminator = argv.indexOf('--');
+var hasFlag = function (flag) {
+	flag = '--' + flag;
+	var pos = argv.indexOf(flag);
+	return pos !== -1 && (terminator !== -1 ? pos < terminator : true);
+};
+
+module.exports = (function () {
+	if ('FORCE_COLOR' in Object({"NODE_ENV":"production","TARGET":"firefox-panel"})) {
+		return true;
+	}
+
+	if (hasFlag('no-color') ||
+		hasFlag('no-colors') ||
+		hasFlag('color=false')) {
+		return false;
+	}
+
+	if (hasFlag('color') ||
+		hasFlag('colors') ||
+		hasFlag('color=true') ||
+		hasFlag('color=always')) {
+		return true;
+	}
+
+	if (process.stdout && !process.stdout.isTTY) {
+		return false;
+	}
+
+	if (process.platform === 'win32') {
+		return true;
+	}
+
+	if ('COLORTERM' in Object({"NODE_ENV":"production","TARGET":"firefox-panel"})) {
+		return true;
+	}
+
+	if (Object({"NODE_ENV":"production","TARGET":"firefox-panel"}).TERM === 'dumb') {
+		return false;
+	}
+
+	if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(Object({"NODE_ENV":"production","TARGET":"firefox-panel"}).TERM)) {
+		return true;
+	}
+
+	return false;
+})();
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(120)))
+
+/***/ }),
 /* 638 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* WEBPACK VAR INJECTION */(function(global) {
 
 exports.__esModule = true;
 
@@ -28279,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 */,
@@ -28576,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),
@@ -28721,170 +29085,159 @@ module.exports = isEmpty;
 /* 1016 */,
 /* 1017 */,
 /* 1018 */,
 /* 1019 */,
 /* 1020 */,
 /* 1021 */,
 /* 1022 */,
 /* 1023 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractScriptTags", function() { return extractScriptTags; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateWhitespace", function() { return generateWhitespace; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCandidateScriptLocations", function() { return getCandidateScriptLocations; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseScript", function() { return parseScript; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseScripts", function() { return parseScripts; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseScriptTags", function() { return parseScriptTags; });
-const babylon = __webpack_require__(435);
-const types = __webpack_require__(493);
-
-const startScript = /<script[^>]*>/im;
-const endScript = /<\/script\s*>/im;
-// https://stackoverflow.com/questions/5034781/js-regex-to-split-by-line#comment5633979_5035005
-const newLines = /\r\n|[\n\v\f\r\x85\u2028\u2029]/;
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+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 babylon = __webpack_require__(435);
+var types = __webpack_require__(493);
+
+var startScript = /<script[^>]*>/im;
+var endScript = /<\/script\s*>/im;
 
 function getCandidateScriptLocations(source, index) {
-  const i = index || 0;
-  const str = source.substring(i);
-
-  const startMatch = startScript.exec(str);
+  var i = index || 0;
+  var str = source.substring(i);
+
+  var startMatch = startScript.exec(str);
   if (startMatch) {
-    const startsAt = startMatch.index + startMatch[0].length;
-    const afterStart = str.substring(startsAt);
-    const endMatch = endScript.exec(afterStart);
+    var startsAt = startMatch.index + startMatch[0].length;
+    var afterStart = str.substring(startsAt);
+    var endMatch = endScript.exec(afterStart);
     if (endMatch) {
-      const locLength = endMatch.index;
-      const locIndex = i + startsAt;
-
-      return [
-        adjustForLineAndColumn(source, {
-          index: locIndex,
-          length: locLength,
-          source: source.substring(locIndex, locIndex + locLength)
-        }),
-        ...getCandidateScriptLocations(
-          source,
-          locIndex + locLength + endMatch[0].length
-        )
-      ];
+      var locLength = endMatch.index;
+      var locIndex = i + startsAt;
+
+      return [adjustForLineAndColumn(source, {
+        index: locIndex,
+        length: locLength,
+        source: source.substring(locIndex, locIndex + locLength)
+      })].concat(_toConsumableArray(getCandidateScriptLocations(source, locIndex + locLength + endMatch[0].length)));
     }
   }
 
   return [];
 }
 
-function parseScript({source, line}) {
+function parseScript(_ref) {
+  var source = _ref.source,
+      line = _ref.line;
+
   // remove empty or only whitespace scripts
   if (source.length === 0 || /^\s+$/.test(source)) {
     return null;
   }
 
   try {
     return babylon.parse(source, {
       sourceType: "script",
       startLine: line
     });
   } catch (e) {
     return null;
   }
 }
 
-function parseScripts(locations, parser = parseScript) {
+function parseScripts(locations) {
+  var parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : parseScript;
+
   return locations.map(parser);
 }
 
 function generateWhitespace(length) {
   return Array.from(new Array(length + 1)).join(" ");
 }
 
 function calcLineAndColumn(source, index) {
-  const lines = source
-    .substring(0, index)
-    .split(newLines)
-  const line = lines.length;
-  const column = lines.pop().length + 1;
+  var lines = source.substring(0, index).replace(/\r\l?/, "\n").split(/\n/);
+  var line = lines.length;
+  var column = lines.pop().length + 1;
 
   return {
-    column,
-    line
+    column: column,
+    line: line
   };
 }
 
 function adjustForLineAndColumn(fullSource, location) {
-  const {column, line} = calcLineAndColumn(fullSource, location.index);
+  var _calcLineAndColumn = calcLineAndColumn(fullSource, location.index),
+      column = _calcLineAndColumn.column,
+      line = _calcLineAndColumn.line;
+
   return Object.assign({}, location, {
-    line,
-    column,
+    line: line,
+    column: column,
     // prepend whitespace for scripts that do not start on the first column
     source: generateWhitespace(column) + location.source
   });
 }
 
 function parseScriptTags(source, parser) {
-  const scripts = parseScripts(
-    getCandidateScriptLocations(source),
-    parser
-  ).filter(
-    types.isFile
-  ).reduce((main, script) => {
+  var scripts = parseScripts(getCandidateScriptLocations(source), parser).filter(types.isFile).reduce(function (main, script) {
     return {
       statements: main.statements.concat(script.program.body),
       comments: main.comments.concat(script.comments),
       tokens: main.tokens.concat(script.tokens)
     };
   }, {
     statements: [],
     comments: [],
     tokens: []
   });
 
-  const program = types.program(scripts.statements);
-  const file = types.file(
-    program,
-    scripts.comments,
-    scripts.tokens
-  );
-
-  const end = calcLineAndColumn(source, source.length);
+  var program = types.program(scripts.statements);
+  var file = types.file(program, scripts.comments, scripts.tokens);
+
+  var end = calcLineAndColumn(source, source.length);
   file.start = program.start = 0;
   file.end = program.end = source.length;
   file.loc = program.loc = {
     start: {
       line: 1,
       column: 0
     },
-    end
-  }
+    end: end
+  };
 
   return file;
 }
 
 function extractScriptTags(source) {
-  return parseScripts(
-    getCandidateScriptLocations(source),
-    loc => {
-      const ast = parseScript(loc);
-
-      if (ast) {
-        return loc;
-      }
-
-      return null;
-    }