Merge mozilla-central to autoland
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Wed, 10 Aug 2016 16:05:21 +0200
changeset 334697 d44be6871ba02a9b02e5afeb0159bad5378ac413
parent 334696 949e3622421482913424f4fc168b2d2096015134 (current diff)
parent 334628 c12bb83ad278a7884af9c70c3622dc6b4c819eaf (diff)
child 334698 f9f5b652c83728814cb5134294d351133b53e938
push id10033
push userraliiev@mozilla.com
push dateMon, 19 Sep 2016 13:50:26 +0000
treeherdermozilla-aurora@5dddbefdf759 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone51.0a1
Merge mozilla-central to autoland
build/moz.configure/compilechecks.configure
js/src/tests/js1_8/extensions/regress-476427.js
netwerk/socket/nsSOCKS4SocketProvider.h
python/mozbuild/mozbuild/test/configure/test_header_checks.py
testing/web-platform/meta/mixed-content/optionally-blockable/http-csp/cross-origin-http/link-prefetch-tag/top-level/keep-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/http-csp/cross-origin-http/link-prefetch-tag/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/http-csp/cross-origin-http/link-prefetch-tag/top-level/swap-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/http-csp/same-host-http/link-prefetch-tag/top-level/keep-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/http-csp/same-host-http/link-prefetch-tag/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/http-csp/same-host-http/link-prefetch-tag/top-level/swap-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/meta-csp/cross-origin-http/link-prefetch-tag/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/optionally-blockable/meta-csp/same-host-http/link-prefetch-tag/top-level/no-redirect/opt-in-blocks.https.html.ini
toolkit/components/telemetry/docs/common-ping.rst
toolkit/components/telemetry/docs/core-ping.rst
toolkit/components/telemetry/docs/crash-ping.rst
toolkit/components/telemetry/docs/crashes.rst
toolkit/components/telemetry/docs/deletion-ping.rst
toolkit/components/telemetry/docs/environment.rst
toolkit/components/telemetry/docs/heartbeat-ping.rst
toolkit/components/telemetry/docs/main-ping.rst
toolkit/components/telemetry/docs/pings.rst
toolkit/components/telemetry/docs/preferences.rst
toolkit/components/telemetry/docs/scalars.rst
toolkit/components/telemetry/docs/sync-ping.rst
toolkit/components/telemetry/docs/uitour-ping.rst
--- a/.ycm_extra_conf.py
+++ b/.ycm_extra_conf.py
@@ -22,16 +22,20 @@ if not os.path.exists(path):
     path = os.path.join(config.topsrcdir, 'mach')
 mach_module = imp.load_module('_mach', open(path), path, ('', 'r', imp.PY_SOURCE))
 
 sys.dont_write_bytecode = old_bytecode
 
 def FlagsForFile(filename):
     mach = mach_module.get_mach()
     out = StringIO()
+
+    # Mach calls sys.stdout.fileno(), so we need to fake it when capturing it.
+    # Returning an invalid file descriptor does the trick.
+    out.fileno = lambda: -1
     out.encoding = None
     mach.run(['compileflags', filename], stdout=out, stderr=out)
 
     flag_list = shlex.split(out.getvalue())
 
     # This flag is added by Fennec for android build and causes ycmd to fail to parse the file.
     # Removing this flag is a workaround until ycmd starts to handle this flag properly.
     # https://github.com/Valloric/YouCompleteMe/issues/1490
--- a/accessible/jsat/AccessFu.jsm
+++ b/accessible/jsat/AccessFu.jsm
@@ -242,17 +242,17 @@ this.AccessFu = { // jshint ignore:line
       case 'AccessFu:DoScroll':
         this.Input.doScroll(aMessage.json);
         break;
     }
   },
 
   _output: function _output(aPresentationData, aBrowser) {
     if (!Utils.isAliveAndVisible(
-      Utils.AccRetrieval.getAccessibleFor(aBrowser))) {
+      Utils.AccService.getAccessibleFor(aBrowser))) {
       return;
     }
     for (let presenter of aPresentationData) {
       if (!presenter) {
         continue;
       }
 
       try {
--- a/accessible/jsat/ContentControl.jsm
+++ b/accessible/jsat/ContentControl.jsm
@@ -217,17 +217,17 @@ this.ContentControl.prototype = {
         if (control && control.actionCount > 0) {
           control.doAction(0);
         }
 
         // XXX Some mobile widget sets do not expose actions properly
         // (via ARIA roles, etc.), so we need to generate a click.
         // Could possibly be made simpler in the future. Maybe core
         // engine could expose nsCoreUtiles::DispatchMouseEvent()?
-        let docAcc = Utils.AccRetrieval.getAccessibleFor(this.document);
+        let docAcc = Utils.AccService.getAccessibleFor(this.document);
         let docX = {}, docY = {}, docW = {}, docH = {};
         docAcc.getBounds(docX, docY, docW, docH);
 
         let objX = {}, objY = {}, objW = {}, objH = {};
         aAccessible.getBounds(objX, objY, objW, objH);
 
         let x = Math.round((objX.value - docX.value) + objW.value / 2);
         let y = Math.round((objY.value - docY.value) + objH.value / 2);
@@ -244,17 +244,17 @@ this.ContentControl.prototype = {
 
       if (!Utils.isActivatableOnFingerUp(aAccessible)) {
         // Keys will typically have a sound of their own.
         this._contentScope.get().sendAsyncMessage('AccessFu:Present',
           Presentation.actionInvoked(aAccessible, 'click'));
       }
     };
 
-    let focusedAcc = Utils.AccRetrieval.getAccessibleFor(
+    let focusedAcc = Utils.AccService.getAccessibleFor(
       this.document.activeElement);
     if (focusedAcc && this.vc.position === focusedAcc
         && focusedAcc.role === Roles.ENTRY) {
       let accText = focusedAcc.QueryInterface(Ci.nsIAccessibleText);
       let oldOffset = accText.caretOffset;
       let newOffset = aMessage.json.offset;
       let text = accText.getText(0, accText.characterCount);
 
@@ -473,17 +473,17 @@ this.ContentControl.prototype = {
 
       if (aOptions.noOpIfOnScreen &&
         Utils.isAliveAndVisible(vc.position, true)) {
         forcePresentFunc();
         return;
       }
 
       if (aOptions.moveToFocused) {
-        acc = Utils.AccRetrieval.getAccessibleFor(
+        acc = Utils.AccService.getAccessibleFor(
           this.document.activeElement) || acc;
       }
 
       let moved = false;
       let moveMethod = aOptions.moveMethod || 'moveNext'; // default is moveNext
       let moveFirstOrLast = moveMethod in ['moveFirst', 'moveLast'];
       if (!moveFirstOrLast || acc) {
         // We either need next/previous or there is an anchor we need to use.
--- a/accessible/jsat/EventManager.jsm
+++ b/accessible/jsat/EventManager.jsm
@@ -554,25 +554,25 @@ this.EventManager.prototype = {
     if ((aStateFlags & loadingState) == loadingState) {
       tabstate = 'loading';
     } else if ((aStateFlags & loadedState) == loadedState &&
                !aWebProgress.isLoadingDocument) {
       tabstate = 'loaded';
     }
 
     if (tabstate) {
-      let docAcc = Utils.AccRetrieval.getAccessibleFor(aWebProgress.DOMWindow.document);
+      let docAcc = Utils.AccService.getAccessibleFor(aWebProgress.DOMWindow.document);
       this.present(Presentation.tabStateChanged(docAcc, tabstate));
     }
   },
 
   onProgressChange: function onProgressChange() {},
 
   onLocationChange: function onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
-    let docAcc = Utils.AccRetrieval.getAccessibleFor(aWebProgress.DOMWindow.document);
+    let docAcc = Utils.AccService.getAccessibleFor(aWebProgress.DOMWindow.document);
     this.present(Presentation.tabStateChanged(docAcc, 'newdoc'));
   },
 
   onStatusChange: function onStatusChange() {},
 
   onSecurityChange: function onSecurityChange() {},
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
--- a/accessible/jsat/OutputGenerator.jsm
+++ b/accessible/jsat/OutputGenerator.jsm
@@ -47,17 +47,17 @@ var OutputGenerator = {
    */
   genForContext: function genForContext(aContext) {
     let output = [];
     let self = this;
     let addOutput = function addOutput(aAccessible) {
       output.push.apply(output, self.genForObject(aAccessible, aContext));
     };
     let ignoreSubtree = function ignoreSubtree(aAccessible) {
-      let roleString = Utils.AccRetrieval.getStringRole(aAccessible.role);
+      let roleString = Utils.AccService.getStringRole(aAccessible.role);
       let nameRule = self.roleRuleMap[roleString] || 0;
       // Ignore subtree if the name is explicit and the role's name rule is the
       // NAME_FROM_SUBTREE_RULE.
       return (((nameRule & INCLUDE_VALUE) && aAccessible.value) ||
               ((nameRule & NAME_FROM_SUBTREE_RULE) &&
                (Utils.getAttributes(aAccessible)['explicit-name'] === 'true' &&
                !(nameRule & IGNORE_EXPLICIT_NAME))));
     };
@@ -103,17 +103,17 @@ var OutputGenerator = {
    *    context information for a given accessible and its relationship with
    *    another accessible.
    * @return {Array} A 2 element array of speech data. The first element
    *    describes the object and its state. The second element is the object's
    *    name. Whether the object's description or it's role is included is
    *    determined by {@link roleRuleMap}.
    */
   genForObject: function genForObject(aAccessible, aContext) {
-    let roleString = Utils.AccRetrieval.getStringRole(aAccessible.role);
+    let roleString = Utils.AccService.getStringRole(aAccessible.role);
     let func = this.objectOutputFunctions[
       OutputGenerator._getOutputName(roleString)] ||
       this.objectOutputFunctions.defaultFunc;
 
     let flags = this.roleRuleMap[roleString] || 0;
 
     if (aAccessible.childCount === 0) {
       flags |= INCLUDE_NAME;
--- a/accessible/jsat/Traversal.jsm
+++ b/accessible/jsat/Traversal.jsm
@@ -377,17 +377,17 @@ this.TraversalHelper = {
     delete this.helperPivotCache;
     this.helperPivotCache = new WeakMap();
     return this.helperPivotCache;
   },
 
   getHelperPivot: function TraversalHelper_getHelperPivot(aRoot) {
     let pivot = this.helperPivotCache.get(aRoot.DOMNode);
     if (!pivot) {
-      pivot = Utils.AccRetrieval.createAccessiblePivot(aRoot);
+      pivot = Utils.AccService.createAccessiblePivot(aRoot);
       this.helperPivotCache.set(aRoot.DOMNode, pivot);
     }
 
     return pivot;
   },
 
   move: function TraversalHelper_move(aVirtualCursor, aMethod, aRule) {
     let rule = TraversalRules[aRule];
--- a/accessible/jsat/Utils.jsm
+++ b/accessible/jsat/Utils.jsm
@@ -64,23 +64,23 @@ this.Utils = { // jshint ignore:line
     let win = this.win;
     if (!win) {
       return null;
     }
     return win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(
       Ci.nsIDOMWindowUtils);
   },
 
-  get AccRetrieval() {
-    if (!this._AccRetrieval) {
-      this._AccRetrieval = Cc['@mozilla.org/accessibleRetrieval;1'].
-        getService(Ci.nsIAccessibleRetrieval);
+  get AccService() {
+    if (!this._AccService) {
+      this._AccService = Cc['@mozilla.org/accessibilityService;1'].
+        getService(Ci.nsIAccessibilityService);
     }
 
-    return this._AccRetrieval;
+    return this._AccService;
   },
 
   set MozBuildApp(value) {
     this._buildApp = value;
   },
 
   get MozBuildApp() {
     if (!this._buildApp) {
@@ -290,17 +290,17 @@ this.Utils = { // jshint ignore:line
       }
     }
 
     return attributes;
   },
 
   getVirtualCursor: function getVirtualCursor(aDocument) {
     let doc = (aDocument instanceof Ci.nsIAccessible) ? aDocument :
-      this.AccRetrieval.getAccessibleFor(aDocument);
+      this.AccService.getAccessibleFor(aDocument);
 
     return doc.QueryInterface(Ci.nsIAccessibleDocument).virtualCursor;
   },
 
   getContentResolution: function _getContentResolution(aAccessible) {
     let res = { value: 1 };
     aAccessible.document.window.QueryInterface(
       Ci.nsIInterfaceRequestor).getInterface(
@@ -534,17 +534,17 @@ function State(aBase, aExtended) {
   this.extended = aExtended;
 }
 
 State.prototype = {
   contains: function State_contains(other) {
     return !!(this.base & other.base || this.extended & other.extended);
   },
   toString: function State_toString() {
-    let stateStrings = Utils.AccRetrieval.
+    let stateStrings = Utils.AccService.
       getStringStates(this.base, this.extended);
     let statesArray = new Array(stateStrings.length);
     for (let i = 0; i < statesArray.length; i++) {
       statesArray[i] = stateStrings.item(i);
     }
     return '[' + statesArray.join(', ') + ']';
   }
 };
@@ -635,30 +635,30 @@ this.Logger = { // jshint ignore:line
   },
 
   accessibleToString: function accessibleToString(aAccessible) {
     if (!aAccessible) {
       return '[ null ]';
     }
 
     try {
-      return'[ ' + Utils.AccRetrieval.getStringRole(aAccessible.role) +
+      return'[ ' + Utils.AccService.getStringRole(aAccessible.role) +
         ' | ' + aAccessible.name + ' ]';
     } catch (x) {
       return '[ defunct ]';
     }
   },
 
   eventToString: function eventToString(aEvent) {
-    let str = Utils.AccRetrieval.getStringEventType(aEvent.eventType);
+    let str = Utils.AccService.getStringEventType(aEvent.eventType);
     if (aEvent.eventType == Events.STATE_CHANGE) {
       let event = aEvent.QueryInterface(Ci.nsIAccessibleStateChangeEvent);
       let stateStrings = event.isExtraState ?
-        Utils.AccRetrieval.getStringStates(0, event.state) :
-        Utils.AccRetrieval.getStringStates(event.state, 0);
+        Utils.AccService.getStringStates(0, event.state) :
+        Utils.AccService.getStringStates(event.state, 0);
       str += ' (' + stateStrings.item(0) + ')';
     }
 
     if (aEvent.eventType == Events.VIRTUALCURSOR_CHANGED) {
       let event = aEvent.QueryInterface(
         Ci.nsIAccessibleVirtualCursorChangeEvent);
       let pivot = aEvent.accessible.QueryInterface(
         Ci.nsIAccessibleDocument).virtualCursor;
@@ -882,17 +882,17 @@ PivotContext.prototype = {
   get interactionHints() {
     let hints = [];
     this.newAncestry.concat(this.accessible).reverse().forEach(aAccessible => {
       let hint = Utils.getAttributes(aAccessible)['moz-hint'];
       if (hint) {
         hints.push(hint);
       } else if (aAccessible.actionCount > 0) {
         hints.push({
-          string: Utils.AccRetrieval.getStringRole(
+          string: Utils.AccService.getStringRole(
             aAccessible.role).replace(/\s/g, '') + '-hint'
         });
       }
     });
     return hints;
   },
 
   /*
--- a/accessible/jsat/content-script.js
+++ b/accessible/jsat/content-script.js
@@ -116,17 +116,17 @@ addMessageListener(
 
     if (!eventManager) {
       eventManager = new EventManager(this, contentControl);
     }
     eventManager.inTest = m.json.inTest;
     eventManager.start();
 
     function contentStarted() {
-      let accDoc = Utils.AccRetrieval.getAccessibleFor(content.document);
+      let accDoc = Utils.AccService.getAccessibleFor(content.document);
       if (accDoc && !Utils.getState(accDoc).contains(States.BUSY)) {
         sendAsyncMessage('AccessFu:ContentStarted');
       } else {
         content.setTimeout(contentStarted, 0);
       }
     }
 
     if (m.json.inTest) {
--- a/accessible/tests/crashtests/448064.xhtml
+++ b/accessible/tests/crashtests/448064.xhtml
@@ -44,18 +44,18 @@ netscape.security.PrivilegeManager.enabl
 		}
 	} catch (e) {
 		dump("Error visiting child nodes: " + e + '\n');
 	}
 }
 
 function A(o) { 
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-  var acc = Components.classes['@mozilla.org/accessibleRetrieval;1']
-                         .getService(Components.interfaces.nsIAccessibleRetrieval);
+  var acc = Components.classes['@mozilla.org/accessibilityService;1']
+                         .getService(Components.interfaces.nsIAccessibilityService);
   return acc.getAccessibleFor(o);
 }
 
 function beginAccessible() {
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
   dumpAccessibleTree(A(document),0);
 }
 setTimeout(beginAccessible, 100);
--- a/accessible/tests/crashtests/471493.xul
+++ b/accessible/tests/crashtests/471493.xul
@@ -4,25 +4,25 @@
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         title="bug 471493 'crash [@ nsPropertyTable::GetPropertyInternal]'"
         onload="doTest();">
 
   <script type="application/javascript">
   <![CDATA[
     function doTest()
     {
-      var accRetrieval = SpecialPowers.Cc["@mozilla.org/accessibleRetrieval;1"].
-        getService(SpecialPowers.Ci.nsIAccessibleRetrieval);
+      var accService = SpecialPowers.Cc["@mozilla.org/accessibilityService;1"].
+        getService(SpecialPowers.Ci.nsIAccessibilityService);
 
       var treecol = document.getElementById("col");
       var x = treecol.boxObject.screenX;
       var y = treecol.boxObject.screenY;
 
       var tree = document.getElementById("tree");
-      var treeAcc = accRetrieval.getAccessibleFor(tree);
+      var treeAcc = accService.getAccessibleFor(tree);
       treeAcc.getChildAtPoint(x + 1, y + 1);
     }
   ]]>
   </script>
 
   <tree id="tree" flex="1">
     <treecols>
       <treecol id="col" flex="1" primary="true" label="column"/>
--- a/accessible/tests/mochitest/common.js
+++ b/accessible/tests/mochitest/common.js
@@ -1,12 +1,12 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Interfaces
 
-const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+const nsIAccessibilityService = Components.interfaces.nsIAccessibilityService;
 
 const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent;
 const nsIAccessibleStateChangeEvent =
   Components.interfaces.nsIAccessibleStateChangeEvent;
 const nsIAccessibleCaretMoveEvent =
   Components.interfaces.nsIAccessibleCaretMoveEvent;
 const nsIAccessibleTextChangeEvent =
   Components.interfaces.nsIAccessibleTextChangeEvent;
@@ -89,35 +89,35 @@ const kSquareBulletText = String.fromCha
 const MAX_TRIM_LENGTH = 100;
 
 /**
  * Services to determine if e10s is enabled.
  */
 Components.utils.import('resource://gre/modules/Services.jsm');
 
 /**
- * nsIAccessibleRetrieval service.
+ * nsIAccessibilityService service.
  */
-var gAccRetrieval = Components.classes["@mozilla.org/accessibleRetrieval;1"].
-  getService(nsIAccessibleRetrieval);
+var gAccService = Components.classes["@mozilla.org/accessibilityService;1"].
+  getService(nsIAccessibilityService);
 
 /**
  * Enable/disable logging.
  */
 function enableLogging(aModules)
 {
-  gAccRetrieval.setLogging(aModules);
+  gAccService.setLogging(aModules);
 }
 function disableLogging()
 {
-  gAccRetrieval.setLogging("");
+  gAccService.setLogging("");
 }
 function isLogged(aModule)
 {
-  return gAccRetrieval.isLogged(aModule);
+  return gAccService.isLogged(aModule);
 }
 
 /**
  * Dumps the accessible tree into console.
  */
 function dumpTree(aId, aMsg)
 {
   function dumpTreeIntl(acc, indent)
@@ -267,17 +267,17 @@ function getAccessible(aAccOrElmOrID, aI
   }
 
   if (aElmObj && (typeof aElmObj == "object"))
     aElmObj.value = elm;
 
   var acc = (aAccOrElmOrID instanceof nsIAccessible) ? aAccOrElmOrID : null;
   if (!acc) {
     try {
-      acc = gAccRetrieval.getAccessibleFor(elm);
+      acc = gAccService.getAccessibleFor(elm);
     } catch (e) {
     }
 
     if (!acc) {
       if (!(aDoNotFailIf & DONOTFAIL_IF_NO_ACC))
         ok(false, "Can't get accessible for " + prettyName(aAccOrElmOrID));
 
       return null;
@@ -358,17 +358,17 @@ function getTabDocAccessible(aAccOrElmOr
   return containerDocAcc.QueryInterface(nsIAccessible);
 }
 
 /**
  * Return application accessible.
  */
 function getApplicationAccessible()
 {
-  return gAccRetrieval.getApplicationAccessible().
+  return gAccService.getApplicationAccessible().
     QueryInterface(nsIAccessibleApplication);
 }
 
 /**
  * A version of accessible tree testing, doesn't fail if tree is not complete.
  */
 function testElm(aID, aTreeObj)
 {
@@ -579,17 +579,17 @@ function testAccessibleTree(aAccOrElmOrI
 }
 
 /**
  * Return true if accessible for the given node is in cache.
  */
 function isAccessibleInCache(aNodeOrId)
 {
   var node = getNode(aNodeOrId);
-  return gAccRetrieval.getAccessibleFromCache(node) ? true : false;
+  return gAccService.getAccessibleFromCache(node) ? true : false;
 }
 
 /**
  * Test accessible tree for defunct accessible.
  *
  * @param  aAcc       [in] the defunct accessible
  * @param  aNodeOrId  [in] the DOM node identifier for the defunct accessible
  */
@@ -666,50 +666,50 @@ function testDefunctAccessible(aAcc, aNo
   ok(success, "parent" + msg);
 }
 
 /**
  * Convert role to human readable string.
  */
 function roleToString(aRole)
 {
-  return gAccRetrieval.getStringRole(aRole);
+  return gAccService.getStringRole(aRole);
 }
 
 /**
  * Convert states to human readable string.
  */
 function statesToString(aStates, aExtraStates)
 {
-  var list = gAccRetrieval.getStringStates(aStates, aExtraStates);
+  var list = gAccService.getStringStates(aStates, aExtraStates);
 
   var str = "";
   for (var index = 0; index < list.length - 1; index++)
     str += list.item(index) + ", ";
 
   if (list.length != 0)
     str += list.item(index)
 
   return str;
 }
 
 /**
  * Convert event type to human readable string.
  */
 function eventTypeToString(aEventType)
 {
-  return gAccRetrieval.getStringEventType(aEventType);
+  return gAccService.getStringEventType(aEventType);
 }
 
 /**
  * Convert relation type to human readable string.
  */
 function relationTypeToString(aRelationType)
 {
-  return gAccRetrieval.getStringRelationType(aRelationType);
+  return gAccService.getStringRelationType(aRelationType);
 }
 
 function getLoadContext() {
   const Ci = Components.interfaces;
   return window.QueryInterface(Ci.nsIInterfaceRequestor)
                .getInterface(Ci.nsIWebNavigation)
                .QueryInterface(Ci.nsILoadContext);
 }
--- a/accessible/tests/mochitest/events/docload_wnd.html
+++ b/accessible/tests/mochitest/events/docload_wnd.html
@@ -1,38 +1,38 @@
 <html>
 <head>
   <title>Accessible events testing for document</title>
   <script>
     const STATE_BUSY = Components.interfaces.nsIAccessibleStates.STATE_BUSY;
 
-    var gRetrieval = null;
+    var gService = null;
     function waitForDocLoad()
     {
-      if (!gRetrieval) {
-        gRetrieval = Components.classes["@mozilla.org/accessibleRetrieval;1"].
-         getService(Components.interfaces.nsIAccessibleRetrieval);
+      if (!gService) {
+        gService = Components.classes["@mozilla.org/accessibilityService;1"].
+         getService(Components.interfaces.nsIAccessibilityService);
       }
 
-      var accDoc = gRetrieval.getAccessibleFor(document);
+      var accDoc = gService.getAccessibleFor(document);
 
       var state = {};
       accDoc.getState(state, {});
       if (state.value & STATE_BUSY) {
         window.setTimeout(waitForDocLoad, 0);
         return;
       }
 
       hideIFrame();
     }
 
     function hideIFrame()
     {
       var iframe = document.getElementById("iframe");
-      gRetrieval.getAccessibleFor(iframe.contentDocument);
+      gService.getAccessibleFor(iframe.contentDocument);
       iframe.style.display = 'none';
     }
   </script>
 </head>
 
 <body onload="waitForDocLoad();">
   <iframe id="iframe"></iframe>
 </body>
--- a/accessible/tests/mochitest/events/test_docload.html
+++ b/accessible/tests/mochitest/events/test_docload.html
@@ -18,25 +18,25 @@
 
   <script type="application/javascript">
     // Front end stuff sometimes likes to stuff things in the hidden window(s)
     // in which case there's accessibles for that content.
     Components.utils.import("resource://gre/modules/Services.jsm");
 
     // Force the creation of an accessible for the hidden window's document.
     var doc = Services.appShell.hiddenDOMWindow.document;
-    gAccRetrieval.getAccessibleFor(doc);
+    gAccService.getAccessibleFor(doc);
 
     // The private hidden window will be lazily created that's why we need to do
     // it here *before* loading '../events.js' or else we'll have a duplicate
     // reorder event.
     var privateDoc = Services.appShell.hiddenPrivateDOMWindow.document;
 
     // Force the creation of an accessible for the private hidden window's doc.
-    gAccRetrieval.getAccessibleFor(privateDoc);
+    gAccService.getAccessibleFor(privateDoc);
   </script>
 
   <script type="application/javascript"
           src="../events.js"></script>
 
   <script type="application/javascript">
     ////////////////////////////////////////////////////////////////////////////
     // Invokers
--- a/accessible/tests/mochitest/pivot.js
+++ b/accessible/tests/mochitest/pivot.js
@@ -514,17 +514,17 @@ function removeVCRootChecker(aPivot)
  * Create a pivot, remove its root, and perform an operation where the root is
  * needed.
  *
  * @param aRootNode [in] DOM node of which accessible will be the root of the
  *                       pivot. Should have more than one child.
  */
 function removeVCRootInvoker(aRootNode)
 {
-  this.pivot = gAccRetrieval.createAccessiblePivot(getAccessible(aRootNode));
+  this.pivot = gAccService.createAccessiblePivot(getAccessible(aRootNode));
   this.invoke = function removeVCRootInvoker_invoke()
   {
     this.pivot.position = this.pivot.root.firstChild;
     aRootNode.parentNode.removeChild(aRootNode);
   };
 
   this.getID = function removeVCRootInvoker_getID()
   {
--- a/accessible/tests/mochitest/states/z_frames_update.html
+++ b/accessible/tests/mochitest/states/z_frames_update.html
@@ -1,16 +1,16 @@
 <html>
 <head>
 <script>
 function replaceBody()
 {
-  var accRetrieval = Components.classes["@mozilla.org/accessibleRetrieval;1"].
-    getService(Components.interfaces.nsIAccessibleRetrieval);
-  accRetrieval.getAccessibleFor(document);
+  var accService = Components.classes["@mozilla.org/accessibilityService;1"].
+    getService(Components.interfaces.nsIAccessibilityService);
+  accService.getAccessibleFor(document);
 
   var newBody = document.createElement("body");
   newBody.setAttribute("contentEditable", "true");
   newBody.textContent = "New Hello";
   document.documentElement.replaceChild(newBody, document.body);
   getComputedStyle(newBody, "").color;
 }
 </script>
--- a/b2g/common.configure
+++ b/b2g/common.configure
@@ -20,10 +20,12 @@ set_config('MOZTTDIR', mozttdir)
 
 @depends('MOZTTDIR')
 def package_moztt(value):
     if value:
         return True
 
 set_define('PACKAGE_MOZTT', package_moztt)
 
+imply_option('MOZ_ENABLE_WARNINGS_AS_ERRORS',
+             depends(target)(lambda t: t.os == 'Android'), reason='--target')
 
 include('../toolkit/moz.configure')
--- a/b2g/config/mozconfigs/linux32_gecko/debug
+++ b/b2g/config/mozconfigs/linux32_gecko/debug
@@ -13,19 +13,16 @@ ac_add_options --enable-debug
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 
 #B2G options
 ac_add_options --enable-application=b2g
 ENABLE_MARIONETTE=1
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
--- a/b2g/config/mozconfigs/linux32_gecko/nightly
+++ b/b2g/config/mozconfigs/linux32_gecko/nightly
@@ -13,19 +13,16 @@ ac_add_options --enable-signmar
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 
 #B2G options
 ac_add_options --enable-application=b2g
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 GAIADIR=$topsrcdir/gaia
--- a/b2g/config/mozconfigs/linux64_gecko/nightly
+++ b/b2g/config/mozconfigs/linux64_gecko/nightly
@@ -13,19 +13,16 @@ ac_add_options --enable-signmar
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 
 #B2G options
 ac_add_options --enable-application=b2g
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 GAIADIR=$topsrcdir/gaia
--- a/b2g/config/mozconfigs/macosx64_gecko/debug
+++ b/b2g/config/mozconfigs/macosx64_gecko/debug
@@ -12,19 +12,16 @@ ac_add_options --enable-signmar
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
 #ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # B2G Stuff
 ac_add_options --enable-application=b2g
 ac_add_options --enable-debug-symbols
 ac_add_options --enable-debug
 ENABLE_MARIONETTE=1
 
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
--- a/b2g/config/mozconfigs/macosx64_gecko/nightly
+++ b/b2g/config/mozconfigs/macosx64_gecko/nightly
@@ -13,19 +13,16 @@ ac_add_options --enable-signmar
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
 #ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # B2G Stuff
 ac_add_options --enable-application=b2g
 ac_add_options --enable-debug-symbols
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 GAIADIR=$topsrcdir/gaia
 
 # Include Firefox OS fonts.
--- a/b2g/confvars.sh
+++ b/b2g/confvars.sh
@@ -47,17 +47,13 @@ MOZ_APP_ID={3c2e2abc-06d4-11e1-ac3b-374f
 
 MOZ_TIME_MANAGER=1
 
 MOZ_SIMPLEPUSH=1
 MOZ_PAY=1
 MOZ_TOOLKIT_SEARCH=
 MOZ_B2G=1
 
-if test "$OS_TARGET" = "Android"; then
-MOZ_ENABLE_WARNINGS_AS_ERRORS=1
-fi
-
 MOZ_JSDOWNLOADS=1
 
 MOZ_BUNDLED_FONTS=1
 
 export JS_GC_SMALL_CHUNK_SIZE=1
--- a/b2g/dev/config/mozconfigs/macosx64/mulet
+++ b/b2g/dev/config/mozconfigs/macosx64/mulet
@@ -12,19 +12,16 @@ ac_add_options --enable-profiling
 ac_add_options --enable-instruments
 ac_add_options --enable-dtrace
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 # Include Firefox OS fonts.
 MOZTTDIR=$topsrcdir/moz-tt
 
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/b2g/graphene/config/horizon-mozconfigs/linux32/debug
+++ b/b2g/graphene/config/horizon-mozconfigs/linux32/debug
@@ -9,19 +9,16 @@ ac_add_options --enable-debug
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 ENABLE_MARIONETTE=1
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
--- a/b2g/graphene/config/horizon-mozconfigs/linux32/nightly
+++ b/b2g/graphene/config/horizon-mozconfigs/linux32/nightly
@@ -10,19 +10,16 @@ ac_add_options --enable-signmar
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/horizon-mozconfigs/common.override"
--- a/b2g/graphene/config/horizon-mozconfigs/linux64/debug
+++ b/b2g/graphene/config/horizon-mozconfigs/linux64/debug
@@ -9,19 +9,16 @@ ac_add_options --enable-debug
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 ENABLE_MARIONETTE=1
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
--- a/b2g/graphene/config/horizon-mozconfigs/linux64/nightly
+++ b/b2g/graphene/config/horizon-mozconfigs/linux64/nightly
@@ -10,19 +10,16 @@ ac_add_options --enable-signmar
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/horizon-mozconfigs/common.override"
--- a/b2g/graphene/config/horizon-mozconfigs/macosx64/debug
+++ b/b2g/graphene/config/horizon-mozconfigs/macosx64/debug
@@ -8,19 +8,16 @@ no_sccache=
 # Nightlies only since this has a cost in performance
 ac_add_options --enable-js-diagnostics
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 #ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # graphene Stuff
 ac_add_options --enable-debug-symbols
 ac_add_options --enable-debug
 ENABLE_MARIONETTE=1
 
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/horizon-mozconfigs/common.override"
--- a/b2g/graphene/config/horizon-mozconfigs/macosx64/nightly
+++ b/b2g/graphene/config/horizon-mozconfigs/macosx64/nightly
@@ -11,16 +11,13 @@ ac_add_options --enable-signmar
 # Nightlies only since this has a cost in performance
 ac_add_options --enable-js-diagnostics
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 #ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # graphene Stuff
 ac_add_options --enable-debug-symbols
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/horizon-mozconfigs/common.override"
--- a/b2g/graphene/config/horizon-mozconfigs/win64/debug
+++ b/b2g/graphene/config/horizon-mozconfigs/win64/debug
@@ -15,19 +15,16 @@ if [ -f /c/builds/google-oauth-api.key ]
 else
   _google_oauth_api_keyfile=/e/builds/google-oauth-api.key
 fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 . $topsrcdir/build/win64/mozconfig.vs-latest
 
 . "$topsrcdir/build/mozconfig.cache"
 
 . "$topsrcdir/b2g/graphene/config/horizon-mozconfigs/common.override"
--- a/b2g/graphene/config/mozconfigs/linux32/debug
+++ b/b2g/graphene/config/mozconfigs/linux32/debug
@@ -9,19 +9,16 @@ ac_add_options --enable-debug
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 ENABLE_MARIONETTE=1
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
--- a/b2g/graphene/config/mozconfigs/linux32/nightly
+++ b/b2g/graphene/config/mozconfigs/linux32/nightly
@@ -10,19 +10,16 @@ ac_add_options --enable-signmar
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/mozconfigs/common.override"
--- a/b2g/graphene/config/mozconfigs/linux64/debug
+++ b/b2g/graphene/config/mozconfigs/linux64/debug
@@ -9,19 +9,16 @@ ac_add_options --enable-debug
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 ENABLE_MARIONETTE=1
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
--- a/b2g/graphene/config/mozconfigs/linux64/nightly
+++ b/b2g/graphene/config/mozconfigs/linux64/nightly
@@ -10,19 +10,16 @@ ac_add_options --enable-signmar
 # This will overwrite the default of stripping everything and keep the symbol table.
 # This is useful for profiling and debugging and only increases the package size
 # by 2 MBs.
 STRIP_FLAGS="--strip-debug"
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Use sccache
 no_sccache=
 . "$topsrcdir/build/mozconfig.cache"
 
 # graphene options
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/mozconfigs/common.override"
--- a/b2g/graphene/config/mozconfigs/macosx64/debug
+++ b/b2g/graphene/config/mozconfigs/macosx64/debug
@@ -8,19 +8,16 @@ no_sccache=
 # Nightlies only since this has a cost in performance
 ac_add_options --enable-js-diagnostics
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 #ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # graphene Stuff
 ac_add_options --enable-debug-symbols
 ac_add_options --enable-debug
 ENABLE_MARIONETTE=1
 
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/mozconfigs/common.override"
--- a/b2g/graphene/config/mozconfigs/macosx64/nightly
+++ b/b2g/graphene/config/mozconfigs/macosx64/nightly
@@ -11,16 +11,13 @@ ac_add_options --enable-signmar
 # Nightlies only since this has a cost in performance
 ac_add_options --enable-js-diagnostics
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 #ac_add_options --with-macbundlename-prefix=Firefox
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # graphene Stuff
 ac_add_options --enable-debug-symbols
 export CXXFLAGS=-DMOZ_ENABLE_JS_DUMP
 
 . "$topsrcdir/b2g/graphene/config/mozconfigs/common.override"
--- a/b2g/graphene/config/mozconfigs/win64/debug
+++ b/b2g/graphene/config/mozconfigs/win64/debug
@@ -15,19 +15,16 @@ if [ -f /c/builds/google-oauth-api.key ]
 else
   _google_oauth_api_keyfile=/e/builds/google-oauth-api.key
 fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-# Treat warnings as errors in directories with FAIL_ON_WARNINGS.
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 . $topsrcdir/build/win64/mozconfig.vs-latest
 
 . "$topsrcdir/build/mozconfig.cache"
 
 . "$topsrcdir/b2g/graphene/config/mozconfigs/common.override"
--- a/b2g/graphene/confvars.sh
+++ b/b2g/graphene/confvars.sh
@@ -42,20 +42,16 @@ fi
 MOZ_APP_ID={d1bfe7d9-c01e-4237-998b-7b5f960a4314}
 MOZ_TIME_MANAGER=1
 
 MOZ_PAY=1
 MOZ_TOOLKIT_SEARCH=
 MOZ_PLACES=
 MOZ_B2G=1
 
-if test "$OS_TARGET" = "Android"; then
-MOZ_ENABLE_WARNINGS_AS_ERRORS=1
-fi
-
 MOZ_JSDOWNLOADS=1
 
 MOZ_BUNDLED_FONTS=1
 
 export JS_GC_SMALL_CHUNK_SIZE=1
 
 # Include the DevTools client, not just the server (which is the default)
 MOZ_DEVTOOLS=all
--- a/browser/app/permissions
+++ b/browser/app/permissions
@@ -11,12 +11,13 @@ origin	uitour	1	https://www.mozilla.org
 origin	uitour	1	https://self-repair.mozilla.org
 origin	uitour	1	https://support.mozilla.org
 origin	uitour	1	https://addons.mozilla.org
 origin	uitour	1	https://discovery.addons.mozilla.org
 origin	uitour	1	about:home
 
 # XPInstall
 origin	install	1	https://addons.mozilla.org
+origin	install	1	https://testpilot.firefox.com
 
 # Remote troubleshooting
 origin	remote-troubleshooting	1	https://input.mozilla.org
 origin	remote-troubleshooting	1	https://support.mozilla.org
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -5,71 +5,152 @@
 
 var Ci = Components.interfaces;
 var Cu = Components.utils;
 var Cc = Components.classes;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/ContextualIdentityService.jsm");
 Cu.import("resource://gre/modules/NotificationDB.jsm");
-Cu.import("resource:///modules/RecentWindow.jsm");
-
-
-XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
-                                  "resource://gre/modules/Preferences.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Deprecated",
-                                  "resource://gre/modules/Deprecated.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "BrowserUITelemetry",
-                                  "resource:///modules/BrowserUITelemetry.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "E10SUtils",
-                                  "resource:///modules/E10SUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils",
-                                  "resource://gre/modules/BrowserUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils",
-                                  "resource://gre/modules/PromiseUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "CharsetMenu",
-                                  "resource://gre/modules/CharsetMenu.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "ShortcutUtils",
-                                  "resource://gre/modules/ShortcutUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "GMPInstallManager",
-                                  "resource://gre/modules/GMPInstallManager.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
-                                  "resource://gre/modules/NewTabUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "ContentSearch",
-                                  "resource:///modules/ContentSearch.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "AboutHome",
-                                  "resource:///modules/AboutHome.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Log",
-                                  "resource://gre/modules/Log.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
-                                  "resource://gre/modules/AppConstants.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "UpdateUtils",
-                                  "resource://gre/modules/UpdateUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Color",
-                                  "resource://gre/modules/Color.jsm");
-XPCOMUtils.defineLazyServiceGetter(this, "Favicons",
-                                   "@mozilla.org/browser/favicon-service;1",
-                                   "mozIAsyncFavicons");
-XPCOMUtils.defineLazyServiceGetter(this, "gDNSService",
-                                   "@mozilla.org/network/dns-service;1",
-                                   "nsIDNSService");
-XPCOMUtils.defineLazyServiceGetter(this, "WindowsUIUtils",
-                                   "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils");
-XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
-                                  "resource://gre/modules/LightweightThemeManager.jsm");
-XPCOMUtils.defineLazyServiceGetter(this, "gAboutNewTabService",
-                                   "@mozilla.org/browser/aboutnewtab-service;1",
-                                   "nsIAboutNewTabService");
+
+// lazy module getters
+[
+  ["AboutHome", "resource:///modules/AboutHome.jsm"],
+  ["AddonWatcher", "resource://gre/modules/AddonWatcher.jsm"],
+  ["AppConstants", "resource://gre/modules/AppConstants.jsm"],
+  ["BrowserUITelemetry", "resource:///modules/BrowserUITelemetry.jsm"],
+  ["BrowserUtils", "resource://gre/modules/BrowserUtils.jsm"],
+  ["CastingApps", "resource:///modules/CastingApps.jsm"],
+  ["CharsetMenu", "resource://gre/modules/CharsetMenu.jsm"],
+  ["Color", "resource://gre/modules/Color.jsm"],
+  ["ContentSearch", "resource:///modules/ContentSearch.jsm"],
+  ["Deprecated", "resource://gre/modules/Deprecated.jsm"],
+  ["E10SUtils", "resource:///modules/E10SUtils.jsm"],
+  ["FormValidationHandler", "resource:///modules/FormValidationHandler.jsm"],
+  ["GMPInstallManager", "resource://gre/modules/GMPInstallManager.jsm"],
+  ["LightweightThemeManager", "resource://gre/modules/LightweightThemeManager.jsm"],
+  ["Log", "resource://gre/modules/Log.jsm"],
+  ["LoginManagerParent", "resource://gre/modules/LoginManagerParent.jsm"],
+  ["NewTabUtils", "resource://gre/modules/NewTabUtils.jsm"],
+  ["PageThumbs", "resource://gre/modules/PageThumbs.jsm"],
+  ["PluralForm", "resource://gre/modules/PluralForm.jsm"],
+  ["Preferences", "resource://gre/modules/Preferences.jsm"],
+  ["PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"],
+  ["ProcessHangMonitor", "resource:///modules/ProcessHangMonitor.jsm"],
+  ["PromiseUtils", "resource://gre/modules/PromiseUtils.jsm"],
+  ["ReaderMode", "resource://gre/modules/ReaderMode.jsm"],
+  ["ReaderParent", "resource:///modules/ReaderParent.jsm"],
+  ["RecentWindow", "resource:///modules/RecentWindow.jsm"],
+  ["SessionStore", "resource:///modules/sessionstore/SessionStore.jsm"],
+  ["ShortcutUtils", "resource://gre/modules/ShortcutUtils.jsm"],
+  ["SimpleServiceDiscovery", "resource://gre/modules/SimpleServiceDiscovery.jsm"],
+  ["SitePermissions", "resource:///modules/SitePermissions.jsm"],
+  ["Social", "resource:///modules/Social.jsm"],
+  ["TabCrashHandler", "resource:///modules/ContentCrashHandlers.jsm"],
+  ["Task", "resource://gre/modules/Task.jsm"],
+  ["TelemetryStopwatch", "resource://gre/modules/TelemetryStopwatch.jsm"],
+  ["Translation", "resource:///modules/translation/Translation.jsm"],
+  ["UITour", "resource:///modules/UITour.jsm"],
+  ["UpdateUtils", "resource://gre/modules/UpdateUtils.jsm"],
+  ["Weave", "resource://services-sync/main.js"],
+  ["fxAccounts", "resource://gre/modules/FxAccounts.jsm"],
+  ["gDevTools", "resource://devtools/client/framework/gDevTools.jsm"],
+  ["gDevToolsBrowser", "resource://devtools/client/framework/gDevTools.jsm"],
+  ["webrtcUI", "resource:///modules/webrtcUI.jsm",],
+].forEach(([name, resource]) => XPCOMUtils.defineLazyModuleGetter(this, name, resource));
+
+if (AppConstants.MOZ_SAFE_BROWSING) {
+  XPCOMUtils.defineLazyModuleGetter(this, "SafeBrowsing",
+    "resource://gre/modules/SafeBrowsing.jsm");
+}
+
+if (AppConstants.MOZ_CRASHREPORTER) {
+  XPCOMUtils.defineLazyModuleGetter(this, "PluginCrashReporter",
+    "resource:///modules/ContentCrashHandlers.jsm");
+}
+
+// lazy service getters
+[
+  ["Favicons", "@mozilla.org/browser/favicon-service;1", "mozIAsyncFavicons"],
+  ["WindowsUIUtils", "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils"],
+  ["gAboutNewTabService", "@mozilla.org/browser/aboutnewtab-service;1", "nsIAboutNewTabService"],
+  ["gDNSService", "@mozilla.org/network/dns-service;1", "nsIDNSService"],
+].forEach(([name, cc, ci]) => XPCOMUtils.defineLazyServiceGetter(this, name, cc, ci));
+
+if (AppConstants.MOZ_CRASHREPORTER) {
+  XPCOMUtils.defineLazyServiceGetter(this, "gCrashReporter",
+                                     "@mozilla.org/xre/app-info;1",
+                                     "nsICrashReporter");
+}
+
+
+XPCOMUtils.defineLazyGetter(this, "BrowserToolboxProcess", function() {
+  let tmp = {};
+  Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", tmp);
+  return tmp.BrowserToolboxProcess;
+});
+
 XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() {
   return Services.strings.createBundle('chrome://browser/locale/browser.properties');
 });
-XPCOMUtils.defineLazyModuleGetter(this, "AddonWatcher",
-                                  "resource://gre/modules/AddonWatcher.jsm");
+
+XPCOMUtils.defineLazyGetter(this, "gCustomizeMode", function() {
+  let scope = {};
+  Cu.import("resource:///modules/CustomizeMode.jsm", scope);
+  return new scope.CustomizeMode(window);
+});
+
+XPCOMUtils.defineLazyGetter(window, "gShowPageResizers", function () {
+  // Only show resizers on Windows 2000 and XP
+  return AppConstants.isPlatformAndVersionAtMost("win", "5.9");
+});
+
+XPCOMUtils.defineLazyGetter(this, "gPrefService", function() {
+  return Services.prefs;
+});
+
+XPCOMUtils.defineLazyGetter(this, "PageMenuParent", function() {
+  let tmp = {};
+  Cu.import("resource://gre/modules/PageMenu.jsm", tmp);
+  return new tmp.PageMenuParent();
+});
+
+XPCOMUtils.defineLazyGetter(this, "PopupNotifications", function () {
+  let tmp = {};
+  Cu.import("resource://gre/modules/PopupNotifications.jsm", tmp);
+  try {
+    return new tmp.PopupNotifications(gBrowser,
+                                      document.getElementById("notification-popup"),
+                                      document.getElementById("notification-popup-box"));
+  } catch (ex) {
+    Cu.reportError(ex);
+    return null;
+  }
+});
+
+XPCOMUtils.defineLazyGetter(this, "Win7Features", function () {
+  if (AppConstants.platform != "win")
+    return null;
+
+  const WINTASKBAR_CONTRACTID = "@mozilla.org/windows-taskbar;1";
+  if (WINTASKBAR_CONTRACTID in Cc &&
+      Cc[WINTASKBAR_CONTRACTID].getService(Ci.nsIWinTaskbar).available) {
+    let AeroPeek = Cu.import("resource:///modules/WindowsPreviewPerTab.jsm", {}).AeroPeek;
+    return {
+      onOpenWindow: function () {
+        AeroPeek.onOpenWindow(window);
+      },
+      onCloseWindow: function () {
+        AeroPeek.onCloseWindow(window);
+      }
+    };
+  }
+  return null;
+});
+
 
 const nsIWebNavigation = Ci.nsIWebNavigation;
 
 var gLastBrowserCharset = null;
 var gLastValidURLStr = "";
 var gInPrintPreviewMode = false;
 var gContextMenu = null; // nsContextMenu instance
 var gMultiProcessBrowser =
@@ -112,166 +193,36 @@ if (AppConstants.platform != "macosx") {
 this.__defineGetter__("gFindBar", function() {
   return window.gBrowser.getFindBar();
 });
 
 this.__defineGetter__("gFindBarInitialized", function() {
   return window.gBrowser.isFindBarInitialized();
 });
 
-XPCOMUtils.defineLazyGetter(this, "gPrefService", function() {
-  return Services.prefs;
-});
-
 this.__defineGetter__("AddonManager", function() {
   let tmp = {};
   Cu.import("resource://gre/modules/AddonManager.jsm", tmp);
   return this.AddonManager = tmp.AddonManager;
 });
 this.__defineSetter__("AddonManager", function (val) {
   delete this.AddonManager;
   return this.AddonManager = val;
 });
 
-XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
-  "resource://gre/modules/PluralForm.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
-  "resource://gre/modules/TelemetryStopwatch.jsm");
-
-XPCOMUtils.defineLazyGetter(this, "gCustomizeMode", function() {
-  let scope = {};
-  Cu.import("resource:///modules/CustomizeMode.jsm", scope);
-  return new scope.CustomizeMode(window);
-});
-
-XPCOMUtils.defineLazyModuleGetter(this, "Weave",
-  "resource://services-sync/main.js");
-
-XPCOMUtils.defineLazyGetter(this, "PopupNotifications", function () {
-  let tmp = {};
-  Cu.import("resource://gre/modules/PopupNotifications.jsm", tmp);
-  try {
-    return new tmp.PopupNotifications(gBrowser,
-                                      document.getElementById("notification-popup"),
-                                      document.getElementById("notification-popup-box"));
-  } catch (ex) {
-    Cu.reportError(ex);
-    return null;
-  }
-});
-
-XPCOMUtils.defineLazyGetter(this, "BrowserToolboxProcess", function() {
-  let tmp = {};
-  Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", tmp);
-  return tmp.BrowserToolboxProcess;
-});
-
-XPCOMUtils.defineLazyModuleGetter(this, "Social",
-  "resource:///modules/Social.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PageThumbs",
-  "resource://gre/modules/PageThumbs.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ProcessHangMonitor",
-  "resource:///modules/ProcessHangMonitor.jsm");
-
-if (AppConstants.MOZ_SAFE_BROWSING) {
-  XPCOMUtils.defineLazyModuleGetter(this, "SafeBrowsing",
-    "resource://gre/modules/SafeBrowsing.jsm");
-}
-
-XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
-  "resource://gre/modules/PrivateBrowsingUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Translation",
-  "resource:///modules/translation/Translation.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SitePermissions",
-  "resource:///modules/SitePermissions.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
-  "resource:///modules/sessionstore/SessionStore.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts",
-  "resource://gre/modules/FxAccounts.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "gWebRTCUI",
-  "resource:///modules/webrtcUI.jsm", "webrtcUI");
-
-XPCOMUtils.defineLazyModuleGetter(this, "TabCrashHandler",
-  "resource:///modules/ContentCrashHandlers.jsm");
-
-if (AppConstants.MOZ_CRASHREPORTER) {
-  XPCOMUtils.defineLazyModuleGetter(this, "PluginCrashReporter",
-    "resource:///modules/ContentCrashHandlers.jsm");
-}
-
-XPCOMUtils.defineLazyModuleGetter(this, "FormValidationHandler",
-  "resource:///modules/FormValidationHandler.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "UITour",
-  "resource:///modules/UITour.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "CastingApps",
-  "resource:///modules/CastingApps.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SimpleServiceDiscovery",
-  "resource://gre/modules/SimpleServiceDiscovery.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
-  "resource://gre/modules/ReaderMode.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ReaderParent",
-  "resource:///modules/ReaderParent.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerParent",
-  "resource://gre/modules/LoginManagerParent.jsm");
 
 var gInitialPages = [
   "about:blank",
   "about:newtab",
   "about:home",
   "about:privatebrowsing",
   "about:welcomeback",
   "about:sessionrestore"
 ];
 
-XPCOMUtils.defineLazyGetter(this, "Win7Features", function () {
-  if (AppConstants.platform != "win")
-    return null;
-
-  const WINTASKBAR_CONTRACTID = "@mozilla.org/windows-taskbar;1";
-  if (WINTASKBAR_CONTRACTID in Cc &&
-      Cc[WINTASKBAR_CONTRACTID].getService(Ci.nsIWinTaskbar).available) {
-    let AeroPeek = Cu.import("resource:///modules/WindowsPreviewPerTab.jsm", {}).AeroPeek;
-    return {
-      onOpenWindow: function () {
-        AeroPeek.onOpenWindow(window);
-      },
-      onCloseWindow: function () {
-        AeroPeek.onCloseWindow(window);
-      }
-    };
-  }
-  return null;
-});
-
-if (AppConstants.MOZ_CRASHREPORTER) {
-  XPCOMUtils.defineLazyServiceGetter(this, "gCrashReporter",
-                                     "@mozilla.org/xre/app-info;1",
-                                     "nsICrashReporter");
-}
-
-XPCOMUtils.defineLazyGetter(this, "PageMenuParent", function() {
-  let tmp = {};
-  Cu.import("resource://gre/modules/PageMenu.jsm", tmp);
-  return new tmp.PageMenuParent();
-});
-
 function* browserWindows() {
   let windows = Services.wm.getEnumerator("navigator:browser");
   while (windows.hasMoreElements())
     yield windows.getNext();
 }
 
 /**
 * We can avoid adding multiple load event listeners and save some time by adding
@@ -7662,22 +7613,16 @@ var TabContextMenu = {
         let tab = aEvent.target;
         this._updateToggleMuteMenuItem(tab,
           attr => aEvent.detail.changed.indexOf(attr) >= 0);
         break;
     }
   }
 };
 
-XPCOMUtils.defineLazyModuleGetter(this, "gDevTools",
-                                  "resource://devtools/client/framework/gDevTools.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "gDevToolsBrowser",
-                                  "resource://devtools/client/framework/gDevTools.jsm");
-
 Object.defineProperty(this, "HUDService", {
   get: function HUDService_getter() {
     let devtools = Cu.import("resource://devtools/shared/Loader.jsm", {}).devtools;
     return devtools.require("devtools/client/webconsole/hudservice");
   },
   configurable: true,
   enumerable: true
 });
@@ -7758,21 +7703,16 @@ var ResponsiveUI = {
 };
 
 XPCOMUtils.defineLazyGetter(ResponsiveUI, "ResponsiveUIManager", function() {
   let tmp = {};
   Cu.import("resource://devtools/client/responsivedesign/responsivedesign.jsm", tmp);
   return tmp.ResponsiveUIManager;
 });
 
-XPCOMUtils.defineLazyGetter(window, "gShowPageResizers", function () {
-  // Only show resizers on Windows 2000 and XP
-  return AppConstants.isPlatformAndVersionAtMost("win", "5.9");
-});
-
 var MousePosTracker = {
   _listeners: new Set(),
   _x: 0,
   _y: 0,
   get _windowUtils() {
     delete this._windowUtils;
     return this._windowUtils = window.getInterface(Ci.nsIDOMWindowUtils);
   },
--- a/browser/base/content/popup-notifications.inc
+++ b/browser/base/content/popup-notifications.inc
@@ -17,17 +17,17 @@
           <menupopup id="webRTC-selectCamera-menupopup"/>
         </menulist>
       </popupnotificationcontent>
 
       <popupnotificationcontent id="webRTC-selectWindowOrScreen" orient="vertical">
         <label id="webRTC-selectWindow-label"
                control="webRTC-selectWindow-menulist"/>
         <menulist id="webRTC-selectWindow-menulist"
-                  oncommand="gWebRTCUI.updateMainActionLabel(this);">
+                  oncommand="webrtcUI.updateMainActionLabel(this);">
           <menupopup id="webRTC-selectWindow-menupopup"/>
         </menulist>
         <description id="webRTC-all-windows-shared" hidden="true">&getUserMedia.allWindowsShared.message;</description>
       </popupnotificationcontent>
 
       <popupnotificationcontent id="webRTC-selectMicrophone" orient="vertical">
         <label value="&getUserMedia.selectMicrophone.label;"
                accesskey="&getUserMedia.selectMicrophone.accesskey;"
--- a/browser/base/content/test/webrtc/browser_devices_get_user_media.js
+++ b/browser/base/content/test/webrtc/browser_devices_get_user_media.js
@@ -487,18 +487,18 @@ var gTests = [
     yield expectObserverCalled("recording-device-events");
     is((yield getMediaCaptureState()), "Camera", "expected camera to be shared");
 
     yield indicator;
     yield checkSharingUI({video: true});
 
     yield promisePopupNotificationShown("webRTC-sharingDevices", () => {
       if ("nsISystemStatusBar" in Ci) {
-        let activeStreams = gWebRTCUI.getActiveStreams(true, false, false);
-        gWebRTCUI.showSharingDoorhanger(activeStreams[0], "Devices");
+        let activeStreams = webrtcUI.getActiveStreams(true, false, false);
+        webrtcUI.showSharingDoorhanger(activeStreams[0], "Devices");
       }
       else {
         let win =
           Services.wm.getMostRecentWindow("Browser:WebRTCGlobalIndicator");
         let elt = win.document.getElementById("audioVideoButton");
         EventUtils.synthesizeMouseAtCenter(elt, {}, win);
       }
     });
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -8,29 +8,27 @@
 #include "AboutRedirector.h"
 #include "nsNetUtil.h"
 #include "nsIAboutNewTabService.h"
 #include "nsIChannel.h"
 #include "nsIURI.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIProtocolHandler.h"
 #include "mozilla/ArrayUtils.h"
-#include "nsDOMString.h"
 #include "nsServiceManagerUtils.h"
 
 namespace mozilla {
 namespace browser {
 
 NS_IMPL_ISUPPORTS(AboutRedirector, nsIAboutModule)
 
 struct RedirEntry {
   const char* id;
   const char* url;
   uint32_t flags;
-  const char* idbOriginPostfix;
 };
 
 /*
   Entries which do not have URI_SAFE_FOR_UNTRUSTED_CONTENT will run with chrome
   privileges. This is potentially dangerous. Please use
   URI_SAFE_FOR_UNTRUSTED_CONTENT in the third argument to each map item below
   unless your about: page really needs chrome privileges. Security review is
   required before adding new map entries without
@@ -219,39 +217,16 @@ AboutRedirector::GetURIFlags(nsIURI *aUR
       *result = kRedirMap[i].flags;
       return NS_OK;
     }
   }
 
   return NS_ERROR_ILLEGAL_VALUE;
 }
 
-NS_IMETHODIMP
-AboutRedirector::GetIndexedDBOriginPostfix(nsIURI *aURI, nsAString &result)
-{
-  NS_ENSURE_ARG_POINTER(aURI);
-
-  nsAutoCString name = GetAboutModuleName(aURI);
-
-  for (int i = 0; i < kRedirTotal; i++) {
-    if (name.Equals(kRedirMap[i].id)) {
-      const char* postfix = kRedirMap[i].idbOriginPostfix;
-      if (!postfix) {
-        break;
-      }
-
-      result.AssignASCII(postfix);
-      return NS_OK;
-    }
-  }
-
-  SetDOMStringToNull(result);
-  return NS_ERROR_ILLEGAL_VALUE;
-}
-
 nsresult
 AboutRedirector::Create(nsISupports *aOuter, REFNSIID aIID, void **result)
 {
   AboutRedirector* about = new AboutRedirector();
   if (about == nullptr)
     return NS_ERROR_OUT_OF_MEMORY;
   NS_ADDREF(about);
   nsresult rv = about->QueryInterface(aIID, result);
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -132,17 +132,17 @@
               <vbox class="PanelUI-remotetabs-instruction-box">
                 <hbox pack="center">
                   <image class="fxaSyncIllustration" alt=""/>
                 </hbox>
                 <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.tabsnotsyncing.label;</label>
                 <hbox pack="center">
                   <toolbarbutton class="PanelUI-remotetabs-prefs-button"
                                  label="&appMenuRemoteTabs.openprefs.label;"
-                                 oncommand="gSyncUI.openSetup();"/>
+                                 oncommand="gSyncUI.openSetup(null, 'synced-tabs');"/>
                 </hbox>
               </vbox>
             </hbox>
             <!-- Sync is ready to Sync but we are still fetching the tabs to show -->
             <vbox id="PanelUI-remotetabs-fetching">
               <!-- Show intentionally blank panel, see bug 1239845 -->
             </vbox>
             <!-- Sync has only 1 (ie, this) device connected -->
@@ -166,31 +166,31 @@
                 flex="1"
                 align="center"
                 class="PanelUI-remotetabs-instruction-box"
                 observes="sync-setup-state">
             <image class="fxaSyncIllustration" alt=""/>
             <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
             <toolbarbutton class="PanelUI-remotetabs-prefs-button"
                            label="&appMenuRemoteTabs.signin.label;"
-                           oncommand="gSyncUI.openSetup();"/>
+                           oncommand="gSyncUI.openSetup(null, 'synced-tabs');"/>
           </vbox>
           <!-- When Sync needs re-authentication. This uses the exact same messaging
                as "Sync is not configured" but remains a separate box so we get
                the goodness of observing broadcasters to manage the hidden states -->
           <vbox id="PanelUI-remotetabs-reauthsync"
                 flex="1"
                 align="center"
                 class="PanelUI-remotetabs-instruction-box"
                 observes="sync-reauth-state">
             <image class="fxaSyncIllustration" alt=""/>
             <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
             <toolbarbutton class="PanelUI-remotetabs-prefs-button"
                            label="&appMenuRemoteTabs.signin.label;"
-                           oncommand="gSyncUI.openSetup();"/>
+                           oncommand="gSyncUI.openSetup(null, 'synced-tabs');"/>
           </vbox>
         </hbox>
       </vbox>
     </panelview>
 
     <panelview id="PanelUI-bookmarks" flex="1" class="PanelUI-subView">
       <label value="&bookmarksMenu.label;" class="panel-subview-header"/>
       <vbox class="panel-subview-body">
--- a/browser/components/customizableui/test/browser_967000_button_sync.js
+++ b/browser/components/customizableui/test/browser_967000_button_sync.js
@@ -112,29 +112,29 @@ function* asyncCleanup() {
 
   // restore the tabs
   gBrowser.addTab(initialLocation);
   gBrowser.removeTab(newTab);
   UITour.tourBrowsersByWindow.delete(window);
 }
 
 // When Sync is not setup.
-add_task(() => openPrefsFromMenuPanel("PanelUI-remotetabs-setupsync", "syncbutton"));
+add_task(() => openPrefsFromMenuPanel("PanelUI-remotetabs-setupsync", "synced-tabs"));
 add_task(asyncCleanup);
 // Test that uitour is in progress, the entrypoint is `uitour` and not `menupanel`
 add_task(() => openPrefsFromMenuPanel("PanelUI-remotetabs-setupsync", "uitour"));
 add_task(asyncCleanup);
 
 // When Sync is configured in a "needs reauthentication" state.
 add_task(function* () {
   // configure our broadcasters so we are in the right state.
   document.getElementById("sync-reauth-state").hidden = false;
   document.getElementById("sync-setup-state").hidden = true;
   document.getElementById("sync-syncnow-state").hidden = true;
-  yield openPrefsFromMenuPanel("PanelUI-remotetabs-reauthsync", "syncbutton")
+  yield openPrefsFromMenuPanel("PanelUI-remotetabs-reauthsync", "synced-tabs")
 });
 
 // Test the mobile promo links
 add_task(function* () {
   // change the preferences for the mobile links.
   Services.prefs.setCharPref("identity.mobilepromo.android", "http://example.com/?os=android&tail=");
   Services.prefs.setCharPref("identity.mobilepromo.ios", "http://example.com/?os=ios&tail=");
 
--- a/browser/components/extensions/ext-utils.js
+++ b/browser/components/extensions/ext-utils.js
@@ -1,17 +1,23 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
                                   "resource:///modules/CustomizableUI.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
+                                  "resource://gre/modules/NetUtil.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
                                   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 
+XPCOMUtils.defineLazyServiceGetter(this, "styleSheetService",
+                                   "@mozilla.org/content/style-sheet-service;1",
+                                   "nsIStyleSheetService");
+
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 
 // Minimum time between two resizes.
 const RESIZE_TIMEOUT = 100;
 
@@ -37,35 +43,49 @@ function promisePopupShown(popup) {
       popup.addEventListener("popupshown", function onPopupShown(event) {
         popup.removeEventListener("popupshown", onPopupShown);
         resolve();
       });
     }
   });
 }
 
-XPCOMUtils.defineLazyGetter(global, "stylesheets", () => {
-  let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"]
-      .getService(Components.interfaces.nsIStyleSheetService);
-  let styleSheetURI = Services.io.newURI("chrome://browser/content/extension.css",
-                                         null, null);
+XPCOMUtils.defineLazyGetter(this, "stylesheets", () => {
+  let styleSheetURI = NetUtil.newURI("chrome://browser/content/extension.css");
   let styleSheet = styleSheetService.preloadSheet(styleSheetURI,
                                                   styleSheetService.AGENT_SHEET);
   let stylesheets = [styleSheet];
 
   if (AppConstants.platform === "macosx") {
-    styleSheetURI = Services.io.newURI("chrome://browser/content/extension-mac.css",
-                                       null, null);
+    styleSheetURI = NetUtil.newURI("chrome://browser/content/extension-mac.css");
     let macStyleSheet = styleSheetService.preloadSheet(styleSheetURI,
                                                        styleSheetService.AGENT_SHEET);
     stylesheets.push(macStyleSheet);
   }
   return stylesheets;
 });
 
+XPCOMUtils.defineLazyGetter(this, "standaloneStylesheets", () => {
+  let stylesheets = [];
+
+  if (AppConstants.platform === "macosx") {
+    let styleSheetURI = NetUtil.newURI("chrome://browser/content/extension-mac-panel.css");
+    let macStyleSheet = styleSheetService.preloadSheet(styleSheetURI,
+                                                       styleSheetService.AGENT_SHEET);
+    stylesheets.push(macStyleSheet);
+  }
+  if (AppConstants.platform === "win") {
+    let styleSheetURI = NetUtil.newURI("chrome://browser/content/extension-win-panel.css");
+    let winStyleSheet = styleSheetService.preloadSheet(styleSheetURI,
+                                                       styleSheetService.AGENT_SHEET);
+    stylesheets.push(winStyleSheet);
+  }
+  return stylesheets;
+});
+
 class BasePopup {
   constructor(extension, viewNode, popupURL, browserStyle) {
     let popupURI = Services.io.newURI(popupURL, null, extension.baseURI);
 
     Services.scriptSecurityManager.checkLoadURIWithPrincipal(
       extension.principal, popupURI,
       Services.scriptSecurityManager.DISALLOW_SCRIPT);
 
@@ -118,21 +138,30 @@ class BasePopup {
 
   handleEvent(event) {
     switch (event.type) {
       case this.DESTROY_EVENT:
         this.destroy();
         break;
 
       case "DOMWindowCreated":
-        if (this.browserStyle && event.target === this.browser.contentDocument) {
+        if (event.target === this.browser.contentDocument) {
           let winUtils = this.browser.contentWindow
-              .QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
-          for (let stylesheet of global.stylesheets) {
-            winUtils.addSheet(stylesheet, winUtils.AGENT_SHEET);
+                             .QueryInterface(Ci.nsIInterfaceRequestor)
+                             .getInterface(Ci.nsIDOMWindowUtils);
+
+          if (this.browserStyle) {
+            for (let stylesheet of stylesheets) {
+              winUtils.addSheet(stylesheet, winUtils.AGENT_SHEET);
+            }
+          }
+          if (!this.fixedWidth) {
+            for (let stylesheet of standaloneStylesheets) {
+              winUtils.addSheet(stylesheet, winUtils.AGENT_SHEET);
+            }
           }
         }
         break;
 
       case "DOMWindowClose":
         if (event.target === this.browser.contentWindow) {
           event.preventDefault();
           this.closePopup();
@@ -169,16 +198,18 @@ class BasePopup {
     }
   }
 
   createBrowser(viewNode, popupURI) {
     let document = viewNode.ownerDocument;
     this.browser = document.createElementNS(XUL_NS, "browser");
     this.browser.setAttribute("type", "content");
     this.browser.setAttribute("disableglobalhistory", "true");
+    this.browser.setAttribute("transparent", "true");
+    this.browser.setAttribute("class", "webextension-popup-browser");
     this.browser.setAttribute("webextension-view-type", "popup");
 
     // We only need flex sizing for the sake of the slide-in sub-views of the
     // main menu panel, so that the browser occupies the full width of the view,
     // and also takes up any extra height that's available to it.
     this.browser.setAttribute("flex", "1");
 
     // Note: When using noautohide panels, the popup manager will add width and
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/extension-mac-panel.css
@@ -0,0 +1,3 @@
+body {
+  border-radius: 3.5px;
+}
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/extension-win-panel.css
@@ -0,0 +1,7 @@
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
+  body {
+    border-radius: 4px;
+  }
+}
--- a/browser/components/extensions/extension.css
+++ b/browser/components/extensions/extension.css
@@ -6,17 +6,17 @@ select,
 option,
 input {
   -moz-appearance: none;
 }
 
 /* Variables */
 html,
 body {
-  background-color: #fcfcfc;
+  background: transparent;
   box-sizing: border-box;
   color: #222426;
   cursor: default;
   display: flex;
   flex-direction: column;
   font: caption;
   margin: 0;
   padding: 0;
--- a/browser/components/extensions/jar.mn
+++ b/browser/components/extensions/jar.mn
@@ -1,15 +1,21 @@
 # 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/.
 
 browser.jar:
     content/browser/extension.css
+#ifdef XP_MACOSX
     content/browser/extension-mac.css
+    content/browser/extension-mac-panel.css
+#endif
+#ifdef XP_WIN
+    content/browser/extension-win-panel.css
+#endif
     content/browser/extension.svg
     content/browser/ext-bookmarks.js
     content/browser/ext-browserAction.js
     content/browser/ext-commands.js
     content/browser/ext-contextMenus.js
     content/browser/ext-desktop-runtime.js
     content/browser/ext-history.js
     content/browser/ext-pageAction.js
--- a/browser/components/extensions/test/browser/browser.ini
+++ b/browser/components/extensions/test/browser/browser.ini
@@ -38,16 +38,17 @@ support-files =
 [browser_ext_incognito_popup.js]
 [browser_ext_lastError.js]
 [browser_ext_optionsPage_privileges.js]
 [browser_ext_pageAction_context.js]
 [browser_ext_pageAction_popup.js]
 [browser_ext_pageAction_popup_resize.js]
 [browser_ext_pageAction_simple.js]
 [browser_ext_popup_api_injection.js]
+[browser_ext_popup_corners.js]
 [browser_ext_runtime_openOptionsPage.js]
 [browser_ext_runtime_openOptionsPage_uninstall.js]
 [browser_ext_runtime_setUninstallURL.js]
 [browser_ext_simple.js]
 [browser_ext_tab_runtimeConnect.js]
 [browser_ext_tabs_audio.js]
 [browser_ext_tabs_captureVisibleTab.js]
 [browser_ext_tabs_create.js]
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
@@ -15,18 +15,18 @@ function* testInArea(area) {
         "browser_style": true,
       },
     },
 
     files: {
       "popup-a.html": scriptPage("popup-a.js"),
       "popup-a.js": function() {
         window.onload = () => {
-          let background = window.getComputedStyle(document.body).backgroundColor;
-          browser.test.assertEq("rgb(252, 252, 252)", background);
+          let color = window.getComputedStyle(document.body).color;
+          browser.test.assertEq("rgb(34, 36, 38)", color);
           browser.runtime.sendMessage("from-popup-a");
         };
         browser.runtime.onMessage.addListener(msg => {
           if (msg == "close-popup") {
             window.close();
           }
         });
       },
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_popup_corners.js
@@ -0,0 +1,101 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+function* awaitPanel(extension, win = window) {
+  let {target} = yield BrowserTestUtils.waitForEvent(win.document, "load", true, (event) => {
+    return event.target.location && event.target.location.href.endsWith("popup.html");
+  });
+
+  return target.defaultView
+               .QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDocShell)
+               .chromeEventHandler;
+}
+
+add_task(function* testPopupBorderRadius() {
+  let extension = ExtensionTestUtils.loadExtension({
+    background() {
+      browser.tabs.query({active: true, currentWindow: true}, tabs => {
+        browser.pageAction.show(tabs[0].id);
+      });
+    },
+
+    manifest: {
+      "browser_action": {
+        "default_popup": "popup.html",
+        "browser_style": false,
+      },
+
+      "page_action": {
+        "default_popup": "popup.html",
+        "browser_style": false,
+      },
+    },
+
+    files: {
+      "popup.html": `<!DOCTYPE html>
+        <html>
+          <head><meta charset="utf-8"></head>
+          <body style="width: 100px; height: 100px;"></body>
+        </html>`,
+    },
+  });
+
+  yield extension.startup();
+
+  function* testPanel(browser, standAlone = true) {
+    let panel = getPanelForNode(browser);
+    let arrowContent = document.getAnonymousElementByAttribute(panel, "class", "panel-arrowcontent");
+
+    let panelStyle = getComputedStyle(arrowContent);
+
+    let viewNode = browser.parentNode === panel ? browser : browser.parentNode;
+    let viewStyle = getComputedStyle(viewNode);
+
+    let win = browser.contentWindow;
+    let bodyStyle = win.getComputedStyle(win.document.body);
+
+    for (let prop of ["borderTopLeftRadius", "borderTopRightRadius",
+                      "borderBottomRightRadius", "borderBottomLeftRadius"]) {
+      if (standAlone) {
+        is(viewStyle[prop], panelStyle[prop], `Panel and view ${prop} should be the same`);
+        is(bodyStyle[prop], panelStyle[prop], `Panel and body ${prop} should be the same`);
+      } else {
+        is(viewStyle[prop], "0px", `View node ${prop} should be 0px`);
+        is(bodyStyle[prop], "0px", `Body node ${prop} should be 0px`);
+      }
+    }
+  }
+
+  {
+    info("Test stand-alone browserAction popup");
+
+    clickBrowserAction(extension);
+    let browser = yield awaitPanel(extension);
+    yield testPanel(browser);
+    yield closeBrowserAction(extension);
+  }
+
+  {
+    info("Test menu panel browserAction popup");
+
+    let widget = getBrowserActionWidget(extension);
+    CustomizableUI.addWidgetToArea(widget.id, CustomizableUI.AREA_PANEL);
+
+    clickBrowserAction(extension);
+    let browser = yield awaitPanel(extension);
+    yield testPanel(browser, false);
+    yield closeBrowserAction(extension);
+  }
+
+  {
+    info("Test pageAction popup");
+
+    clickPageAction(extension);
+    let browser = yield awaitPanel(extension);
+    yield testPanel(browser);
+    yield closePageAction(extension);
+  }
+
+  yield extension.unload();
+});
--- a/browser/components/extensions/test/browser/head.js
+++ b/browser/components/extensions/test/browser/head.js
@@ -5,17 +5,17 @@
 /* exported CustomizableUI makeWidgetId focusWindow forceGC
  *          getBrowserActionWidget
  *          clickBrowserAction clickPageAction
  *          getBrowserActionPopup getPageActionPopup
  *          closeBrowserAction closePageAction
  *          promisePopupShown promisePopupHidden
  *          openContextMenu closeContextMenu
  *          openExtensionContextMenu closeExtensionContextMenu
- *          imageBuffer getListStyleImage
+ *          imageBuffer getListStyleImage getPanelForNode
  */
 
 var {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm");
 var {CustomizableUI} = Cu.import("resource:///modules/CustomizableUI.jsm");
 
 // Bug 1239884: Our tests occasionally hit a long GC pause at unpredictable
 // times in debug builds, which results in intermittent timeouts. Until we have
 // a better solution, we force a GC after certain strategic tests, which tend to
@@ -78,16 +78,23 @@ function promisePopupHidden(popup) {
     let onPopupHidden = event => {
       popup.removeEventListener("popuphidden", onPopupHidden);
       resolve();
     };
     popup.addEventListener("popuphidden", onPopupHidden);
   });
 }
 
+function getPanelForNode(node) {
+  while (node.localName != "panel") {
+    node = node.parentNode;
+  }
+  return node;
+}
+
 function getBrowserActionWidget(extension) {
   return CustomizableUI.getWidget(makeWidgetId(extension.id) + "-browser-action");
 }
 
 function getBrowserActionPopup(extension, win = window) {
   let group = getBrowserActionWidget(extension);
 
   if (group.areaType == CustomizableUI.TYPE_TOOLBAR) {
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -7,174 +7,86 @@ const Cc = Components.classes;
 const Cr = Components.results;
 const Cu = Components.utils;
 
 const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
-// Set us up to use async prefs in the parent process.
 Cu.import("resource://gre/modules/AsyncPrefs.jsm");
 
-XPCOMUtils.defineLazyModuleGetter(this, "AboutHome",
-                                  "resource:///modules/AboutHome.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "AboutNewTab",
-                                  "resource:///modules/AboutNewTab.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "CaptivePortalWatcher",
-                                  "resource:///modules/CaptivePortalWatcher.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "DirectoryLinksProvider",
-                                  "resource:///modules/DirectoryLinksProvider.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
-                                  "resource://gre/modules/NewTabUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "NewTabMessages",
-                                  "resource:///modules/NewTabMessages.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "UITour",
-                                  "resource:///modules/UITour.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
-                                  "resource://gre/modules/AddonManager.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ContentClick",
-                                  "resource:///modules/ContentClick.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
-                                  "resource://gre/modules/NetUtil.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
-                                  "resource://gre/modules/FileUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
-                                  "resource://gre/modules/PlacesUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "BookmarkHTMLUtils",
-                                  "resource://gre/modules/BookmarkHTMLUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "BookmarkJSONUtils",
-                                  "resource://gre/modules/BookmarkJSONUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PageThumbs",
-                                  "resource://gre/modules/PageThumbs.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PdfJs",
-                                  "resource://pdf.js/PdfJs.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ProcessHangMonitor",
-                                  "resource:///modules/ProcessHangMonitor.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "webrtcUI",
-                                  "resource:///modules/webrtcUI.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
-                                  "resource://gre/modules/PrivateBrowsingUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
-                                  "resource:///modules/RecentWindow.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "TabGroupsMigrator",
-                                  "resource:///modules/TabGroupsMigrator.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
-                                  "resource://gre/modules/Task.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PlacesBackups",
-                                  "resource://gre/modules/PlacesBackups.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "OS",
-                                  "resource://gre/modules/osfile.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "RemotePrompt",
-                                  "resource:///modules/RemotePrompt.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ContentPrefServiceParent",
-                                  "resource://gre/modules/ContentPrefServiceParent.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Feeds",
-                                  "resource:///modules/Feeds.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SelfSupportBackend",
-                                  "resource:///modules/SelfSupportBackend.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
-                                  "resource:///modules/sessionstore/SessionStore.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "BrowserUsageTelemetry",
-                                  "resource:///modules/BrowserUsageTelemetry.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "BrowserUITelemetry",
-                                  "resource:///modules/BrowserUITelemetry.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "AsyncShutdown",
-                                  "resource://gre/modules/AsyncShutdown.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerParent",
-                                  "resource://gre/modules/LoginManagerParent.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "LoginHelper",
-                                  "resource://gre/modules/LoginHelper.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SimpleServiceDiscovery",
-                                  "resource://gre/modules/SimpleServiceDiscovery.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ContentSearch",
-                                  "resource:///modules/ContentSearch.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "TabCrashHandler",
-                                  "resource:///modules/ContentCrashHandlers.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
-                                  "resource://gre/modules/PluralForm.jsm");
+XPCOMUtils.defineLazyServiceGetter(this, "WindowsUIUtils", "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils");
+XPCOMUtils.defineLazyServiceGetter(this, "AlertsService", "@mozilla.org/alerts-service;1", "nsIAlertsService");
+
+// lazy module getters
+[
+  ["AboutHome", "resource:///modules/AboutHome.jsm"],
+  ["AboutNewTab", "resource:///modules/AboutNewTab.jsm"],
+  ["AddonManager", "resource://gre/modules/AddonManager.jsm"],
+  ["AddonWatcher", "resource://gre/modules/AddonWatcher.jsm"],
+  ["AsyncShutdown", "resource://gre/modules/AsyncShutdown.jsm"],
+  ["BookmarkHTMLUtils", "resource://gre/modules/BookmarkHTMLUtils.jsm"],
+  ["BookmarkJSONUtils", "resource://gre/modules/BookmarkJSONUtils.jsm"],
+  ["BrowserUITelemetry", "resource:///modules/BrowserUITelemetry.jsm"],
+  ["BrowserUsageTelemetry", "resource:///modules/BrowserUsageTelemetry.jsm"],
+  ["CaptivePortalWatcher", "resource:///modules/CaptivePortalWatcher.jsm"],
+  ["ContentClick", "resource:///modules/ContentClick.jsm"],
+  ["ContentPrefServiceParent", "resource://gre/modules/ContentPrefServiceParent.jsm"],
+  ["ContentSearch", "resource:///modules/ContentSearch.jsm"],
+  ["DirectoryLinksProvider", "resource:///modules/DirectoryLinksProvider.jsm"],
+  ["Feeds", "resource:///modules/Feeds.jsm"],
+  ["FileUtils", "resource://gre/modules/FileUtils.jsm"],
+  ["FormValidationHandler", "resource:///modules/FormValidationHandler.jsm"],
+  ["LightweightThemeManager", "resource://gre/modules/LightweightThemeManager.jsm"],
+  ["LoginHelper", "resource://gre/modules/LoginHelper.jsm"],
+  ["LoginManagerParent", "resource://gre/modules/LoginManagerParent.jsm"],
+  ["NetUtil", "resource://gre/modules/NetUtil.jsm"],
+  ["NewTabMessages", "resource:///modules/NewTabMessages.jsm"],
+  ["NewTabUtils", "resource://gre/modules/NewTabUtils.jsm"],
+  ["OS", "resource://gre/modules/osfile.jsm"],
+  ["PageThumbs", "resource://gre/modules/PageThumbs.jsm"],
+  ["PdfJs", "resource://pdf.js/PdfJs.jsm"],
+  ["PlacesBackups", "resource://gre/modules/PlacesBackups.jsm"],
+  ["PlacesUtils", "resource://gre/modules/PlacesUtils.jsm"],
+  ["PluralForm", "resource://gre/modules/PluralForm.jsm"],
+  ["PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"],
+  ["ProcessHangMonitor", "resource:///modules/ProcessHangMonitor.jsm"],
+  ["ReaderParent", "resource:///modules/ReaderParent.jsm"],
+  ["RecentWindow", "resource:///modules/RecentWindow.jsm"],
+  ["RemotePrompt", "resource:///modules/RemotePrompt.jsm"],
+  ["SelfSupportBackend", "resource:///modules/SelfSupportBackend.jsm"],
+  ["SessionStore", "resource:///modules/sessionstore/SessionStore.jsm"],
+  ["ShellService", "resource:///modules/ShellService.jsm"],
+  ["SimpleServiceDiscovery", "resource://gre/modules/SimpleServiceDiscovery.jsm"],
+  ["TabCrashHandler", "resource:///modules/ContentCrashHandlers.jsm"],
+  ["TabGroupsMigrator", "resource:///modules/TabGroupsMigrator.jsm"],
+  ["Task", "resource://gre/modules/Task.jsm"],
+  ["UITour", "resource:///modules/UITour.jsm"],
+  ["WebChannel", "resource://gre/modules/WebChannel.jsm"],
+  ["WindowsRegistry", "resource://gre/modules/WindowsRegistry.jsm"],
+  ["webrtcUI", "resource:///modules/webrtcUI.jsm"],
+].forEach(([name, resource]) => XPCOMUtils.defineLazyModuleGetter(this, name, resource));
+
 if (AppConstants.MOZ_CRASHREPORTER) {
   XPCOMUtils.defineLazyModuleGetter(this, "PluginCrashReporter",
                                     "resource:///modules/ContentCrashHandlers.jsm");
   XPCOMUtils.defineLazyModuleGetter(this, "CrashSubmit",
                                     "resource://gre/modules/CrashSubmit.jsm");
 }
 
 XPCOMUtils.defineLazyGetter(this, "gBrandBundle", function() {
   return Services.strings.createBundle('chrome://branding/locale/brand.properties');
 });
 
 XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() {
   return Services.strings.createBundle('chrome://browser/locale/browser.properties');
 });
 
 
-XPCOMUtils.defineLazyModuleGetter(this, "FormValidationHandler",
-                                  "resource:///modules/FormValidationHandler.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "WebChannel",
-                                  "resource://gre/modules/WebChannel.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ReaderParent",
-                                  "resource:///modules/ReaderParent.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "AddonWatcher",
-                                  "resource://gre/modules/AddonWatcher.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
-                                  "resource://gre/modules/LightweightThemeManager.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ShellService",
-                                  "resource:///modules/ShellService.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "WindowsRegistry",
-                                  "resource://gre/modules/WindowsRegistry.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "WindowsUIUtils",
-                                   "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils");
-
-XPCOMUtils.defineLazyServiceGetter(this, "AlertsService",
-                                   "@mozilla.org/alerts-service;1", "nsIAlertsService");
-
 // Seconds of idle before trying to create a bookmarks backup.
 const BOOKMARKS_BACKUP_IDLE_TIME_SEC = 8 * 60;
 // Minimum interval between backups.  We try to not create more than one backup
 // per interval.
 const BOOKMARKS_BACKUP_MIN_INTERVAL_DAYS = 1;
 // Maximum interval between backups.  If the last backup is older than these
 // days we will try to create a new one more aggressively.
 const BOOKMARKS_BACKUP_MAX_INTERVAL_DAYS = 3;
--- a/browser/config/mozconfigs/linux32/common-opt
+++ b/browser/config/mozconfigs/linux32/common-opt
@@ -7,13 +7,10 @@ ac_add_options --with-mozilla-api-keyfil
 
 . $topsrcdir/build/unix/mozconfig.linux32
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
--- a/browser/config/mozconfigs/linux32/debug
+++ b/browser/config/mozconfigs/linux32/debug
@@ -10,19 +10,16 @@ MOZ_AUTOMATION_L10N_CHECK=0
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 # Enable Telemetry
 export MOZ_TELEMETRY_REPORTING=1
 
 #Use ccache
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.rust"
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/linux64/common-opt
+++ b/browser/config/mozconfigs/linux64/common-opt
@@ -7,13 +7,10 @@ ac_add_options --with-mozilla-api-keyfil
 
 . $topsrcdir/build/unix/mozconfig.linux
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
--- a/browser/config/mozconfigs/linux64/debug
+++ b/browser/config/mozconfigs/linux64/debug
@@ -8,19 +8,16 @@ MOZ_AUTOMATION_L10N_CHECK=0
 . $topsrcdir/build/unix/mozconfig.linux
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 # Enable Telemetry
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.rust"
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/linux64/debug-static-analysis-clang
+++ b/browser/config/mozconfigs/linux64/debug-static-analysis-clang
@@ -9,18 +9,15 @@ ac_add_options --enable-dmd
 
 # Use Clang as specified in manifest
 export CC="$topsrcdir/clang/bin/clang"
 export CXX="$topsrcdir/clang/bin/clang++"
 
 # Add the static checker
 ac_add_options --enable-clang-plugin
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 . "$topsrcdir/build/unix/mozconfig.stdcxx"
 
 export PKG_CONFIG_LIBDIR=/usr/lib64/pkgconfig:/usr/share/pkgconfig
 . $topsrcdir/build/unix/mozconfig.gtk
 
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/linux64/opt-static-analysis-clang
+++ b/browser/config/mozconfigs/linux64/opt-static-analysis-clang
@@ -8,18 +8,15 @@ ac_add_options --enable-dmd
 
 # Use Clang as specified in manifest
 CC="$topsrcdir/clang/bin/clang"
 CXX="$topsrcdir/clang/bin/clang++"
 
 # Add the static checker
 ac_add_options --enable-clang-plugin
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 . "$topsrcdir/build/unix/mozconfig.stdcxx"
 
 export PKG_CONFIG_LIBDIR=/usr/lib64/pkgconfig:/usr/share/pkgconfig
 . $topsrcdir/build/unix/mozconfig.gtk
 
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/macosx-universal/common-opt
+++ b/browser/config/mozconfigs/macosx-universal/common-opt
@@ -10,13 +10,10 @@ ac_add_options --with-google-api-keyfile
 ac_add_options --with-google-oauth-api-keyfile=/builds/google-oauth-api.key
 ac_add_options --with-mozilla-api-keyfile=/builds/mozilla-desktop-geoloc-api.key
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
--- a/browser/config/mozconfigs/macosx64/debug
+++ b/browser/config/mozconfigs/macosx64/debug
@@ -10,19 +10,16 @@ export MOZILLA_OFFICIAL=1
 
 # Enable Telemetry
 export MOZ_TELEMETRY_REPORTING=1
 
 if test "${MOZ_UPDATE_CHANNEL}" = "nightly"; then
 ac_add_options --with-macbundlename-prefix=Firefox
 fi
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.rust"
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/macosx64/debug-static-analysis
+++ b/browser/config/mozconfigs/macosx64/debug-static-analysis
@@ -2,15 +2,12 @@ MOZ_AUTOMATION_BUILD_SYMBOLS=0
 MOZ_AUTOMATION_PACKAGE_TESTS=0
 MOZ_AUTOMATION_L10N_CHECK=0
 
 . $topsrcdir/build/macosx/mozconfig.common
 
 ac_add_options --enable-debug
 ac_add_options --enable-dmd
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 ac_add_options --enable-clang-plugin
 
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/macosx64/nightly
+++ b/browser/config/mozconfigs/macosx64/nightly
@@ -8,19 +8,16 @@ export MOZILLA_OFFICIAL=1
 
 # Enable Telemetry
 export MOZ_TELEMETRY_REPORTING=1
 
 if test "${MOZ_UPDATE_CHANNEL}" = "nightly"; then
 ac_add_options --with-macbundlename-prefix=Firefox
 fi
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.rust"
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/macosx64/opt-static-analysis
+++ b/browser/config/mozconfigs/macosx64/opt-static-analysis
@@ -3,17 +3,14 @@ MOZ_AUTOMATION_PACKAGE_TESTS=0
 MOZ_AUTOMATION_L10N_CHECK=0
 
 . $topsrcdir/build/macosx/mozconfig.common
 
 ac_add_options --disable-debug
 ac_add_options --enable-optimize
 ac_add_options --enable-dmd
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 ac_add_options --enable-clang-plugin
 
 . "$topsrcdir/build/mozconfig.rust"
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
 
--- a/browser/config/mozconfigs/win32/common-opt
+++ b/browser/config/mozconfigs/win32/common-opt
@@ -23,19 +23,16 @@ ac_add_options --with-mozilla-api-keyfil
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
 . $topsrcdir/build/win32/mozconfig.vs-latest
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Enable Adobe Primetime CDM on 32-bit Windows in Mozilla builds.
 # Enabled here on the assumption that downstream vendors will not be using
 # these build configs.
 # Note: Widevine is automatically enabled by the build, and can be
 # disabled with -widevine.
 ac_add_options --enable-eme=+adobe
 
 # Package js shell.
--- a/browser/config/mozconfigs/win32/debug
+++ b/browser/config/mozconfigs/win32/debug
@@ -18,19 +18,16 @@ ac_add_options --with-google-oauth-api-k
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 # Enable Telemetry
 export MOZ_TELEMETRY_REPORTING=1
 
 . $topsrcdir/build/win32/mozconfig.vs-latest
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.rust"
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/win32/debug-static-analysis
+++ b/browser/config/mozconfigs/win32/debug-static-analysis
@@ -7,16 +7,13 @@ MOZ_AUTOMATION_L10N_CHECK=0
 
 ac_add_options --enable-debug
 ac_add_options --enable-dmd
 
 ac_add_options --enable-clang-plugin
 
 . $topsrcdir/build/win32/mozconfig.vs-latest
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 . "$topsrcdir/build/mozconfig.rust"
 
 . "$topsrcdir/build/mozconfig.common.override"
 . "$topsrcdir/build/mozconfig.cache"
 . "$topsrcdir/build/mozconfig.clang-cl"
--- a/browser/config/mozconfigs/win64/common-opt
+++ b/browser/config/mozconfigs/win64/common-opt
@@ -19,19 +19,16 @@ fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 ac_add_options --with-mozilla-api-keyfile=/c/builds/mozilla-desktop-geoloc-api.key
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 . $topsrcdir/build/win64/mozconfig.vs-latest
 
 # Enable Adobe Primetime CDM on 64-bit Windows in Mozilla builds.
 # Enabled here on the assumption that downstream vendors will not be using
 # these build configs.
 # Note: Widevine is automatically enabled by the build, and can be
 # disabled with -widevine.
 ac_add_options --enable-eme=+adobe
--- a/browser/config/mozconfigs/win64/debug
+++ b/browser/config/mozconfigs/win64/debug
@@ -18,19 +18,16 @@ fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 # Enable Telemetry
 export MOZ_TELEMETRY_REPORTING=1
 
-# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
-ac_add_options --enable-warnings-as-errors
-
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . $topsrcdir/build/win64/mozconfig.vs-latest
 
 . "$topsrcdir/build/mozconfig.rust"
--- a/browser/docs/UITelemetry.rst
+++ b/browser/docs/UITelemetry.rst
@@ -1,8 +1,10 @@
+.. _uitelemetry:
+
 =======================
 UITelemetry data format
 =======================
 
 UI Telemetry sends its data as a JSON blob. This document describes the different parts
 of the JSON blob.
 
 ``toolbars``
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -144,27 +144,32 @@ toolbarbutton.bookmark-item:not(.subview
   -moz-appearance: none;
   border: 1px solid transparent;
   border-radius: 2px;
   transition-property: background-color, border-color;
   transition-duration: 150ms;
 }
 
 toolbarbutton.bookmark-item:not(.subviewbutton):hover:not([open]) {
-  background-color: var(--toolbarbutton-hover-background);
+  background: var(--toolbarbutton-hover-background);
   border-color: var(--toolbarbutton-hover-bordercolor);
 }
 
 toolbarbutton.bookmark-item:not(.subviewbutton):hover:active,
 toolbarbutton.bookmark-item[open="true"] {
   background: var(--toolbarbutton-active-background);
   box-shadow: var(--toolbarbutton-active-boxshadow);
   border-color: var(--toolbarbutton-active-bordercolor);
 }
 
+toolbarbutton.bookmark-item:not(.subviewbutton):hover:-moz-lwtheme {
+  background: var(--toolbarbutton-hover-background);
+  border-color: var(--toolbarbutton-hover-bordercolor);
+}
+
 .bookmark-item > .toolbarbutton-icon,
 #personal-bookmarks[cui-areatype="toolbar"] > #bookmarks-toolbar-placeholder > .toolbarbutton-icon {
   width: 16px;
   height: 16px;
 }
 
 /* Force the display of the label for bookmarks */
 .bookmark-item > .toolbarbutton-text,
@@ -1945,11 +1950,20 @@ notification.pluginVulnerable > .notific
   margin-inline-end: 0 !important;
 }
 
 .browser-extension-panel > .panel-arrowcontainer > .panel-arrowcontent {
   padding: 0;
   overflow: hidden;
 }
 
+.webextension-popup-browser {
+  margin-right: -1px;
+  border-radius: inherit;
+}
+
+#PanelUI-popup .webextension-popup-browser {
+  margin: 0;
+}
+
 .menuitem-iconic[usercontextid] > .menu-iconic-left > .menu-iconic-icon {
   visibility: visible;
 }
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -3457,8 +3457,21 @@ menulist.translate-infobar-element > .me
   padding-left: 0;
   padding-right: 0;
 }
 
 .browser-extension-panel > .panel-arrowcontainer > .panel-arrowcontent {
   padding: 0;
   overflow: hidden;
 }
+
+.cui-widget-panelview[id^=PanelUI-webext-] {
+  border-radius: 3.5px;
+}
+
+.webextension-popup-browser {
+  margin-right: -1px;
+  border-radius: inherit;
+}
+
+#PanelUI-popup .webextension-popup-browser {
+  margin: 0;
+}
--- a/browser/themes/shared/customizableui/panelUI.inc.css
+++ b/browser/themes/shared/customizableui/panelUI.inc.css
@@ -268,20 +268,16 @@ panelmultiview[nosubviews=true] > .panel
 .cui-widget-panel[viewId^=PanelUI-webext-] .panel-mainview {
   max-width: 800px;
 }
 
 .cui-widget-panel[viewId^=PanelUI-webext-] > .panel-arrowcontainer > .panel-arrowcontent {
   padding: 0;
 }
 
-.cui-widget-panelview[id^=PanelUI-webext-] {
-  border-radius: 3.5px;
-}
-
 panelview[id^=PanelUI-webext-] {
   overflow: hidden;
 }
 
 panelview:not([mainview]) .toolbarbutton-text,
 .cui-widget-panel toolbarbutton > .toolbarbutton-text {
   text-align: start;
   display: -moz-box;
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -461,30 +461,39 @@
 /* ::::: bookmark buttons ::::: */
 
 toolbarbutton.bookmark-item:not(.subviewbutton),
 #personal-bookmarks[cui-areatype="toolbar"]:not([overflowedItem=true]) > #bookmarks-toolbar-placeholder {
   margin: 0;
   padding: 2px 3px;
   -moz-appearance: none;
   border: 1px solid transparent;
+  border-radius: 1px;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
 }
 
 toolbarbutton.bookmark-item:not(.subviewbutton):hover:not([disabled="true"]):not([open]) {
   border-color: var(--toolbarbutton-hover-bordercolor);
   background: var(--toolbarbutton-hover-background);
 }
 
 toolbarbutton.bookmark-item:not(.subviewbutton):hover:active:not([disabled="true"]),
 toolbarbutton.bookmark-item[open="true"] {
   border-color: var(--toolbarbutton-active-bordercolor);
   box-shadow: var(--toolbarbutton-active-boxshadow);
   background: var(--toolbarbutton-active-background);
 }
 
+toolbarbutton.bookmark-item:not(.subviewbutton):hover:not([disabled="true"]):-moz-lwtheme {
+  background-color: rgba(255,255,255,.25);
+  background-origin: padding-box;
+  background-clip: padding-box;
+}
+
 .bookmark-item > .toolbarbutton-icon,
 #personal-bookmarks[cui-areatype="toolbar"] > #bookmarks-toolbar-placeholder > .toolbarbutton-icon {
   width: 16px;
   height: 16px;
 }
 
 /* Force the display of the label for bookmarks */
 .bookmark-item > .toolbarbutton-text,
@@ -2704,8 +2713,25 @@ notification.pluginVulnerable > .notific
 @media not all and (-moz-os-version: windows-xp) {
 %include browser-aero.css
 }
 
 .browser-extension-panel > .panel-arrowcontainer > .panel-arrowcontent {
   padding: 0;
   overflow: hidden;
 }
+
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
+  .cui-widget-panelview[id^=PanelUI-webext-] {
+    border-radius: 4px;
+  }
+}
+
+.webextension-popup-browser {
+  margin-right: -1px;
+  border-radius: inherit;
+}
+
+#PanelUI-popup .webextension-popup-browser {
+  margin: 0;
+}
--- a/build/autoconf/compiler-opts.m4
+++ b/build/autoconf/compiler-opts.m4
@@ -289,194 +289,8 @@ if test -n "$GCC_USE_GNU_LD"; then
   case "$LDFLAGS" in
   *-fsanitize=address*)
     LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
     ;;
   esac
 fi
 
 ])
-
-dnl GCC and clang will fail if given an unknown warning option like -Wfoobar. 
-dnl But later versions won't fail if given an unknown negated warning option
-dnl like -Wno-foobar.  So when we are check for support of negated warning 
-dnl options, we actually test the positive form, but add the negated form to 
-dnl the flags variable.
-
-AC_DEFUN([MOZ_C_SUPPORTS_WARNING],
-[
-    AC_CACHE_CHECK(whether the C compiler supports $1$2, $3,
-        [
-            AC_LANG_SAVE
-            AC_LANG_C
-            _SAVE_CFLAGS="$CFLAGS"
-            CFLAGS="$CFLAGS -Werror -W$2"
-            AC_TRY_COMPILE([],
-                           [return(0);],
-                           $3="yes",
-                           $3="no")
-            CFLAGS="$_SAVE_CFLAGS"
-            AC_LANG_RESTORE
-        ])
-    if test "${$3}" = "yes"; then
-        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} $1$2"
-    fi
-])
-
-AC_DEFUN([MOZ_CXX_SUPPORTS_WARNING],
-[
-    AC_CACHE_CHECK(whether the C++ compiler supports $1$2, $3,
-        [
-            AC_LANG_SAVE
-            AC_LANG_CPLUSPLUS
-            _SAVE_CXXFLAGS="$CXXFLAGS"
-            CXXFLAGS="$CXXFLAGS -Werror -W$2"
-            AC_TRY_COMPILE([],
-                           [return(0);],
-                           $3="yes",
-                           $3="no")
-            CXXFLAGS="$_SAVE_CXXFLAGS"
-            AC_LANG_RESTORE
-        ])
-    if test "${$3}" = "yes"; then
-        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} $1$2"
-    fi
-])
-
-AC_DEFUN([MOZ_SET_WARNINGS_CFLAGS],
-[
-    # Turn on gcc/clang warnings:
-    # https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Warning-Options.html
-
-    # -Wall - lots of useful warnings
-    # -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
-    # -Wignored-qualifiers - catches return types with qualifiers like const
-    # -Wpointer-arith - catches pointer arithmetic using NULL or sizeof(void)
-    # -Wsign-compare - catches comparing signed/unsigned ints
-    # -Wtype-limits - catches overflow bugs, few false positives
-    # -Wunreachable-code - catches some dead code
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wall"
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wempty-body"
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wignored-qualifiers"
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wpointer-arith"
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wsign-compare"
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wtype-limits"
-    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wunreachable-code"
-
-    # -Wclass-varargs - catches objects passed by value to variadic functions.
-    # -Wloop-analysis - catches issues around loops
-    # -Wnon-literal-null-conversion - catches expressions used as a null pointer constant
-    # -Wstring-conversion - catches string literals used in boolean expressions
-    # -Wthread-safety - catches inconsistent use of mutexes
-    #
-    # XXX: at the time of writing, the version of clang used on the OS X test
-    # machines has a bug that causes it to reject some valid files if both
-    # -Wnon-literal-null-conversion and -Wsometimes-uninitialized are
-    # specified. We work around this by instead using
-    # -Werror=non-literal-null-conversion, but we only do that when
-    # --enable-warnings-as-errors is specified so that no unexpected fatal
-    # warnings are produced.
-    MOZ_C_SUPPORTS_WARNING(-W, class-varargs, ac_c_has_wclass_varargs)
-    MOZ_C_SUPPORTS_WARNING(-W, loop-analysis, ac_c_has_wloop_analysis)
-
-    if test "$MOZ_ENABLE_WARNINGS_AS_ERRORS"; then
-        MOZ_C_SUPPORTS_WARNING(-Werror=, non-literal-null-conversion, ac_c_has_non_literal_null_conversion)
-    fi
-
-    MOZ_C_SUPPORTS_WARNING(-W, string-conversion, ac_c_has_wstring_conversion)
-    MOZ_C_SUPPORTS_WARNING(-W, thread-safety, ac_c_has_wthread_safety)
-
-    # Turn off some non-useful warnings that -Wall turns on.
-
-    # Prevent the following GCC warnings from being treated as errors:
-    # -Wmaybe-uninitialized - too many false positives
-    # -Wdeprecated-declarations - we don't want our builds held hostage when a
-    #   platform-specific API becomes deprecated.
-    # -Wfree-nonheap-object - false positives during PGO
-    # -Warray-bounds - false positives depending on optimization
-    MOZ_C_SUPPORTS_WARNING(-W, no-error=maybe-uninitialized, ac_c_has_noerror_maybe_uninitialized)
-    MOZ_C_SUPPORTS_WARNING(-W, no-error=deprecated-declarations, ac_c_has_noerror_deprecated_declarations)
-    MOZ_C_SUPPORTS_WARNING(-W, no-error=array-bounds, ac_c_has_noerror_array_bounds)
-
-    if test -n "$MOZ_PGO"; then
-        MOZ_C_SUPPORTS_WARNING(-W, no-error=coverage-mismatch, ac_c_has_noerror_coverage_mismatch)
-        MOZ_C_SUPPORTS_WARNING(-W, no-error=free-nonheap-object, ac_c_has_noerror_free_nonheap_object)
-    fi
-])
-
-AC_DEFUN([MOZ_SET_WARNINGS_CXXFLAGS],
-[
-    # Turn on gcc/clang warnings:
-    # https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Warning-Options.html
-
-    # -Wall - lots of useful warnings
-    # -Wc++1[14z]-compat[-pedantic] - catches C++ version forward-compat issues
-    # -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
-    # -Wignored-qualifiers - catches return types with qualifiers like const
-    # -Woverloaded-virtual - function declaration hides virtual function from base class
-    # -Wpointer-arith - catches pointer arithmetic using NULL or sizeof(void)
-    # -Wsign-compare - catches comparing signed/unsigned ints
-    # -Wtype-limits - catches overflow bugs, few false positives
-    # -Wunreachable-code - catches some dead code
-    # -Wwrite-strings - catches treating string literals as non-const
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wall"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wc++11-compat"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wempty-body"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wignored-qualifiers"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Woverloaded-virtual"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wpointer-arith"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wsign-compare"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wtype-limits"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wunreachable-code"
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wwrite-strings"
-
-    # -Wclass-varargs - catches objects passed by value to variadic functions.
-    # -Wimplicit-fallthrough - catches unintentional switch case fallthroughs
-    # -Wloop-analysis - catches issues around loops
-    # -Wnon-literal-null-conversion - catches expressions used as a null pointer constant
-    # -Wstring-conversion - catches string literals used in boolean expressions
-    # -Wthread-safety - catches inconsistent use of mutexes
-    #
-    # XXX: at the time of writing, the version of clang used on the OS X test
-    # machines has a bug that causes it to reject some valid files if both
-    # -Wnon-literal-null-conversion and -Wsometimes-uninitialized are
-    # specified. We work around this by instead using
-    # -Werror=non-literal-null-conversion, but we only do that when
-    # --enable-warnings-as-errors is specified so that no unexpected fatal
-    # warnings are produced.
-    MOZ_CXX_SUPPORTS_WARNING(-W, c++11-compat-pedantic, ac_cxx_has_wcxx11_compat_pedantic)
-    MOZ_CXX_SUPPORTS_WARNING(-W, c++14-compat, ac_cxx_has_wcxx14_compat)
-    MOZ_CXX_SUPPORTS_WARNING(-W, c++14-compat-pedantic, ac_cxx_has_wcxx14_compat_pedantic)
-    MOZ_CXX_SUPPORTS_WARNING(-W, c++1z-compat, ac_cxx_has_wcxx1z_compat)
-    MOZ_CXX_SUPPORTS_WARNING(-W, class-varargs, ac_cxx_has_wclass_varargs)
-    MOZ_CXX_SUPPORTS_WARNING(-W, implicit-fallthrough, ac_cxx_has_wimplicit_fallthrough)
-    MOZ_CXX_SUPPORTS_WARNING(-W, loop-analysis, ac_cxx_has_wloop_analysis)
-
-    if test "$MOZ_ENABLE_WARNINGS_AS_ERRORS"; then
-        MOZ_CXX_SUPPORTS_WARNING(-Werror=, non-literal-null-conversion, ac_cxx_has_non_literal_null_conversion)
-    fi
-
-    MOZ_CXX_SUPPORTS_WARNING(-W, string-conversion, ac_cxx_has_wstring_conversion)
-    MOZ_CXX_SUPPORTS_WARNING(-W, thread-safety, ac_cxx_has_wthread_safety)
-
-    # Turn off some non-useful warnings that -Wall turns on.
-
-    # -Wno-invalid-offsetof - we use offsetof on non-POD types frequently
-    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-invalid-offsetof"
-
-    # -Wno-inline-new-delete - we inline 'new' and 'delete' in mozalloc
-    MOZ_CXX_SUPPORTS_WARNING(-Wno-, inline-new-delete, ac_cxx_has_wno_inline_new_delete)
-
-    # Prevent the following GCC warnings from being treated as errors:
-    # -Wmaybe-uninitialized - too many false positives
-    # -Wdeprecated-declarations - we don't want our builds held hostage when a
-    #   platform-specific API becomes deprecated.
-    # -Wfree-nonheap-object - false positives during PGO
-    # -Warray-bounds - false positives depending on optimization
-    MOZ_CXX_SUPPORTS_WARNING(-W, no-error=maybe-uninitialized, ac_cxx_has_noerror_maybe_uninitialized)
-    MOZ_CXX_SUPPORTS_WARNING(-W, no-error=deprecated-declarations, ac_cxx_has_noerror_deprecated_declarations)
-    MOZ_CXX_SUPPORTS_WARNING(-W, no-error=array-bounds, ac_cxx_has_noerror_array_bounds)
-
-    if test -n "$MOZ_PGO"; then
-        MOZ_CXX_SUPPORTS_WARNING(-W, no-error=coverage-mismatch, ac_cxx_has_noerror_coverage_mismatch)
-        MOZ_CXX_SUPPORTS_WARNING(-W, no-error=free-nonheap-object, ac_cxx_has_noerror_free_nonheap_object)
-    fi
-])
rename from build/moz.configure/compilechecks.configure
rename to build/moz.configure/compile-checks.configure
--- a/build/moz.configure/compilechecks.configure
+++ b/build/moz.configure/compile-checks.configure
@@ -70,8 +70,86 @@ def check_header(header, language='C++',
 # - `headers` are the headers to be checked.
 # - `kwargs` are keyword arguments passed verbatim to check_header.
 @template
 def check_headers(*headers, **kwargs):
     checks = []
     for header in headers:
         checks.append(check_header(header, **kwargs))
     return checks
+
+
+@depends(c_compiler)
+def warnings_cflags(c_compiler):
+    return []
+
+@depends(cxx_compiler)
+def warnings_cxxflags(cxx_compiler):
+    return []
+
+
+# Tests whether GCC or clang support the given warning flag, and if it is,
+# add it to the list of warning flags for the build.
+# - `warning` is the warning flag (e.g. -Wfoo)
+# - `compiler` (optional) is the compiler to test against (c_compiler or
+#   cxx_compiler, from toolchain.configure). When omitted, both compilers
+#   are tested.
+# - `when` (optional) is a @depends function or option name conditioning
+#   when the warning flag is wanted.
+# - `check`, when not set, skips checking whether the flag is supported and
+#   adds it to the list of warning flags unconditionally. This is only meant
+#   for add_gcc_warning().
+@template
+def check_and_add_gcc_warning(warning, compiler=None, when=None, check=True):
+    if compiler:
+        compilers = (compiler,)
+    else:
+        compilers = (c_compiler, cxx_compiler)
+
+    if not when:
+        when = depends('--help')(lambda _: True)
+
+    for c in compilers:
+        assert c in (c_compiler, cxx_compiler)
+        lang, warnings_flags = {
+            c_compiler: ('C', warnings_cflags),
+            cxx_compiler: ('C++', warnings_cxxflags),
+        }[c]
+
+        # GCC and clang will fail if given an unknown warning option like
+        # -Wfoobar. But later versions won't fail if given an unknown negated
+        # warning option like -Wno-foobar. So when we are checking for support
+        # of a negated warning option, we actually test the positive form, but
+        # add the negated form to the flags variable.
+        if (warning.startswith('-Wno-') and
+                not warning.startswith('-Wno-error=')):
+            flags = ['-Werror', '-W' + warning[5:]]
+        elif warning.startswith('-Werror='):
+            flags = [warning]
+        else:
+            flags = ['-Werror', warning]
+
+        @depends(c, when)
+        def result(c, when):
+            if when and c.type in ('clang', 'gcc'):
+                return True
+
+        if check:
+            result = c.try_compile(
+                flags=flags, when=result,
+                check_msg='whether the %s compiler supports %s' % (lang,
+                                                                   warning))
+
+        @depends(result, warnings_flags)
+        def maybe_add_flag(result, warnings_flags):
+            if result is not None:
+                warnings_flags.append(warning)
+
+# Add the given warning to the list of warning flags for the build.
+# - `warning` is the warning flag (e.g. -Wfoo)
+# - `compiler` (optional) is the compiler to add the flag for (c_compiler or
+#   cxx_compiler, from toolchain.configure). When omitted, the warning flag
+#   is added for both compilers.
+# - `when` (optional) is a @depends function or option name conditioning
+#   when the warning flag is wanted.
+@template
+def add_gcc_warning(warning, compiler=None, when=None):
+    check_and_add_gcc_warning(warning, compiler, when, check=False)
--- a/build/moz.configure/compilers-util.configure
+++ b/build/moz.configure/compilers-util.configure
@@ -17,17 +17,17 @@ def compiler_class(compiler):
         # - `body` is the code that will appear in the main function of the
         #   generated test program. `return 0;` is appended to the function
         #   body automatically.
         # - `flags` are the flags to be passed to the compiler, in addition to
         #   `-c`.
         # - `check_msg` is the message to be printed to accompany compiling the
         #   test program.
         def try_compile(self, includes=None, body='', flags=None,
-                        check_msg=None, onerror=lambda: None):
+                        check_msg=None, when=None, onerror=lambda: None):
             includes = includes or []
             source_lines = ['#include <%s>' % f for f in includes]
             source = '\n'.join(source_lines) + '\n'
             source += textwrap.dedent('''\
                 int
                 main(void)
                 {
                 %s
@@ -43,17 +43,17 @@ def compiler_class(compiler):
             else:
                 def checking_fn(fn):
                     return fn
 
             def get_flags():
                 if flags:
                     return flags[:]
 
-            @depends(self, extra_toolchain_flags)
+            @depends_when(self, extra_toolchain_flags, when=when)
             @checking_fn
             def func(compiler, extra_flags):
                 flags = get_flags() or []
                 flags += extra_flags
                 flags.append('-c')
 
                 return try_invoke_compiler(
                     compiler.wrapper + [compiler.compiler] + compiler.flags,
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -66,16 +66,20 @@ def check_build_environment(help, dist):
 
 set_config('TOPSRCDIR', delayed_getattr(check_build_environment, 'topsrcdir'))
 set_config('TOPOBJDIR', delayed_getattr(check_build_environment, 'topobjdir'))
 set_config('MOZ_BUILD_ROOT', delayed_getattr(check_build_environment,
                                              'topobjdir'))
 set_config('DIST', delayed_getattr(check_build_environment, 'dist'))
 
 
+option(env='MOZ_AUTOMATION', help='Enable options for automated builds')
+set_config('MOZ_AUTOMATION', depends_if('MOZ_AUTOMATION')(lambda x: True))
+
+
 option(env='OLD_CONFIGURE', nargs=1, help='Path to the old configure script')
 
 option(env='MOZ_CURRENT_PROJECT', nargs=1, help='Current build project')
 option(env='MOZCONFIG', nargs=1, help='Mozconfig location')
 
 # Read user mozconfig
 # ==============================================================
 # Note: the dependency on --help is only there to always read the mozconfig,
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -251,17 +251,16 @@ def old_configure_options(*options):
     '--enable-trace-logging',
     '--enable-tree-freetype',
     '--enable-ui-locale',
     '--enable-universalchardet',
     '--enable-updater',
     '--enable-url-classifier',
     '--enable-valgrind',
     '--enable-verify-mar',
-    '--enable-warnings-as-errors',
     '--enable-webapp-runtime',
     '--enable-webrtc',
     '--enable-websms-backend',
     '--enable-webspeech',
     '--enable-webspeechtestbackend',
     '--enable-xul',
     '--enable-zipwriter',
     '--no-create',
--- a/build/moz.configure/rust.configure
+++ b/build/moz.configure/rust.configure
@@ -27,39 +27,43 @@ def rustc_info(rustc):
         return namespace(
             version=Version(info.get('release', '0')),
             commit=info.get('commit-hash', 'unknown'),
         )
 
 @depends_if(cargo)
 @checking('cargo support for --frozen')
 @imports('subprocess')
+@imports('os')
 def cargo_supports_frozen(cargo):
     try:
         lines = subprocess.check_output(
             [cargo, 'help', 'build']
         ).splitlines()
-        return any('    --frozen' in l for l in lines)
+        supported = any('    --frozen' in l for l in lines)
+        if 'MOZ_AUTOMATION' in os.environ and not supported:
+            die('cargo in automation must support --frozen')
+        return supported
     except subprocess.CalledProcessError as e:
         die('Failed to call cargo: %s', e.message)
 
 set_config('MOZ_CARGO_SUPPORTS_FROZEN', cargo_supports_frozen)
 
 @depends('--enable-rust', rustc, rustc_info)
 @imports(_from='textwrap', _import='dedent')
 def rust_compiler(value, rustc, rustc_info):
     if value:
         if not rustc:
             die(dedent('''\
             Rust compiler not found.
             To compile rust language sources, you must have 'rustc' in your path.
             See https//www.rust-lang.org/ for more information.
             '''))
         version = rustc_info.version
-        min_version = Version('1.5')
+        min_version = Version('1.10')
         if version < min_version:
             die(dedent('''\
             Rust compiler {} is too old.
             To compile Rust language sources please install at least
             version {} of the 'rustc' toolchain and make sure it is
             first in your path.
             You can verify this by typing 'rustc --version'.
             '''.format(version, min_version)))
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -1,14 +1,21 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
+# PGO
+# ==============================================================
+option(env='MOZ_PGO', help='Build with profile guided optimizations')
+
+set_config('MOZ_PGO', depends('MOZ_PGO')(lambda x: bool(x)))
+add_old_configure_assignment('MOZ_PGO', depends('MOZ_PGO')(lambda x: bool(x)))
+
 # yasm detection
 # ==============================================================
 yasm = check_prog('YASM', ['yasm'], allow_missing=True)
 
 @depends_if(yasm)
 @checking('yasm version')
 def yasm_version(yasm):
     version = check_cmd_output(
@@ -752,17 +759,17 @@ def compiler(language, host_or_target, c
 
 c_compiler = compiler('C', target)
 cxx_compiler = compiler('C++', target, c_compiler=c_compiler)
 host_c_compiler = compiler('C', host, other_compiler=c_compiler)
 host_cxx_compiler = compiler('C++', host, c_compiler=host_c_compiler,
                              other_compiler=cxx_compiler,
                              other_c_compiler=c_compiler)
 
-include('compilechecks.configure')
+include('compile-checks.configure')
 
 @depends(c_compiler)
 def default_debug_flags(compiler_info):
     # Debug info is ON by default.
     if compiler_info.type == 'msvc':
         return '-Zi'
     return '-g'
 
--- a/build/moz.configure/util.configure
+++ b/build/moz.configure/util.configure
@@ -344,16 +344,19 @@ def depends_if(*args):
 # Like @depends_if, but a distinguished value passed as a keyword argument
 # "when" is truth tested instead of every argument. This value is not passed
 # to the function if it is called.
 @template
 def depends_when(*args, **kwargs):
     if not len(kwargs) == 1 and kwargs.get('when'):
         die('depends_when requires a single keyword argument, "when"')
     when = kwargs['when']
+    if not when:
+        return depends(*args)
+
     def decorator(fn):
         @depends(when, *args)
         def wrapper(val, *args):
             if val:
                 return fn(*args)
         return wrapper
     return decorator
 
new file mode 100644
--- /dev/null
+++ b/build/moz.configure/warnings.configure
@@ -0,0 +1,111 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+js_option('--enable-warnings-as-errors', env='MOZ_ENABLE_WARNINGS_AS_ERRORS',
+          default=depends('MOZ_AUTOMATION', '--help')(lambda x, _: bool(x)),
+          help='Enable treating warnings as errors')
+
+add_old_configure_assignment(
+    'MOZ_ENABLE_WARNINGS_AS_ERRORS',
+    depends('--enable-warnings-as-errors')(lambda x: bool(x)))
+
+
+# GCC/Clang warnings:
+# https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Warning-Options.html
+
+# lots of useful warnings
+add_gcc_warning('-Wall')
+
+# catches C++ version forward-compat issues
+add_gcc_warning('-Wc++11-compat', cxx_compiler)
+
+# catches bugs, e.g. "if (c); foo();", few false positives
+add_gcc_warning('-Wempty-body')
+
+# catches return types with qualifiers like const
+add_gcc_warning('-Wignored-qualifiers')
+
+# function declaration hides virtual function from base class
+add_gcc_warning('-Woverloaded-virtual', cxx_compiler)
+
+# catches pointer arithmetic using NULL or sizeof(void)
+add_gcc_warning('-Wpointer-arith')
+
+# catches comparing signed/unsigned ints
+add_gcc_warning('-Wsign-compare')
+
+# catches overflow bugs, few false positives
+add_gcc_warning('-Wtype-limits')
+
+# catches some dead code
+add_gcc_warning('-Wunreachable-code')
+
+# catches treating string literals as non-const
+add_gcc_warning('-Wwrite-strings', cxx_compiler)
+
+# turned on by -Wall, but we use offsetof on non-POD types frequently
+add_gcc_warning('-Wno-invalid-offsetof', cxx_compiler)
+
+# catches objects passed by value to variadic functions.
+check_and_add_gcc_warning('-Wclass-varargs')
+
+# catches issues around loops
+check_and_add_gcc_warning('-Wloop-analysis')
+
+# catches C++ version forward-compat issues
+check_and_add_gcc_warning('-Wc++11-compat-pedantic', cxx_compiler)
+check_and_add_gcc_warning('-Wc++14-compat', cxx_compiler)
+check_and_add_gcc_warning('-Wc++14-compat-pedantic', cxx_compiler)
+check_and_add_gcc_warning('-Wc++1z-compat', cxx_compiler)
+
+# catches unintentional switch case fallthroughs
+check_and_add_gcc_warning('-Wimplicit-fallthrough', cxx_compiler)
+
+# catches expressions used as a null pointer constant
+# XXX: at the time of writing, the version of clang used on the OS X test
+# machines has a bug that causes it to reject some valid files if both
+# -Wnon-literal-null-conversion and -Wsometimes-uninitialized are
+# specified. We work around this by instead using
+# -Werror=non-literal-null-conversion, but we only do that when
+# --enable-warnings-as-errors is specified so that no unexpected fatal
+# warnings are produced.
+check_and_add_gcc_warning('-Werror=non-literal-null-conversion',
+                          when='--enable-warnings-as-errors')
+
+# catches string literals used in boolean expressions
+check_and_add_gcc_warning('-Wstring-conversion')
+
+# catches inconsistent use of mutexes
+check_and_add_gcc_warning('-Wthread-safety')
+
+# we inline 'new' and 'delete' in mozalloc
+check_and_add_gcc_warning('-Wno-inline-new-delete', cxx_compiler)
+
+# Prevent the following GCC warnings from being treated as errors:
+# too many false positives
+check_and_add_gcc_warning('-Wno-error=maybe-uninitialized')
+
+# we don't want our builds held hostage when a platform-specific API
+# becomes deprecated.
+check_and_add_gcc_warning('-Wno-error=deprecated-declarations')
+
+# false positives depending on optimization
+check_and_add_gcc_warning('-Wno-error=array-bounds')
+
+# can't get rid of those PGO warnings
+check_and_add_gcc_warning('-Wno-error=coverage-mismatch', when='MOZ_PGO')
+
+# false positives during PGO
+check_and_add_gcc_warning('-Wno-error=free-nonheap-object', when='MOZ_PGO')
+
+# We use mix of both POSIX and Win32 printf format across the tree, so format
+# warnings are useless on mingw.
+check_and_add_gcc_warning('-Wno-format',
+                          when=depends(target)(lambda t: t.kernel == 'WINNT'))
+
+# Please keep these last in this file
+add_old_configure_assignment('_WARNINGS_CFLAGS', warnings_cflags)
+add_old_configure_assignment('_WARNINGS_CXXFLAGS', warnings_cxxflags)
--- a/config/config.mk
+++ b/config/config.mk
@@ -131,40 +131,37 @@ SLEEP ?= sleep
 TOUCH ?= touch
 
 PYTHON_PATH = $(PYTHON) $(topsrcdir)/config/pythonpath.py
 
 # determine debug-related options
 _DEBUG_ASFLAGS :=
 _DEBUG_CFLAGS :=
 _DEBUG_LDFLAGS :=
-_DEBUG_RUSTFLAGS :=
 
 ifneq (,$(MOZ_DEBUG)$(MOZ_DEBUG_SYMBOLS))
   ifeq ($(AS),$(YASM))
     ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_)
       _DEBUG_ASFLAGS += -g cv8
     else
       ifneq ($(OS_ARCH),Darwin)
         _DEBUG_ASFLAGS += -g dwarf2
       endif
     endif
   else
     _DEBUG_ASFLAGS += $(MOZ_DEBUG_FLAGS)
   endif
   _DEBUG_CFLAGS += $(MOZ_DEBUG_FLAGS)
   _DEBUG_LDFLAGS += $(MOZ_DEBUG_LDFLAGS)
-  _DEBUG_RUSTFLAGS += -g
 endif
 
 ASFLAGS += $(_DEBUG_ASFLAGS)
 OS_CFLAGS += $(_DEBUG_CFLAGS)
 OS_CXXFLAGS += $(_DEBUG_CFLAGS)
 OS_LDFLAGS += $(_DEBUG_LDFLAGS)
-RUSTFLAGS += $(_DEBUG_RUSTFLAGS)
 
 # XXX: What does this? Bug 482434 filed for better explanation.
 ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_)
 ifndef MOZ_DEBUG
 
 # MOZ_DEBUG_SYMBOLS generates debug symbols in separate PDB files.
 # Used for generating an optimized build with debugging symbols.
 # Used in the Windows nightlies to generate symbols for crash reporting.
@@ -284,17 +281,16 @@ else
 CFLAGS		+= $(MOZ_OPTIMIZE_FLAGS)
 CXXFLAGS	+= $(MOZ_OPTIMIZE_FLAGS)
 endif # neq (,$(MOZ_PROFILE_GENERATE)$(MOZ_PROFILE_USE))
 else
 CFLAGS		+= $(MOZ_OPTIMIZE_FLAGS)
 CXXFLAGS	+= $(MOZ_OPTIMIZE_FLAGS)
 endif # MOZ_OPTIMIZE == 1
 LDFLAGS		+= $(MOZ_OPTIMIZE_LDFLAGS)
-RUSTFLAGS	+= $(MOZ_OPTIMIZE_RUSTFLAGS)
 endif # MOZ_OPTIMIZE
 
 HOST_CFLAGS	+= $(_DEPEND_CFLAGS)
 HOST_CXXFLAGS	+= $(_DEPEND_CFLAGS)
 ifdef CROSS_COMPILE
 HOST_CFLAGS	+= $(HOST_OPTIMIZE_FLAGS)
 else
 ifdef MOZ_OPTIMIZE
--- a/devtools/client/debugger/new/bundle.js
+++ b/devtools/client/debugger/new/bundle.js
@@ -1,8 +1,10 @@
+// Generated from: b918892ece90180a8826e80796dcf7e78c36c0e8 make prefs bail if it can't access localStorage (fixes Firefox bundle)
+
 var Debugger =
 /******/ (function(modules) { // webpackBootstrap
 /******/ 	// The module cache
 /******/ 	var installedModules = {};
 /******/
 /******/ 	// The require function
 /******/ 	function __webpack_require__(moduleId) {
 /******/
@@ -90,39 +92,43 @@ var Debugger =
 	
 	var _require5 = __webpack_require__(245);
 	
 	var getClient = _require5.getClient;
 	var connectClients = _require5.connectClients;
 	var startDebugging = _require5.startDebugging;
 	
 	var firefox = __webpack_require__(247);
-	var configureStore = __webpack_require__(327);
-	var reducers = __webpack_require__(335);
-	
-	var Tabs = __webpack_require__(346);
-	var App = __webpack_require__(358);
+	var configureStore = __webpack_require__(328);
+	var reducers = __webpack_require__(336);
+	
+	var Tabs = __webpack_require__(347);
+	var App = __webpack_require__(359);
 	
 	var createStore = configureStore({
 	  log: false,
 	  makeThunkArgs: (args, state) => {
 	    return Object.assign({}, args, { client: getClient(state) });
 	  }
 	});
 	
 	var store = createStore(combineReducers(reducers));
-	var actions = bindActionCreators(__webpack_require__(359), store.dispatch);
+	var actions = bindActionCreators(__webpack_require__(360), store.dispatch);
 	
 	if (isDevelopment()) {
 	  AppConstants.DEBUG_JS_MODULES = true;
 	  injectGlobals({ store });
 	}
 	
-	window.store = store;
-	window.actions = actions;
+	// Expose the bound actions so external things can do things like
+	// selecting a source.
+	window.actions = {
+	  selectSource: actions.selectSource,
+	  selectSourceURL: actions.selectSourceURL
+	};
 	
 	function renderRoot(component) {
 	  var mount = document.querySelector("#mount");
 	
 	  // bail in test environments that do not have a mount
 	  if (!mount) {
 	    return;
 	  }
@@ -29028,17 +29034,17 @@ var Debugger =
 
 	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 	
 	var _require = __webpack_require__(246);
 	
 	var Task = _require.Task;
 	
 	var firefox = __webpack_require__(247);
-	var chrome = __webpack_require__(320);
+	var chrome = __webpack_require__(321);
 	
 	var _require2 = __webpack_require__(195);
 	
 	var debugGlobal = _require2.debugGlobal;
 	
 	
 	var clientType = void 0;
 	function getClient() {
@@ -29156,36 +29162,36 @@ var Debugger =
 	var DebuggerClient = _require.DebuggerClient;
 	
 	var _require2 = __webpack_require__(254);
 	
 	var DebuggerTransport = _require2.DebuggerTransport;
 	
 	var WebSocketDebuggerTransport = __webpack_require__(259);
 	
-	var _require3 = __webpack_require__(260);
+	var _require3 = __webpack_require__(262);
 	
 	var TargetFactory = _require3.TargetFactory;
 	
 	var defer = __webpack_require__(261);
 	
 	var _require4 = __webpack_require__(196);
 	
 	var getValue = _require4.getValue;
 	
-	var _require5 = __webpack_require__(262);
+	var _require5 = __webpack_require__(263);
 	
 	var Tab = _require5.Tab;
 	
-	var _require6 = __webpack_require__(318);
+	var _require6 = __webpack_require__(319);
 	
 	var setupCommands = _require6.setupCommands;
 	var clientCommands = _require6.clientCommands;
 	
-	var _require7 = __webpack_require__(319);
+	var _require7 = __webpack_require__(320);
 	
 	var setupEvents = _require7.setupEvents;
 	var clientEvents = _require7.clientEvents;
 	
 	
 	var debuggerClient = null;
 	var threadClient = null;
 	var tabTarget = null;
@@ -29236,17 +29242,17 @@ var Debugger =
 	
 	  // TODO: the timeout logic should be moved to DebuggerClient.connect.
 	  setTimeout(() => {
 	    if (isConnected) {
 	      return;
 	    }
 	
 	    deferred.resolve([]);
-	  }, 1000);
+	  }, 6000);
 	
 	  debuggerClient.connect().then(() => {
 	    isConnected = true;
 	    return debuggerClient.listTabs().then(response => {
 	      deferred.resolve(createTabs(response.tabs));
 	    });
 	  }).catch(err => {
 	    console.log(err);
@@ -29276,23 +29282,33 @@ var Debugger =
 	function initPage(actions) {
 	  tabTarget = getTabTarget();
 	  threadClient = getThreadClient();
 	
 	  setupCommands({ threadClient, tabTarget });
 	
 	  tabTarget.on("will-navigate", actions.willNavigate);
 	  tabTarget.on("navigate", actions.navigate);
+	  tabTarget.on("frame-update", function (_, packet) {
+	    if (packet.destroyAll) {
+	      actions.willNavigate();
+	    }
+	  });
 	
 	  // Listen to all the requested events.
 	  setupEvents({ threadClient, actions });
 	  Object.keys(clientEvents).forEach(eventName => {
 	    threadClient.addListener(eventName, clientEvents[eventName]);
 	  });
 	
+	  threadClient.reconfigure({
+	    "useSourceMaps": false,
+	    "autoBlackBox": false
+	  });
+	
 	  // In Firefox, we need to initially request all of the sources which
 	  // makes the server iterate over them and fire individual
 	  // `newSource` notifications. We don't need to do anything with the
 	  // response since `newSource` notifications are fired.
 	  threadClient.getSources();
 	}
 	
 	module.exports = {
@@ -35593,67 +35609,258 @@ var Debugger =
 /***/ 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/. */
 	
 	"use strict";
 	
-	const EventEmitter = __webpack_require__(253);
+	const EventEmitter = __webpack_require__(260);
 	
 	function WebSocketDebuggerTransport(socket) {
 	  EventEmitter.decorate(this);
 	
-	  this._ws = socket;
-	
 	  this.active = false;
 	  this.hooks = null;
+	  this.socket = socket;
 	}
 	
 	WebSocketDebuggerTransport.prototype = {
 	  ready() {
-	    if (!this.active) {
-	      this.active = true;
-	      this._ws.onmessage = this._onMessage.bind(this);
-	    }
+	    if (this.active) {
+	      return;
+	    }
+	
+	    this.socket.addEventListener("message", this);
+	    this.socket.addEventListener("close", this);
+	
+	    this.active = true;
 	  },
 	
 	  send(object) {
 	    this.emit("send", object);
-	    this._ws.send(JSON.stringify(object));
-	  },
-	
-	  _onMessage(event) {
-	    let object = JSON.parse(event.data);
+	    if (this.socket) {
+	      this.socket.send(JSON.stringify(object));
+	    }
+	  },
+	
+	  startBulkSend() {
+	    throw new Error("Bulk send is not supported by WebSocket transport");
+	  },
+	
+	  close() {
+	    this.emit("onClosed");
+	    this.active = false;
+	
+	    this.socket.removeEventListener("message", this);
+	    this.socket.removeEventListener("close", this);
+	    this.socket.close();
+	    this.socket = null;
+	
+	    if (this.hooks) {
+	      this.hooks.onClosed();
+	      this.hooks = null;
+	    }
+	  },
+	
+	  handleEvent(event) {
+	    switch (event.type) {
+	      case "message":
+	        this.onMessage(event);
+	        break;
+	      case "close":
+	        this.close();
+	        break;
+	    }
+	  },
+	
+	  onMessage({ data }) {
+	    if (typeof data !== "string") {
+	      throw new Error("Binary messages are not supported by WebSocket transport");
+	    }
+	
+	    let object = JSON.parse(data);
 	    this.emit("onPacket", object);
 	    if (this.hooks) {
 	      this.hooks.onPacket(object);
 	    }
 	  },
-	
-	  close(reason) {
-	    this.emit("onClosed", reason);
-	
-	    this.active = false;
-	    this._ws.close();
-	    if (this.hooks) {
-	      this.hooks.onClosed(reason);
-	      this.hooks = null;
-	    }
-	  },
 	};
 	
 	module.exports = WebSocketDebuggerTransport;
 
 
 /***/ },
 /* 260 */
 /***/ function(module, exports, __webpack_require__) {
 
+	var EventEmitter = function () {};
+	
+	var defer = __webpack_require__(261);
+	
+	/**
+	 * Decorate an object with event emitter functionality.
+	 *
+	 * @param Object objectToDecorate
+	 *        Bind all public methods of EventEmitter to
+	 *        the objectToDecorate object.
+	 */
+	EventEmitter.decorate = function (objectToDecorate) {
+	  var emitter = new EventEmitter();
+	  objectToDecorate.on = emitter.on.bind(emitter);
+	  objectToDecorate.off = emitter.off.bind(emitter);
+	  objectToDecorate.once = emitter.once.bind(emitter);
+	  objectToDecorate.emit = emitter.emit.bind(emitter);
+	};
+	
+	EventEmitter.prototype = {
+	  /**
+	   * Connect a listener.
+	   *
+	   * @param string event
+	   *        The event name to which we're connecting.
+	   * @param function listener
+	   *        Called when the event is fired.
+	   */
+	  on(event, listener) {
+	    if (!this._eventEmitterListeners) {
+	      this._eventEmitterListeners = new Map();
+	    }
+	    if (!this._eventEmitterListeners.has(event)) {
+	      this._eventEmitterListeners.set(event, []);
+	    }
+	    this._eventEmitterListeners.get(event).push(listener);
+	  },
+	
+	  /**
+	   * Listen for the next time an event is fired.
+	   *
+	   * @param string event
+	   *        The event name to which we're connecting.
+	   * @param function listener
+	   *        (Optional) Called when the event is fired. Will be called at most
+	   *        one time.
+	   * @return promise
+	   *        A promise which is resolved when the event next happens. The
+	   *        resolution value of the promise is the first event argument. If
+	   *        you need access to second or subsequent event arguments (it's rare
+	   *        that this is needed) then use listener
+	   */
+	  once(event, listener) {
+	    var _this = this;
+	
+	    var deferred = defer();
+	
+	    var handler = function (_, first) {
+	      for (var _len = arguments.length, rest = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
+	        rest[_key - 2] = arguments[_key];
+	      }
+	
+	      _this.off(event, handler);
+	      if (listener) {
+	        listener.apply(null, [event, first].concat(rest));
+	      }
+	      deferred.resolve(first);
+	    };
+	
+	    handler._originalListener = listener;
+	    this.on(event, handler);
+	
+	    return deferred.promise;
+	  },
+	
+	  /**
+	   * Remove a previously-registered event listener.  Works for events
+	   * registered with either on or once.
+	   *
+	   * @param string event
+	   *        The event name whose listener we're disconnecting.
+	   * @param function listener
+	   *        The listener to remove.
+	   */
+	  off(event, listener) {
+	    if (!this._eventEmitterListeners) {
+	      return;
+	    }
+	    var listeners = this._eventEmitterListeners.get(event);
+	    if (listeners) {
+	      this._eventEmitterListeners.set(event, listeners.filter(l => {
+	        return l !== listener && l._originalListener !== listener;
+	      }));
+	    }
+	  },
+	
+	  /**
+	   * Emit an event.  All arguments to this method will
+	   * be sent to listener functions.
+	   */
+	  emit(event) {
+	    var _this2 = this,
+	        _arguments = arguments;
+	
+	    if (!this._eventEmitterListeners || !this._eventEmitterListeners.has(event)) {
+	      return;
+	    }
+	
+	    var originalListeners = this._eventEmitterListeners.get(event);
+	
+	    var _loop = function (listener) {
+	      // If the object was destroyed during event emission, stop
+	      // emitting.
+	      if (!_this2._eventEmitterListeners) {
+	        return "break";
+	      }
+	
+	      // If listeners were removed during emission, make sure the
+	      // event handler we're going to fire wasn't removed.
+	      if (originalListeners === _this2._eventEmitterListeners.get(event) || _this2._eventEmitterListeners.get(event).some(l => l === listener)) {
+	        try {
+	          listener.apply(null, _arguments);
+	        } catch (ex) {
+	          // Prevent a bad listener from interfering with the others.
+	          var msg = ex + ": " + ex.stack;
+	          console.error(msg);
+	          dump(msg + "\n");
+	        }
+	      }
+	    };
+	
+	    for (var listener of this._eventEmitterListeners.get(event)) {
+	      var _ret = _loop(listener);
+	
+	      if (_ret === "break") break;
+	    }
+	  }
+	};
+	
+	module.exports = EventEmitter;
+
+/***/ },
+/* 261 */
+/***/ function(module, exports) {
+
+	module.exports = function defer() {
+	  var resolve = void 0,
+	      reject = void 0;
+	  var promise = new Promise(function () {
+	    resolve = arguments[0];
+	    reject = arguments[1];
+	  });
+	  return {
+	    resolve: resolve,
+	    reject: reject,
+	    promise: promise
+	  };
+	};
+
+/***/ },
+/* 262 */
+/***/ 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/. */
 	
 	"use strict";
 	
 	const { Ci, Cu } = __webpack_require__(178);
 	const promise = __webpack_require__(189);
@@ -36337,38 +36544,20 @@ var Debugger =
 	
 	  makeRemote: function () {
 	    return Promise.resolve();
 	  }
 	};
 
 
 /***/ },
-/* 261 */
-/***/ function(module, exports) {
-
-	module.exports = function defer() {
-	  var resolve = void 0,
-	      reject = void 0;
-	  var promise = new Promise(function () {
-	    resolve = arguments[0];
-	    reject = arguments[1];
-	  });
-	  return {
-	    resolve: resolve,
-	    reject: reject,
-	    promise: promise
-	  };
-	};
-
-/***/ },
-/* 262 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var t = __webpack_require__(263);
+/* 263 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var t = __webpack_require__(264);
 	
 	var Tab = t.struct({
 	  title: t.String,
 	  url: t.String,
 	  id: t.String,
 	  tab: t.Object,
 	  browser: t.enums.of(["chrome", "firefox"])
 	}, "Tab");
@@ -36417,97 +36606,97 @@ var Debugger =
 	  SourceText,
 	  Location,
 	  Breakpoint,
 	  BreakpointResult,
 	  Frame
 	};
 
 /***/ },
-/* 263 */
+/* 264 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/*! @preserve
 	 *
 	 * tcomb.js - Type checking and DDD for JavaScript
 	 *
 	 * The MIT License (MIT)
 	 *
 	 * Copyright (c) 2014-2016 Giulio Canti
 	 *
 	 */
 	
 	// core
-	var t = __webpack_require__(264);
+	var t = __webpack_require__(265);
 	
 	// types
-	t.Any = __webpack_require__(270);
-	t.Array = __webpack_require__(278);
-	t.Boolean = __webpack_require__(279);
-	t.Date = __webpack_require__(281);
-	t.Error = __webpack_require__(282);
-	t.Function = __webpack_require__(283);
-	t.Nil = __webpack_require__(284);
-	t.Number = __webpack_require__(285);
-	t.Integer = __webpack_require__(287);
+	t.Any = __webpack_require__(271);
+	t.Array = __webpack_require__(279);
+	t.Boolean = __webpack_require__(280);
+	t.Date = __webpack_require__(282);
+	t.Error = __webpack_require__(283);
+	t.Function = __webpack_require__(284);
+	t.Nil = __webpack_require__(285);
+	t.Number = __webpack_require__(286);
+	t.Integer = __webpack_require__(288);
 	t.IntegerT = t.Integer;
-	t.Object = __webpack_require__(293);
-	t.RegExp = __webpack_require__(294);
-	t.String = __webpack_require__(295);
-	t.Type = __webpack_require__(296);
+	t.Object = __webpack_require__(294);
+	t.RegExp = __webpack_require__(295);
+	t.String = __webpack_require__(296);
+	t.Type = __webpack_require__(297);
 	t.TypeT = t.Type;
 	
 	// short alias are deprecated
 	t.Arr = t.Array;
 	t.Bool = t.Boolean;
 	t.Dat = t.Date;
 	t.Err = t.Error;
 	t.Func = t.Function;
 	t.Num = t.Number;
 	t.Obj = t.Object;
 	t.Re = t.RegExp;
 	t.Str = t.String;
 	
 	// combinators
-	t.dict = __webpack_require__(297);
-	t.declare = __webpack_require__(298);
-	t.enums = __webpack_require__(300);
-	t.irreducible = __webpack_require__(271);
-	t.list = __webpack_require__(301);
-	t.maybe = __webpack_require__(302);
-	t.refinement = __webpack_require__(288);
-	t.struct = __webpack_require__(304);
-	t.tuple = __webpack_require__(310);
-	t.union = __webpack_require__(311);
-	t.func = __webpack_require__(313);
-	t.intersection = __webpack_require__(314);
+	t.dict = __webpack_require__(298);
+	t.declare = __webpack_require__(299);
+	t.enums = __webpack_require__(301);
+	t.irreducible = __webpack_require__(272);
+	t.list = __webpack_require__(302);
+	t.maybe = __webpack_require__(303);
+	t.refinement = __webpack_require__(289);
+	t.struct = __webpack_require__(305);
+	t.tuple = __webpack_require__(311);
+	t.union = __webpack_require__(312);
+	t.func = __webpack_require__(314);
+	t.intersection = __webpack_require__(315);
 	t.subtype = t.refinement;
-	t.inter = __webpack_require__(315); // IE8 alias
+	t.inter = __webpack_require__(316); // IE8 alias
 	t['interface'] = t.inter;
 	
 	// functions
 	t.assert = t;
-	t.update = __webpack_require__(316);
-	t.mixin = __webpack_require__(299);
-	t.isType = __webpack_require__(275);
-	t.is = __webpack_require__(292);
-	t.getTypeName = __webpack_require__(274);
-	t.match = __webpack_require__(317);
+	t.update = __webpack_require__(317);
+	t.mixin = __webpack_require__(300);
+	t.isType = __webpack_require__(276);
+	t.is = __webpack_require__(293);
+	t.getTypeName = __webpack_require__(275);
+	t.match = __webpack_require__(318);
 	
 	module.exports = t;
 
 
 /***/ },
-/* 264 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isFunction = __webpack_require__(265);
-	var isNil = __webpack_require__(266);
-	var fail = __webpack_require__(267);
-	var stringify = __webpack_require__(268);
+/* 265 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isFunction = __webpack_require__(266);
+	var isNil = __webpack_require__(267);
+	var fail = __webpack_require__(268);
+	var stringify = __webpack_require__(269);
 	
 	function assert(guard, message) {
 	  if (guard !== true) {
 	    if (isFunction(message)) { // handle lazy messages
 	      message = message();
 	    }
 	    else if (isNil(message)) { // use a default message
 	      message = 'Assert failed (turn on "Pause on exceptions" in your Source panel)';
@@ -36517,44 +36706,44 @@ var Debugger =
 	}
 	
 	assert.fail = fail;
 	assert.stringify = stringify;
 	
 	module.exports = assert;
 
 /***/ },
-/* 265 */
+/* 266 */
 /***/ function(module, exports) {
 
 	module.exports = function isFunction(x) {
 	  return typeof x === 'function';
 	};
 
 /***/ },
-/* 266 */
+/* 267 */
 /***/ function(module, exports) {
 
 	module.exports = function isNil(x) {
 	  return x === null || x === void 0;
 	};
 
 /***/ },
-/* 267 */
+/* 268 */
 /***/ function(module, exports) {
 
 	module.exports = function fail(message) {
 	  throw new TypeError('[tcomb] ' + message);
 	};
 
 /***/ },
-/* 268 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var getFunctionName = __webpack_require__(269);
+/* 269 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var getFunctionName = __webpack_require__(270);
 	
 	function replacer(key, value) {
 	  if (typeof value === 'function') {
 	    return getFunctionName(value);
 	  }
 	  return value;
 	}
 	
@@ -36563,40 +36752,40 @@ var Debugger =
 	    return JSON.stringify(x, replacer, 2);
 	  }
 	  catch (e) {
 	    return String(x);
 	  }
 	};
 
 /***/ },
-/* 269 */
+/* 270 */
 /***/ function(module, exports) {
 
 	module.exports = function getFunctionName(f) {
 	  return f.displayName || f.name || '<function' + f.length + '>';
 	};
 
 /***/ },
-/* 270 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var irreducible = __webpack_require__(271);
+/* 271 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var irreducible = __webpack_require__(272);
 	
 	module.exports = irreducible('Any', function () { return true; });
 
 
 /***/ },
-/* 271 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isString = __webpack_require__(272);
-	var isFunction = __webpack_require__(265);
-	var forbidNewOperator = __webpack_require__(273);
+/* 272 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isString = __webpack_require__(273);
+	var isFunction = __webpack_require__(266);
+	var forbidNewOperator = __webpack_require__(274);
 	
 	module.exports = function irreducible(name, predicate) {
 	
 	  if (false) {
 	    assert(isString(name), function () { return 'Invalid argument name ' + assert.stringify(name) + ' supplied to irreducible(name, predicate) (expected a string)'; });
 	    assert(isFunction(predicate), 'Invalid argument predicate ' + assert.stringify(predicate) + ' supplied to irreducible(name, predicate) (expected a function)');
 	  }
 	
@@ -36622,185 +36811,185 @@ var Debugger =
 	
 	  Irreducible.is = predicate;
 	
 	  return Irreducible;
 	};
 
 
 /***/ },
-/* 272 */
+/* 273 */
 /***/ function(module, exports) {
 
 	module.exports = function isString(x) {
 	  return typeof x === 'string';
 	};
 
 /***/ },
-/* 273 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var getTypeName = __webpack_require__(274);
+/* 274 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var getTypeName = __webpack_require__(275);
 	
 	module.exports = function forbidNewOperator(x, type) {
 	  assert(!(x instanceof type), function () { return 'Cannot use the new operator to instantiate the type ' + getTypeName(type); });
 	};
 
 /***/ },
-/* 274 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
-	var getFunctionName = __webpack_require__(269);
+/* 275 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
+	var getFunctionName = __webpack_require__(270);
 	
 	module.exports = function getTypeName(constructor) {
 	  if (isType(constructor)) {
 	    return constructor.displayName;
 	  }
 	  return getFunctionName(constructor);
 	};
 
 /***/ },
-/* 275 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isFunction = __webpack_require__(265);
-	var isObject = __webpack_require__(276);
+/* 276 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isFunction = __webpack_require__(266);
+	var isObject = __webpack_require__(277);
 	
 	module.exports = function isType(x) {
 	  return isFunction(x) && isObject(x.meta);
 	};
 
 /***/ },
-/* 276 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isNil = __webpack_require__(266);
-	var isArray = __webpack_require__(277);
-	
-	module.exports = function isObject(x) {
-	  return !isNil(x) && typeof x === 'object' && !isArray(x);
-	};
-
-/***/ },
 /* 277 */
-/***/ function(module, exports) {
-
-	module.exports = function isArray(x) {
-	  return x instanceof Array;
+/***/ function(module, exports, __webpack_require__) {
+
+	var isNil = __webpack_require__(267);
+	var isArray = __webpack_require__(278);
+	
+	module.exports = function isObject(x) {
+	  return !isNil(x) && typeof x === 'object' && !isArray(x);
 	};
 
 /***/ },
 /* 278 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var irreducible = __webpack_require__(271);
-	var isArray = __webpack_require__(277);
-	
-	module.exports = irreducible('Array', isArray);
-
+/***/ function(module, exports) {
+
+	module.exports = function isArray(x) {
+	  return x instanceof Array;
+	};
 
 /***/ },
 /* 279 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var irreducible = __webpack_require__(271);
-	var isBoolean = __webpack_require__(280);
-	
-	module.exports = irreducible('Boolean', isBoolean);
+	var irreducible = __webpack_require__(272);
+	var isArray = __webpack_require__(278);
+	
+	module.exports = irreducible('Array', isArray);
 
 
 /***/ },
 /* 280 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var irreducible = __webpack_require__(272);
+	var isBoolean = __webpack_require__(281);
+	
+	module.exports = irreducible('Boolean', isBoolean);
+
+
+/***/ },
+/* 281 */
 /***/ function(module, exports) {
 
 	module.exports = function isBoolean(x) {
 	  return x === true || x === false;
 	};
 
 /***/ },
-/* 281 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var irreducible = __webpack_require__(271);
+/* 282 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var irreducible = __webpack_require__(272);
 	
 	module.exports = irreducible('Date', function (x) { return x instanceof Date; });
 
 
 /***/ },
-/* 282 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var irreducible = __webpack_require__(271);
-	
-	module.exports = irreducible('Error', function (x) { return x instanceof Error; });
-
-
-/***/ },
 /* 283 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var irreducible = __webpack_require__(271);
-	var isFunction = __webpack_require__(265);
-	
-	module.exports = irreducible('Function', isFunction);
+	var irreducible = __webpack_require__(272);
+	
+	module.exports = irreducible('Error', function (x) { return x instanceof Error; });
 
 
 /***/ },
 /* 284 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var irreducible = __webpack_require__(271);
-	var isNil = __webpack_require__(266);
-	
-	module.exports = irreducible('Nil', isNil);
+	var irreducible = __webpack_require__(272);
+	var isFunction = __webpack_require__(266);
+	
+	module.exports = irreducible('Function', isFunction);
 
 
 /***/ },
 /* 285 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var irreducible = __webpack_require__(271);
-	var isNumber = __webpack_require__(286);
-	
-	module.exports = irreducible('Number', isNumber);
+	var irreducible = __webpack_require__(272);
+	var isNil = __webpack_require__(267);
+	
+	module.exports = irreducible('Nil', isNil);
 
 
 /***/ },
 /* 286 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var irreducible = __webpack_require__(272);
+	var isNumber = __webpack_require__(287);
+	
+	module.exports = irreducible('Number', isNumber);
+
+
+/***/ },
+/* 287 */
 /***/ function(module, exports) {
 
 	module.exports = function isNumber(x) {
 	  return typeof x === 'number' && isFinite(x) && !isNaN(x);
 	};
 
 /***/ },
-/* 287 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var refinement = __webpack_require__(288);
-	var Number = __webpack_require__(285);
+/* 288 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var refinement = __webpack_require__(289);
+	var Number = __webpack_require__(286);
 	
 	module.exports = refinement(Number, function (x) { return x % 1 === 0; }, 'Integer');
 
 
 /***/ },
-/* 288 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var forbidNewOperator = __webpack_require__(273);
-	var isIdentity = __webpack_require__(290);
-	var create = __webpack_require__(291);
-	var is = __webpack_require__(292);
-	var getTypeName = __webpack_require__(274);
-	var getFunctionName = __webpack_require__(269);
+/* 289 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var forbidNewOperator = __webpack_require__(274);
+	var isIdentity = __webpack_require__(291);
+	var create = __webpack_require__(292);
+	var is = __webpack_require__(293);
+	var getTypeName = __webpack_require__(275);
+	var getFunctionName = __webpack_require__(270);
 	
 	function getDefaultName(type, predicate) {
 	  return '{' + getTypeName(type) + ' | ' + getFunctionName(predicate) + '}';
 	}
 	
 	function refinement(type, predicate, name) {
 	
 	  if (false) {
@@ -36849,55 +37038,55 @@ var Debugger =
 	  return Refinement;
 	}
 	
 	refinement.getDefaultName = getDefaultName;
 	module.exports = refinement;
 
 
 /***/ },
-/* 289 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isNil = __webpack_require__(266);
-	var isString = __webpack_require__(272);
+/* 290 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isNil = __webpack_require__(267);
+	var isString = __webpack_require__(273);
 	
 	module.exports = function isTypeName(name) {
 	  return isNil(name) || isString(name);
 	};
 
 /***/ },
-/* 290 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var Boolean = __webpack_require__(279);
-	var isType = __webpack_require__(275);
-	var getTypeName = __webpack_require__(274);
+/* 291 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var Boolean = __webpack_require__(280);
+	var isType = __webpack_require__(276);
+	var getTypeName = __webpack_require__(275);
 	
 	// return true if the type constructor behaves like the identity function
 	module.exports = function isIdentity(type) {
 	  if (isType(type)) {
 	    if (false) {
 	      assert(Boolean.is(type.meta.identity), function () { return 'Invalid meta identity ' + assert.stringify(type.meta.identity) + ' supplied to type ' + getTypeName(type); });
 	    }
 	    return type.meta.identity;
 	  }
 	  // for tcomb the other constructors, like ES6 classes, are identity-like
 	  return true;
 	};
 
 /***/ },
-/* 291 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
-	var getFunctionName = __webpack_require__(269);
-	var assert = __webpack_require__(264);
-	var stringify = __webpack_require__(268);
+/* 292 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
+	var getFunctionName = __webpack_require__(270);
+	var assert = __webpack_require__(265);
+	var stringify = __webpack_require__(269);
 	
 	// creates an instance of a type, handling the optional new operator
 	module.exports = function create(type, value, path) {
 	  if (isType(type)) {
 	    // for structs the new operator is allowed
 	    return type.meta.kind === 'struct' ? new type(value, path) : type(value, path);
 	  }
 	
@@ -36906,80 +37095,80 @@ var Debugger =
 	    path = path || [getFunctionName(type)];
 	    assert(value instanceof type, function () { return 'Invalid value ' + stringify(value) + ' supplied to ' + path.join('/'); });
 	  }
 	
 	  return value;
 	};
 
 /***/ },
-/* 292 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
+/* 293 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
 	
 	// returns true if x is an instance of type
 	module.exports = function is(x, type) {
 	  if (isType(type)) {
 	    return type.is(x);
 	  }
 	  return x instanceof type; // type should be a class constructor
 	};
 
 
 /***/ },
-/* 293 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var irreducible = __webpack_require__(271);
-	var isObject = __webpack_require__(276);
+/* 294 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var irreducible = __webpack_require__(272);
+	var isObject = __webpack_require__(277);
 	
 	module.exports = irreducible('Object', isObject);
 
 
 /***/ },
-/* 294 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var irreducible = __webpack_require__(271);
-	
-	module.exports = irreducible('RegExp', function (x) { return x instanceof RegExp; });
-
-
-/***/ },
 /* 295 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var irreducible = __webpack_require__(271);
-	var isString = __webpack_require__(272);
-	
-	module.exports = irreducible('String', isString);
+	var irreducible = __webpack_require__(272);
+	
+	module.exports = irreducible('RegExp', function (x) { return x instanceof RegExp; });
 
 
 /***/ },
 /* 296 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var irreducible = __webpack_require__(271);
-	var isType = __webpack_require__(275);
-	
-	module.exports = irreducible('Type', isType);
+	var irreducible = __webpack_require__(272);
+	var isString = __webpack_require__(273);
+	
+	module.exports = irreducible('String', isString);
+
 
 /***/ },
 /* 297 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var getTypeName = __webpack_require__(274);
-	var isIdentity = __webpack_require__(290);
-	var isObject = __webpack_require__(276);
-	var create = __webpack_require__(291);
-	var is = __webpack_require__(292);
+	var irreducible = __webpack_require__(272);
+	var isType = __webpack_require__(276);
+	
+	module.exports = irreducible('Type', isType);
+
+/***/ },
+/* 298 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var getTypeName = __webpack_require__(275);
+	var isIdentity = __webpack_require__(291);
+	var isObject = __webpack_require__(277);
+	var create = __webpack_require__(292);
+	var is = __webpack_require__(293);
 	
 	function getDefaultName(domain, codomain) {
 	  return '{[key: ' + getTypeName(domain) + ']: ' + getTypeName(codomain) + '}';
 	}
 	
 	function dict(domain, codomain, name) {
 	
 	  if (false) {
@@ -37060,25 +37249,25 @@ var Debugger =
 	  return Dict;
 	}
 	
 	dict.getDefaultName = getDefaultName;
 	module.exports = dict;
 
 
 /***/ },
-/* 298 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isType = __webpack_require__(275);
-	var isNil = __webpack_require__(266);
-	var mixin = __webpack_require__(299);
-	var getTypeName = __webpack_require__(274);
+/* 299 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isType = __webpack_require__(276);
+	var isNil = __webpack_require__(267);
+	var mixin = __webpack_require__(300);
+	var getTypeName = __webpack_require__(275);
 	
 	// All the .declare-d types should be clearly different from each other thus they should have
 	// different names when a name was not explicitly provided.
 	var nextDeclareUniqueId = 1;
 	
 	module.exports = function declare(name) {
 	  if (false) {
 	    assert(isTypeName(name), function () { return 'Invalid argument name ' + name + ' supplied to declare([name]) (expected a string)'; });
@@ -37116,21 +37305,21 @@ var Debugger =
 	  // in general I can't say if this type will be an identity, for safety setting to false
 	  Declare.meta = { identity: false };
 	  Declare.prototype = null;
 	  return Declare;
 	};
 
 
 /***/ },
-/* 299 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isNil = __webpack_require__(266);
-	var assert = __webpack_require__(264);
+/* 300 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isNil = __webpack_require__(267);
+	var assert = __webpack_require__(265);
 	
 	// safe mixin, cannot override props unless specified
 	module.exports = function mixin(target, source, overwrite) {
 	  if (isNil(source)) { return target; }
 	  for (var k in source) {
 	    if (source.hasOwnProperty(k)) {
 	      if (overwrite !== true) {
 	        if (false) {
@@ -37139,24 +37328,24 @@ var Debugger =
 	      }
 	      target[k] = source[k];
 	    }
 	  }
 	  return target;
 	};
 
 /***/ },
-/* 300 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var forbidNewOperator = __webpack_require__(273);
-	var isString = __webpack_require__(272);
-	var isObject = __webpack_require__(276);
+/* 301 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var forbidNewOperator = __webpack_require__(274);
+	var isString = __webpack_require__(273);
+	var isObject = __webpack_require__(277);
 	
 	function getDefaultName(map) {
 	  return Object.keys(map).map(function (k) { return assert.stringify(k); }).join(' | ');
 	}
 	
 	function enums(map, name) {
 	
 	  if (false) {
@@ -37203,27 +37392,27 @@ var Debugger =
 	};
 	
 	enums.getDefaultName = getDefaultName;
 	module.exports = enums;
 	
 
 
 /***/ },
-/* 301 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var getTypeName = __webpack_require__(274);
-	var isIdentity = __webpack_require__(290);
-	var create = __webpack_require__(291);
-	var is = __webpack_require__(292);
-	var isArray = __webpack_require__(277);
+/* 302 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var getTypeName = __webpack_require__(275);
+	var isIdentity = __webpack_require__(291);
+	var create = __webpack_require__(292);
+	var is = __webpack_require__(293);
+	var isArray = __webpack_require__(278);
 	
 	function getDefaultName(type) {
 	  return 'Array<' + getTypeName(type) + '>';
 	}
 	
 	function list(type, name) {
 	
 	  if (false) {
@@ -37290,30 +37479,30 @@ var Debugger =
 	  return List;
 	}
 	
 	list.getDefaultName = getDefaultName;
 	module.exports = list;
 
 
 /***/ },
-/* 302 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var isMaybe = __webpack_require__(303);
-	var isIdentity = __webpack_require__(290);
-	var Any = __webpack_require__(270);
-	var create = __webpack_require__(291);
-	var Nil = __webpack_require__(284);
-	var forbidNewOperator = __webpack_require__(273);
-	var is = __webpack_require__(292);
-	var getTypeName = __webpack_require__(274);
+/* 303 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var isMaybe = __webpack_require__(304);
+	var isIdentity = __webpack_require__(291);
+	var Any = __webpack_require__(271);
+	var create = __webpack_require__(292);
+	var Nil = __webpack_require__(285);
+	var forbidNewOperator = __webpack_require__(274);
+	var is = __webpack_require__(293);
+	var getTypeName = __webpack_require__(275);
 	
 	function getDefaultName(type) {
 	  return '?' + getTypeName(type);
 	}
 	
 	function maybe(type, name) {
 	
 	  if (isMaybe(type) || type === Any || type === Nil) { // makes the combinator idempotent and handle Any, Nil
@@ -37350,41 +37539,41 @@ var Debugger =
 	  return Maybe;
 	}
 	
 	maybe.getDefaultName = getDefaultName;
 	module.exports = maybe;
 
 
 /***/ },
-/* 303 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
+/* 304 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
 	
 	module.exports = function isMaybe(x) {
 	  return isType(x) && ( x.meta.kind === 'maybe' );
 	};
 
 /***/ },
-/* 304 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var String = __webpack_require__(295);
-	var Function = __webpack_require__(283);
-	var isBoolean = __webpack_require__(280);
-	var isObject = __webpack_require__(276);
-	var isNil = __webpack_require__(266);
-	var create = __webpack_require__(291);
-	var getTypeName = __webpack_require__(274);
-	var dict = __webpack_require__(297);
-	var getDefaultInterfaceName = __webpack_require__(305);
-	var extend = __webpack_require__(306);
+/* 305 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var String = __webpack_require__(296);
+	var Function = __webpack_require__(284);
+	var isBoolean = __webpack_require__(281);
+	var isObject = __webpack_require__(277);
+	var isNil = __webpack_require__(267);
+	var create = __webpack_require__(292);
+	var getTypeName = __webpack_require__(275);
+	var dict = __webpack_require__(298);
+	var getDefaultInterfaceName = __webpack_require__(306);
+	var extend = __webpack_require__(307);
 	
 	function getDefaultName(props) {
 	  return 'Struct' + getDefaultInterfaceName(props);
 	}
 	
 	function extendStruct(mixins, name) {
 	  return extend(struct, mixins, name);
 	}
@@ -37488,43 +37677,43 @@ var Debugger =
 	struct.strict = false;
 	struct.getOptions = getOptions;
 	struct.getDefaultName = getDefaultName;
 	struct.extend = extendStruct;
 	module.exports = struct;
 
 
 /***/ },
-/* 305 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var getTypeName = __webpack_require__(274);
+/* 306 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var getTypeName = __webpack_require__(275);
 	
 	function getDefaultInterfaceName(props) {
 	  return '{' + Object.keys(props).map(function (prop) {
 	    return prop + ': ' + getTypeName(props[prop]);
 	  }).join(', ') + '}';
 	}
 	
 	module.exports = getDefaultInterfaceName;
 
 
 /***/ },
-/* 306 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isFunction = __webpack_require__(265);
-	var isArray = __webpack_require__(277);
-	var mixin = __webpack_require__(299);
-	var isStruct = __webpack_require__(307);
-	var isInterface = __webpack_require__(308);
-	var isObject = __webpack_require__(276);
-	var refinement = __webpack_require__(288);
-	var decompose = __webpack_require__(309);
+/* 307 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isFunction = __webpack_require__(266);
+	var isArray = __webpack_require__(278);
+	var mixin = __webpack_require__(300);
+	var isStruct = __webpack_require__(308);
+	var isInterface = __webpack_require__(309);
+	var isObject = __webpack_require__(277);
+	var refinement = __webpack_require__(289);
+	var decompose = __webpack_require__(310);
 	
 	function compose(predicates, unrefinedType) {
 	  return predicates.reduce(function (type, predicate) {
 	    return refinement(type, predicate);
 	  }, unrefinedType);
 	}
 	
 	function getProps(type) {
@@ -37564,40 +37753,40 @@ var Debugger =
 	  var result = compose(predicates, combinator(props, options));
 	  mixin(result.prototype, prototype);
 	  return result;
 	}
 	
 	module.exports = extend;
 
 /***/ },
-/* 307 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
+/* 308 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
 	
 	module.exports = function isStruct(x) {
 	  return isType(x) && ( x.meta.kind === 'struct' );
 	};
 
 /***/ },
-/* 308 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
-	
-	module.exports = function isInterface(x) {
-	  return isType(x) && ( x.meta.kind === 'interface' );
-	};
-
-/***/ },
 /* 309 */
 /***/ function(module, exports, __webpack_require__) {
 
-	var isType = __webpack_require__(275);
+	var isType = __webpack_require__(276);
+	
+	module.exports = function isInterface(x) {
+	  return isType(x) && ( x.meta.kind === 'interface' );
+	};
+
+/***/ },
+/* 310 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
 	
 	function isRefinement(type) {
 	  return isType(type) && type.meta.kind === 'subtype';
 	}
 	
 	function getPredicates(type) {
 	  return isRefinement(type) ?
 	    [type.meta.predicate].concat(getPredicates(type.meta.type)) :
@@ -37615,27 +37804,27 @@ var Debugger =
 	    predicates: getPredicates(type),
 	    unrefinedType: getUnrefinedType(type)
 	  };
 	}
 	
 	module.exports = decompose;
 
 /***/ },
-/* 310 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var getTypeName = __webpack_require__(274);
-	var isIdentity = __webpack_require__(290);
-	var isArray = __webpack_require__(277);
-	var create = __webpack_require__(291);
-	var is = __webpack_require__(292);
+/* 311 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var getTypeName = __webpack_require__(275);
+	var isIdentity = __webpack_require__(291);
+	var isArray = __webpack_require__(278);
+	var create = __webpack_require__(292);
+	var is = __webpack_require__(293);
 	
 	function getDefaultName(types) {
 	  return '[' + types.map(getTypeName).join(', ') + ']';
 	}
 	
 	function tuple(types, name) {
 	
 	  if (false) {
@@ -37703,31 +37892,31 @@ var Debugger =
 	
 	  return Tuple;
 	}
 	
 	tuple.getDefaultName = getDefaultName;
 	module.exports = tuple;
 
 /***/ },
-/* 311 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var getTypeName = __webpack_require__(274);
-	var isIdentity = __webpack_require__(290);
-	var isArray = __webpack_require__(277);
-	var create = __webpack_require__(291);
-	var is = __webpack_require__(292);
-	var forbidNewOperator = __webpack_require__(273);
-	var isType = __webpack_require__(275);
-	var isUnion = __webpack_require__(312);
-	var isNil = __webpack_require__(266);
+/* 312 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var getTypeName = __webpack_require__(275);
+	var isIdentity = __webpack_require__(291);
+	var isArray = __webpack_require__(278);
+	var create = __webpack_require__(292);
+	var is = __webpack_require__(293);
+	var forbidNewOperator = __webpack_require__(274);
+	var isType = __webpack_require__(276);
+	var isUnion = __webpack_require__(313);
+	var isNil = __webpack_require__(267);
 	
 	function getDefaultName(types) {
 	  return types.map(getTypeName).join(' | ');
 	}
 	
 	function union(types, name) {
 	
 	  if (false) {
@@ -37799,42 +37988,42 @@ var Debugger =
 	}
 	
 	union.getDefaultName = getDefaultName;
 	module.exports = union;
 	
 
 
 /***/ },
-/* 312 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var isType = __webpack_require__(275);
+/* 313 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var isType = __webpack_require__(276);
 	
 	module.exports = function isUnion(x) {
 	  return isType(x) && ( x.meta.kind === 'union' );
 	};
 
 /***/ },
-/* 313 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var FunctionType = __webpack_require__(283);
-	var isArray = __webpack_require__(277);
-	var list = __webpack_require__(301);
-	var isObject = __webpack_require__(276);
-	var create = __webpack_require__(291);
-	var isNil = __webpack_require__(266);
-	var isBoolean = __webpack_require__(280);
-	var tuple = __webpack_require__(310);
-	var getFunctionName = __webpack_require__(269);
-	var getTypeName = __webpack_require__(274);
-	var isType = __webpack_require__(275);
+/* 314 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var FunctionType = __webpack_require__(284);
+	var isArray = __webpack_require__(278);
+	var list = __webpack_require__(302);
+	var isObject = __webpack_require__(277);
+	var create = __webpack_require__(292);
+	var isNil = __webpack_require__(267);
+	var isBoolean = __webpack_require__(281);
+	var tuple = __webpack_require__(311);
+	var getFunctionName = __webpack_require__(270);
+	var getTypeName = __webpack_require__(275);
+	var isType = __webpack_require__(276);
 	
 	function getDefaultName(domain, codomain) {
 	  return '(' + domain.map(getTypeName).join(', ') + ') => ' + getTypeName(codomain);
 	}
 	
 	function isInstrumented(f) {
 	  return FunctionType.is(f) && isObject(f.instrumentation);
 	}
@@ -37951,26 +38140,26 @@ var Debugger =
 	}
 	
 	func.getDefaultName = getDefaultName;
 	func.getOptionalArgumentsIndex = getOptionalArgumentsIndex;
 	module.exports = func;
 
 
 /***/ },
-/* 314 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var isFunction = __webpack_require__(265);
-	var isArray = __webpack_require__(277);
-	var forbidNewOperator = __webpack_require__(290);
-	var is = __webpack_require__(292);
-	var getTypeName = __webpack_require__(274);
+/* 315 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var isFunction = __webpack_require__(266);
+	var isArray = __webpack_require__(278);
+	var forbidNewOperator = __webpack_require__(291);
+	var is = __webpack_require__(293);
+	var getTypeName = __webpack_require__(275);
 	
 	function getDefaultName(types) {
 	  return types.map(getTypeName).join(' & ');
 	}
 	
 	function intersection(types, name) {
 	
 	  if (false) {
@@ -38014,33 +38203,33 @@ var Debugger =
 	}
 	
 	intersection.getDefaultName = getDefaultName;
 	module.exports = intersection;
 	
 
 
 /***/ },
-/* 315 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isTypeName = __webpack_require__(289);
-	var String = __webpack_require__(295);
-	var Function = __webpack_require__(283);
-	var isBoolean = __webpack_require__(280);
-	var isObject = __webpack_require__(276);
-	var isNil = __webpack_require__(266);
-	var create = __webpack_require__(291);
-	var getTypeName = __webpack_require__(274);
-	var dict = __webpack_require__(297);
-	var getDefaultInterfaceName = __webpack_require__(305);
-	var isIdentity = __webpack_require__(290);
-	var is = __webpack_require__(292);
-	var extend = __webpack_require__(306);
+/* 316 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isTypeName = __webpack_require__(290);
+	var String = __webpack_require__(296);
+	var Function = __webpack_require__(284);
+	var isBoolean = __webpack_require__(281);
+	var isObject = __webpack_require__(277);
+	var isNil = __webpack_require__(267);
+	var create = __webpack_require__(292);
+	var getTypeName = __webpack_require__(275);
+	var dict = __webpack_require__(298);
+	var getDefaultInterfaceName = __webpack_require__(306);
+	var isIdentity = __webpack_require__(291);
+	var is = __webpack_require__(293);
+	var extend = __webpack_require__(307);
 	
 	function extendInterface(mixins, name) {
 	  return extend(inter, mixins, name);
 	}
 	
 	function getOptions(options) {
 	  if (!isObject(options)) {
 	    options = isNil(options) ? {} : { name: options };
@@ -38147,25 +38336,25 @@ var Debugger =
 	inter.strict = false;
 	inter.getOptions = getOptions;
 	inter.getDefaultName = getDefaultInterfaceName;
 	inter.extend = extendInterface;
 	module.exports = inter;
 
 
 /***/ },
-/* 316 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isObject = __webpack_require__(276);
-	var isFunction = __webpack_require__(265);
-	var isArray = __webpack_require__(277);
-	var isNumber = __webpack_require__(286);
-	var mixin = __webpack_require__(299);
+/* 317 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isObject = __webpack_require__(277);
+	var isFunction = __webpack_require__(266);
+	var isArray = __webpack_require__(278);
+	var isNumber = __webpack_require__(287);
+	var mixin = __webpack_require__(300);
 	
 	function getShallowCopy(x) {
 	  if (isArray(x)) {
 	    return x.concat();
 	  }
 	  if (x instanceof Date || x instanceof RegExp) {
 	    return x;
 	  }
@@ -38318,23 +38507,23 @@ var Debugger =
 	  $unshift: $unshift,
 	  $merge: $merge
 	};
 	
 	module.exports = update;
 
 
 /***/ },
-/* 317 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var assert = __webpack_require__(264);
-	var isFunction = __webpack_require__(265);
-	var isType = __webpack_require__(275);
-	var Any = __webpack_require__(270);
+/* 318 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var assert = __webpack_require__(265);
+	var isFunction = __webpack_require__(266);
+	var isType = __webpack_require__(276);
+	var Any = __webpack_require__(271);
 	
 	module.exports = function match(x) {
 	  var type, guard, f, count;
 	  for (var i = 1, len = arguments.length; i < len; ) {
 	    type = arguments[i];
 	    guard = arguments[i + 1];
 	    f = arguments[i + 2];
 	
@@ -38358,22 +38547,22 @@ var Debugger =
 	      return f(x);
 	    }
 	  }
 	  assert.fail('Match error');
 	};
 
 
 /***/ },
-/* 318 */
+/* 319 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 	
-	var _require = __webpack_require__(262);
+	var _require = __webpack_require__(263);
 	
 	var BreakpointResult = _require.BreakpointResult;
 	var Location = _require.Location;
 	
 	var defer = __webpack_require__(261);
 	
 	var bpClients = void 0;
 	var threadClient = void 0;
@@ -38415,16 +38604,17 @@ var Debugger =
 	
 	function sourceContents(sourceId) {
 	  var sourceClient = threadClient.source({ actor: sourceId });
 	  return sourceClient.source();
 	}
 	
 	function setBreakpoint(location, condition) {
 	  var sourceClient = threadClient.source({ actor: location.sourceId });
+	
 	  return sourceClient.setBreakpoint({
 	    line: location.line,
 	    column: location.column,
 	    condition: condition
 	  }).then(_ref => {
 	    var _ref2 = _slicedToArray(_ref, 2);
 	
 	    var res = _ref2[0];
@@ -38505,17 +38695,17 @@ var Debugger =
 	};
 	
 	module.exports = {
 	  setupCommands,
 	  clientCommands
 	};
 
 /***/ },
-/* 319 */
+/* 320 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var paused = (() => {
 	  var _ref = _asyncToGenerator(function* (_, packet) {
 	    // If paused by an explicit interrupt, which are generated by the
 	    // slow script dialog and internal events such as setting
 	    // breakpoints, ignore the event.
 	    if (packet.why.type === "interrupted" && !packet.why.onNext) {
@@ -38536,17 +38726,17 @@ var Debugger =
 	
 	  return function paused(_x, _x2) {
 	    return _ref.apply(this, arguments);
 	  };
 	})();
 	
 	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) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
 	
-	var _require = __webpack_require__(262);
+	var _require = __webpack_require__(263);
 	
 	var Source = _require.Source;
 	var Frame = _require.Frame;
 	var Location = _require.Location;
 	
 	
 	var CALL_STACK_PAGE_SIZE = 1000;
 	var NEW_SOURCE_IGNORED_URLS = ["debugger eval code", "XStringBundle"];
@@ -38586,16 +38776,21 @@ var Debugger =
 	
 	function newSource(_, packet) {
 	  var source = packet.source;
 	
 	
 	  if (NEW_SOURCE_IGNORED_URLS.indexOf(source.url) > -1) {
 	    return;
 	  }
+	
+	  if (source.introductionType == "debugger eval") {
+	    return;
+	  }
+	
 	  actions.newSource(Source({
 	    id: source.actor,
 	    url: source.url,
 	    isPrettyPrinted: false,
 	    sourceMapURL: source.sourceMapURL
 	  }));
 	}
 	
@@ -38606,67 +38801,65 @@ var Debugger =
 	};
 	
 	module.exports = {
 	  setupEvents,
 	  clientEvents
 	};
 
 /***/ },
-/* 320 */
+/* 321 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/* eslint-disable */
 	
-	var _require = __webpack_require__(321);
+	var _require = __webpack_require__(322);
 	
 	var connect = _require.connect;
 	
 	var defer = __webpack_require__(261);
 	
-	var _require2 = __webpack_require__(262);
+	var _require2 = __webpack_require__(263);
 	
 	var Tab = _require2.Tab;
 	
 	var _require3 = __webpack_require__(196);
 	
 	var isEnabled = _require3.isEnabled;
 	var getValue = _require3.getValue;
 	
-	var _require4 = __webpack_require__(322);
+	var _require4 = __webpack_require__(323);
 	
 	var networkRequest = _require4.networkRequest;
 	
-	var _require5 = __webpack_require__(325);
+	var _require5 = __webpack_require__(326);
 	
 	var setupCommands = _require5.setupCommands;
 	var clientCommands = _require5.clientCommands;
 	
-	var _require6 = __webpack_require__(326);
+	var _require6 = __webpack_require__(327);
 	
 	var setupEvents = _require6.setupEvents;
 	var clientEvents = _require6.clientEvents;
+	var pageEvents = _require6.pageEvents;
 	
 	// TODO: figure out a way to avoid patching native prototypes.
 	// Unfortunately the Chrome client requires it to work.
 	
 	Array.prototype.peekLast = function () {
 	  return this[this.length - 1];
 	};
 	
 	var connection = void 0;
 	
 	function createTabs(tabs) {
-	  var blacklist = ["New Tab", "Inspectable pages"];
 	
 	  return tabs.filter(tab => {
 	    var isPage = tab.type == "page";
-	    var isBlacklisted = blacklist.indexOf(tab.title) != -1;
-	
-	    return isPage && !isBlacklisted;
+	    return isPage;
 	  }).map(tab => {
 	    return Tab({
 	      title: tab.title,
 	      url: tab.url,
 	      id: tab.id,
 	      tab,
 	      browser: "chrome"
 	    });
@@ -38709,54 +38902,57 @@ var Debugger =
 	
 	  agents.Debugger.enable();
 	  agents.Debugger.setPauseOnExceptions("none");
 	  agents.Debugger.setAsyncCallStackDepth(0);
 	
 	  agents.Runtime.enable();
 	  agents.Runtime.run();
 	
+	  agents.Page.enable();
+	
 	  connection.registerDispatcher("Debugger", clientEvents);
+	  connection.registerDispatcher("Page", pageEvents);
 	}
 	
 	module.exports = {
 	  connectClient,
 	  clientCommands,
 	  connectNode,
 	  connectTab,
 	  initPage
 	};
 
 /***/ },
-/* 321 */
+/* 322 */
 /***/ function(module, exports) {
 
 	module.exports = {};
 
 /***/ },
-/* 322 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var _require = __webpack_require__(323);
+/* 323 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var _require = __webpack_require__(324);
 	
 	var log = _require.log;
 	
 	
 	function networkRequest(url) {
 	  return fetch(`/get?url=${ url }`).then(res => res.json()).catch(res => {
 	    log(`failed to request ${ url }`);
 	  });
 	}
 	
 	module.exports = {
 	  networkRequest
 	};
 
 /***/ },
-/* 323 */
+/* 324 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 	
 	var asyncMap = (() => {
 	  var _ref = _asyncToGenerator(function* (items, callback) {
 	    var newItems = [];
 	    for (var item of items) {
@@ -38787,17 +38983,17 @@ var Debugger =
 	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) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
 	
 	/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 	/* 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 co = __webpack_require__(324);
+	var co = __webpack_require__(325);
 	
 	var _require = __webpack_require__(196);
 	
 	var isDevelopment = _require.isDevelopment;
 	
 	var defer = __webpack_require__(261);
 	
 	function asPaused(client, func) {
@@ -38970,17 +39166,17 @@ var Debugger =
 	  toObject,
 	  mapObject,
 	  compose,
 	  log,
 	  updateObj
 	};
 
 /***/ },
-/* 324 */
+/* 325 */
 /***/ function(module, exports) {
 
 	
 	/**
 	 * slice() reference.
 	 */
 	
 	var slice = Array.prototype.slice;
@@ -39213,20 +39409,20 @@ var Debugger =
 	 */
 	
 	function isObject(val) {
 	  return Object == val.constructor;
 	}
 
 
 /***/ },
-/* 325 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var _require = __webpack_require__(262);
+/* 326 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var _require = __webpack_require__(263);
 	
 	var BreakpointResult = _require.BreakpointResult;
 	var Location = _require.Location;
 	
 	
 	var debuggerAgent = void 0;
 	var runtimeAgent = void 0;
 	var pageAgent = void 0;
@@ -39331,17 +39527,17 @@ var Debugger =
 	};
 	
 	module.exports = {
 	  setupCommands,
 	  clientCommands
 	};
 
 /***/ },
-/* 326 */
+/* 327 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var paused = (() => {
 	  var _ref = _asyncToGenerator(function* (callFrames, reason, data, hitBreakpoints, asyncStackTrace) {
 	    var frames = callFrames.map(function (frame) {
 	      return Frame({
 	        id: frame.callFrameId,
 	        displayName: frame.functionName,
@@ -39363,90 +39559,119 @@ var Debugger =
 	
 	  return function paused(_x, _x2, _x3, _x4, _x5) {
 	    return _ref.apply(this, arguments);
 	  };
 	})();
 	
 	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) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
 	
-	var _require = __webpack_require__(262);
+	var _require = __webpack_require__(263);
 	
 	var Source = _require.Source;
 	var Location = _require.Location;
 	var Frame = _require.Frame;
 	
 	
 	var actions = void 0;
 	
 	function setupEvents(dependencies) {
 	  actions = dependencies.actions;
 	}
 	
+	// Debugger Events
 	function scriptParsed(scriptId, url, startLine, startColumn, endLine, endColumn, executionContextId, hash, isContentScript, isInternalScript, isLiveEdit, sourceMapURL, hasSourceURL, deprecatedCommentWasUsed) {
+	  if (isContentScript) {
+	    return;
+	  }
+	
 	  actions.newSource(Source({
 	    id: scriptId,
 	    url,
 	    sourceMapURL,
 	    isPrettyPrinted: false
 	  }));
 	}
 	
 	function scriptFailedToParse() {}
 	
 	function resumed() {
 	  actions.resumed();
 	}
 	
 	function globalObjectCleared() {}
 	
+	// Page Events
+	function frameNavigated(frame) {
+	  actions.navigate();
+	}
+	
+	function frameStartedLoading() {
+	  actions.willNavigate();
+	}
+	
+	function domContentEventFired() {}
+	
+	function loadEventFired() {}
+	
+	function frameStoppedLoading() {}
+	
 	var clientEvents = {
 	  scriptParsed,
 	  scriptFailedToParse,
 	  paused,
 	  resumed,
 	  globalObjectCleared
 	};
 	
+	var pageEvents = {
+	  frameNavigated,
+	  frameStartedLoading,
+	  domContentEventFired,
+	  loadEventFired,
+	  frameStoppedLoading
+	};
+	
 	module.exports = {
 	  setupEvents,
+	  pageEvents,
 	  clientEvents
 	};
 
 /***/ },
-/* 327 */
+/* 328 */
 /***/ 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/. */
 	/* global window */
 	
 	var _require = __webpack_require__(2);
 	
 	var createStore = _require.createStore;
 	var applyMiddleware = _require.applyMiddleware;
 	
-	var _require2 = __webpack_require__(328);
+	var _require2 = __webpack_require__(329);
 	
 	var waitUntilService = _require2.waitUntilService;
 	
-	var _require3 = __webpack_require__(329);
+	var _require3 = __webpack_require__(330);
 	
 	var log = _require3.log;
 	
-	var _require4 = __webpack_require__(330);
+	var _require4 = __webpack_require__(331);
 	
 	var history = _require4.history;
 	
-	var _require5 = __webpack_require__(331);
+	var _require5 = __webpack_require__(332);
 	
 	var promise = _require5.promise;
 	
-	var _require6 = __webpack_require__(334);
+	var _require6 = __webpack_require__(335);
 	
 	var thunk = _require6.thunk;
 	
 	/**
 	 * This creates a dispatcher with all the standard middleware in place
 	 * that all code requires. It can also be optionally configured in
 	 * various ways, such as logging and recording.
 	 *
@@ -39484,17 +39709,17 @@ var Debugger =
 	  var devtoolsExt = typeof window === "object" && window.devToolsExtension ? window.devToolsExtension() : f => f;
 	
 	  return applyMiddleware.apply(undefined, middleware)(devtoolsExt(createStore));
 	};
 	
 	module.exports = configureStore;
 
 /***/ },
-/* 328 */
+/* 329 */
 /***/ function(module, exports) {
 
 	/* This Source Code Form is subject to the terms of the Mozilla Public
 	 * License, v. 2.0. If a copy of the MPL was not distributed with this
 	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 	"use strict";
 	
 	/**
@@ -39554,17 +39779,17 @@ var Debugger =
 	    checkPending(action);
 	    return result;
 	  };
 	}
 	exports.waitUntilService = waitUntilService;
 
 
 /***/ },
-/* 329 */
+/* 330 */
 /***/ function(module, exports) {
 
 	/* This Source Code Form is subject to the terms of the Mozilla Public
 	 * License, v. 2.0. If a copy of the MPL was not distributed with this
 	 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 	"use strict";
 	
 	/**
@@ -39577,17 +39802,17 @@ var Debugger =
 	    next(action);
 	  };
 	}
 	
 	exports.log = log;
 
 
 /***/ },
-/* 330 */
+/* 331 */
 /***/ 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/. */
 	
 	var _require = __webpack_require__(196);
 	
@@ -39611,46 +39836,43 @@ var Debugger =
 	    return next => action => {
 	      log.push(action);
 	      next(action);
 	    };
 	  };
 	};
 
 /***/ },
-/* 331 */
+/* 332 */
 /***/ 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/. */
 	
-	var uuidgen = __webpack_require__(332).uuid;
+	var uuidgen = __webpack_require__(333).uuid;
 	var defer = __webpack_require__(261);
 	
-	var _require = __webpack_require__(323);
+	var _require = __webpack_require__(324);
 	
 	var entries = _require.entries;
 	var toObject = _require.toObject;
 	
-	var _require2 = __webpack_require__(333);
+	var _require2 = __webpack_require__(334);
 	
 	var executeSoon = _require2.executeSoon;
 	
 	
 	var PROMISE = exports.PROMISE = "@@dispatch/promise";
 	
 	function promiseMiddleware(_ref) {
 	  var dispatch = _ref.dispatch;
 	  var getState = _ref.getState;
 	
 	  return next => action => {
-        if(!action) {
-          console.log(new Error().stack);
-        }
 	    if (!(PROMISE in action)) {
 	      return next(action);
 	    }
 	
 	    var promiseInst = action[PROMISE];
 	    var seqId = uuidgen().toString();
 	
 	    // Create a new action that doesn't have the promise field and has
@@ -39681,30 +39903,30 @@ var Debugger =
 	    });
 	    return deferred.promise;
 	  };
 	}
 	
 	exports.promise = promiseMiddleware;
 
 /***/ },
-/* 332 */
+/* 333 */
 /***/ function(module, exports) {
 
 	
 	let i = 1;
 	function uuid() {
 	  return 'not-really-uuid' + (i++);
 	}
 	
 	module.exports = { uuid };
 
 
 /***/ },
-/* 333 */
+/* 334 */
 /***/ function(module, exports) {
 
 	function reportException(who, exception) {
 	  var msg = who + " threw an exception: ";
 	  console.error(msg, exception);
 	}
 	
 	function assert(condition, message) {
@@ -39721,17 +39943,17 @@ var Debugger =
 	
 	module.exports = {
 	  reportException,
 	  executeSoon,
 	  assert
 	};
 
 /***/ },
-/* 334 */
+/* 335 */
 /***/ function(module, exports) {
 
 	
 	/**
 	 * A middleware that allows thunks (functions) to be dispatched. If
 	 * it's a thunk, it is called with an argument that contains
 	 * `dispatch`, `getState`, and any additional args passed in via the
 	 * middleware constructure. This allows the action to create multiple
@@ -39747,48 +39969,48 @@ var Debugger =
 	    return next => action => {
 	      return typeof action === "function" ? action(makeArgs ? makeArgs(args, getState()) : args) : next(action);
 	    };
 	  };
 	}
 	exports.thunk = thunk;
 
 /***/ },
-/* 335 */
+/* 336 */
 /***/ 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/. */
 	
-	var eventListeners = __webpack_require__(336);
-	var sources = __webpack_require__(338);
-	var breakpoints = __webpack_require__(342);
-	var asyncRequests = __webpack_require__(343);
-	var tabs = __webpack_require__(344);
-	var pause = __webpack_require__(345);
+	var eventListeners = __webpack_require__(337);
+	var sources = __webpack_require__(339);
+	var breakpoints = __webpack_require__(343);
+	var asyncRequests = __webpack_require__(344);
+	var tabs = __webpack_require__(345);
+	var pause = __webpack_require__(346);
 	
 	module.exports = {
 	  eventListeners,
 	  sources: sources.update,
 	  breakpoints: breakpoints.update,
 	  asyncRequests,
 	  tabs,
 	  pause
 	};
 
 /***/ },
-/* 336 */
+/* 337 */
 /***/ 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/. */
 	
-	var constants = __webpack_require__(337);
+	var constants = __webpack_require__(338);
 	
 	var initialState = {
 	  activeEventNames: [],
 	  listeners: [],
 	  fetchingListeners: false
 	};
 	
 	function update() {
@@ -39815,17 +40037,17 @@ var Debugger =
 	  }
 	
 	  return state;
 	}
 	
 	module.exports = update;
 
 /***/ },
-/* 337 */
+/* 338 */
 /***/ function(module, exports) {
 
 	/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 	/* 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/. */
 	
@@ -39859,30 +40081,31 @@ var Debugger =
 	exports.PAUSED = "PAUSED";
 	exports.PAUSE_ON_EXCEPTIONS = "PAUSE_ON_EXCEPTIONS";
 	exports.COMMAND = "COMMAND";
 	exports.SELECT_FRAME = "SELECT_FRAME";
 	exports.LOAD_OBJECT_PROPERTIES = "LOAD_OBJECT_PROPERTIES";
 	exports.ADD_EXPRESSION = "ADD_EXPRESSION";
 	exports.EVALUATE_EXPRESSION = "EVALUATE_EXPRESSION";
 	exports.UPDATE_EXPRESSION = "UPDATE_EXPRESSION";
-
-/***/ },
-/* 338 */
+	exports.DELETE_EXPRESSION = "DELETE_EXPRESSION";
+
+/***/ },
+/* 339 */
 /***/ function(module, exports, __webpack_require__) {
 
 	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); } }
 	
 	/* 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 fromJS = __webpack_require__(339);
-	var I = __webpack_require__(340);
-	var makeRecord = __webpack_require__(341);
+	var fromJS = __webpack_require__(340);
+	var I = __webpack_require__(341);
+	var makeRecord = __webpack_require__(342);
 	
 	var State = makeRecord({
 	  sources: I.Map(),
 	  selectedSource: undefined,
 	  pendingSelectedSourceURL: undefined,
 	  sourcesText: I.Map(),
 	  sourceMaps: I.Map(),
 	  tabs: I.List([])
@@ -40103,22 +40326,22 @@ var Debugger =
 	  getSourceText,
 	  getSourceTabs,
 	  getSelectedSource,
 	  getPendingSelectedSourceURL,
 	  getSourceMap
 	};
 
 /***/ },
-/* 339 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-	
-	var Immutable = __webpack_require__(340);
+/* 340 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+	
+	var Immutable = __webpack_require__(341);
 	
 	// When our app state is fully types, we should be able to get rid of
 	// this function. This is only temporarily necessary to support
 	// converting typed objects to immutable.js, which usually happens in
 	// reducers.
 	function fromJS(value) {
 	  if (Array.isArray(value)) {
 	    return Immutable.Seq(value).map(fromJS).toList();
@@ -40147,17 +40370,17 @@ var Debugger =
 	  // it's a plain object because we might be objects from other JS
 	  // contexts so `Object !== Object`.
 	  return Immutable.Seq(value).map(fromJS).toMap();
 	}
 	
 	module.exports = fromJS;
 
 /***/ },
-/* 340 */
+/* 341 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
 	 *  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
@@ -45133,57 +45356,57 @@ var Debugger =
 	  };
 	
 	  return Immutable;
 	
 	}));
 
 
 /***/ },
-/* 341 */
+/* 342 */
 /***/ function(module, exports, __webpack_require__) {
 
 	
 	
 	// When Flow 0.29 is released (very soon), we can use this Record type
 	// instead of the builtin immutable.js Record type. This is better
 	// because all the fields are actually typed, unlike the builtin one.
 	// This depends on a performance fix that will go out in 0.29 though;
 	
-	var I = __webpack_require__(340);
+	var I = __webpack_require__(341);
 	
 	/**
 	 * Make an immutable record type
 	 *
 	 * @param spec - the keys and their default values @return a state
 	 * record factory function
 	 */
 	function makeRecord(spec) {
 	  return I.Record(spec);
 	}
 	
 	module.exports = makeRecord;
 
 /***/ },
-/* 342 */
+/* 343 */
 /***/ 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/. */
 	
-	var fromJS = __webpack_require__(339);
-	
-	var _require = __webpack_require__(323);
+	var fromJS = __webpack_require__(340);
+	
+	var _require = __webpack_require__(324);
 	
 	var updateObj = _require.updateObj;
 	
-	var I = __webpack_require__(340);
-	var makeRecord = __webpack_require__(341);
+	var I = __webpack_require__(341);
+	var makeRecord = __webpack_require__(342);
 	
 	var State = makeRecord({
 	  breakpoints: I.Map()
 	});
 	
 	// Return the first argument that is a string, or null if nothing is a
 	// string.
 	function firstString() {
@@ -45325,26 +45548,26 @@ var Debugger =
 	  update,
 	  makeLocationId,
 	  getBreakpoint,
 	  getBreakpoints,
 	  getBreakpointsForSource
 	};
 
 /***/ },
-/* 343 */
+/* 344 */
 /***/ function(module, exports, __webpack_require__) {
 
 	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); } }
 	
 	/* 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 constants = __webpack_require__(337);
+	var constants = __webpack_require__(338);
 	var initialState = [];
 	
 	function update() {
 	  var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
 	  var action = arguments[1];
 	  var seqId = action.seqId;
 	
 	
@@ -45362,26 +45585,26 @@ var Debugger =
 	  }
 	
 	  return state;
 	}
 	
 	module.exports = update;
 
 /***/ },
-/* 344 */
+/* 345 */
 /***/ 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/. */
 	
-	var constants = __webpack_require__(337);
-	var Immutable = __webpack_require__(340);
-	var fromJS = __webpack_require__(339);
+	var constants = __webpack_require__(338);
+	var Immutable = __webpack_require__(341);
+	var fromJS = __webpack_require__(340);
 	
 	var initialState = fromJS({
 	  tabs: {},
 	  selectedTab: null
 	});
 	
 	function update() {
 	  var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
@@ -45417,25 +45640,25 @@ var Debugger =
 	  }
 	
 	  return id;
 	}
 	
 	module.exports = update;
 
 /***/ },
-/* 345 */
+/* 346 */
 /***/ 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/. */
 	
-	var constants = __webpack_require__(337);
-	var fromJS = __webpack_require__(339);
+	var constants = __webpack_require__(338);
+	var fromJS = __webpack_require__(340);
 	
 	var initialState = fromJS({
 	  pause: null,
 	  isWaitingOnBreak: false,
 	  frames: null,
 	  selectedFrame: null,
 	  loadedObjects: {},
 	  shouldPauseOnExceptions: false,
@@ -45512,39 +45735,42 @@ var Debugger =
 	          updating: false });
 	      }
 	      break;
 	
 	    case constants.UPDATE_EXPRESSION:
 	      return state.mergeIn(["expressions", action.id], { id: action.id,
 	        input: action.input,
 	        updating: true });
+	
+	    case constants.DELETE_EXPRESSION:
+	      return state.deleteIn(["expressions", action.id]);
 	  }
 	
 	  return state;
 	}
 	
 	module.exports = update;
 
 /***/ },
-/* 346 */
+/* 347 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	
 	var _require = __webpack_require__(15);
 	
 	var connect = _require.connect;
 	
-	var _require2 = __webpack_require__(347);
+	var _require2 = __webpack_require__(348);
 	
 	var getTabs = _require2.getTabs;
 	
 	
-	__webpack_require__(354);
+	__webpack_require__(355);
 	var dom = React.DOM;
 	
 	function getTabsByBrowser(tabs, browser) {
 	  return tabs.valueSeq().filter(tab => tab.get("browser") == browser);
 	}
 	
 	function renderTabs(tabTitle, tabs, paramName) {
 	  if (tabs.count() == 0) {
@@ -45553,41 +45779,40 @@ var Debugger =
 	
 	  return dom.div({ className: `tab-group ${ tabTitle }` }, dom.div({ className: "tab-group-title" }, tabTitle), dom.ul({ className: "tab-list" }, tabs.valueSeq().map(tab => dom.li({ "className": "tab",
 	    "key": tab.get("id"),
 	    "onClick": () => {
 	      window.location = "/?" + paramName + "=" + tab.get("id");
 	    } }, dom.div({ className: "tab-title" }, tab.get("title")), dom.div({ className: "tab-url" }, tab.get("url"))))));
 	}
 	
+	function renderMessage(tabsIsEmpty) {
+	  return dom.div({ className: "not-connected-message" }, !tabsIsEmpty || "No remote tabs found. ", "You may be looking to ", dom.a({ href: `/?ws=${ document.location.hostname }:9229/node` }, "connect to Node"), ".", dom.br(), "Make sure you run ", dom.a({ href: "https://github.com/devtools-html/debugger.html/blob/master/CONTRIBUTING.md#firefox" }, "Firefox"), ", ", dom.a({ href: "https://github.com/devtools-html/debugger.html/blob/master/CONTRIBUTING.md#chrome" }, "Chrome"), " or ", dom.a({ href: "https://github.com/devtools-html/debugger.html/blob/master/CONTRIBUTING.md#nodejs" }, "Node"), " with the right flags.");
+	}
 	function Tabs(_ref) {
 	  var tabs = _ref.tabs;
 	
 	  var firefoxTabs = getTabsByBrowser(tabs, "firefox");
 	  var chromeTabs = getTabsByBrowser(tabs, "chrome");
 	
-	  if (tabs.isEmpty()) {
-	    return dom.div({ className: "not-connected-message" }, "No remote tabs found. You may be looking to ", dom.a({ href: `/?ws=${ document.location.hostname }:9229/node` }, "connect to Node"), ".");
-	  }
-	
-	  return dom.div({ className: "tabs theme-light" }, renderTabs("Firefox Tabs", firefoxTabs, "firefox-tab"), renderTabs("Chrome Tabs", chromeTabs, "chrome-tab"), dom.div({ className: "node-message" }, "You can also ", dom.a({ href: `/?ws=${ document.location.hostname }:9229/node` }, "connect to Node"), "."));
+	  return dom.div({ className: "tabs theme-light" }, renderTabs("Firefox Tabs", firefoxTabs, "firefox-tab"), renderTabs("Chrome Tabs", chromeTabs, "chrome-tab"), renderMessage(tabs.isEmpty()));
 	}
 	
 	module.exports = connect(state => ({ tabs: getTabs(state) }))(Tabs);
 
 /***/ },
-/* 347 */
-/***/ function(module, exports, __webpack_require__) {
-
-	
-	
-	var URL = __webpack_require__(348);
-	var path = __webpack_require__(353);
-	var sources = __webpack_require__(338);
-	var breakpoints = __webpack_require__(342);
+/* 348 */
+/***/ function(module, exports, __webpack_require__) {
+
+	
+	
+	var URL = __webpack_require__(349);
+	var path = __webpack_require__(354);
+	var sources = __webpack_require__(339);
+	var breakpoints = __webpack_require__(343);
 	
 	function getTabs(state) {
 	  return state.tabs.get("tabs");
 	}
 	
 	function getSelectedTab(state) {
 	  return state.tabs.get("selectedTab");
 	}
@@ -45664,17 +45889,17 @@ var Debugger =
 	  getExpressions,
 	  getIsWaitingOnBreak,
 	  getShouldPauseOnExceptions,
 	  getFrames,
 	  getSelectedFrame
 	};
 
 /***/ },
-/* 348 */
+/* 349 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// Copyright Joyent, Inc. and other Node contributors.
 	//
 	// Permission is hereby granted, free of charge, to any person obtaining a
 	// copy of this software and associated documentation files (the
 	// "Software"), to deal in the Software without restriction, including
 	// without limitation the rights to use, copy, modify, merge, publish,
@@ -45688,17 +45913,17 @@ var Debugger =
 	// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 	// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 	// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
 	// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 	// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 	// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 	// USE OR OTHER DEALINGS IN THE SOFTWARE.
 	
-	var punycode = __webpack_require__(349);
+	var punycode = __webpack_require__(350);
 	
 	exports.parse = urlParse;
 	exports.resolve = urlResolve;
 	exports.resolveObject = urlResolveObject;
 	exports.format = urlFormat;
 	
 	exports.Url = Url;
 	
@@ -45760,17 +45985,17 @@ var Debugger =
 	      'gopher': true,
 	      'file': true,
 	      'http:': true,
 	      'https:': true,
 	      'ftp:': true,
 	      'gopher:': true,
 	      'file:': true
 	    },
-	    querystring = __webpack_require__(350);
+	    querystring = __webpack_require__(351);
 	
 	function urlParse(url, parseQueryString, slashesDenoteHost) {
 	  if (url && isObject(url) && url instanceof Url) return url;
 	
 	  var u = new Url;
 	  u.parse(url, parseQueryString, slashesDenoteHost);
 	  return u;
 	}
@@ -46377,17 +46602,17 @@ var Debugger =
 	  return arg === null;
 	}
 	function isNullOrUndefined(arg) {
 	  return  arg == null;
 	}
 
 
 /***/ },
-/* 349 */
+/* 350 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module, global) {/*! https://mths.be/punycode v1.3.2 by @mathias */
 	;(function(root) {
 	
 		/** Detect free variables */
 		var freeExports = typeof exports == 'object' && exports &&
 			!exports.nodeType && exports;
@@ -46912,27 +47137,27 @@ var Debugger =
 			root.punycode = punycode;
 		}
 	
 	}(this));
 	
 	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(250)(module), (function() { return this; }())))
 
 /***/ },
-/* 350 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	
-	exports.decode = exports.parse = __webpack_require__(351);
-	exports.encode = exports.stringify = __webpack_require__(352);
-
-
-/***/ },
 /* 351 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	
+	exports.decode = exports.parse = __webpack_require__(352);
+	exports.encode = exports.stringify = __webpack_require__(353);
+
+
+/***/ },
+/* 352 */
 /***/ function(module, exports) {
 
 	// Copyright Joyent, Inc. and other Node contributors.
 	//
 	// Permission is hereby granted, free of charge, to any person obtaining a
 	// copy of this software and associated documentation files (the
 	// "Software"), to deal in the Software without restriction, including
 	// without limitation the rights to use, copy, modify, merge, publish,
@@ -47008,17 +47233,17 @@ var Debugger =
 	    }
 	  }
 	
 	  return obj;
 	};
 
 
 /***/ },
-/* 352 */
+/* 353 */
 /***/ function(module, exports) {
 
 	// Copyright Joyent, Inc. and other Node contributors.
 	//
 	// Permission is hereby granted, free of charge, to any person obtaining a
 	// copy of this software and associated documentation files (the
 	// "Software"), to deal in the Software without restriction, including
 	// without limitation the rights to use, copy, modify, merge, publish,
@@ -47078,17 +47303,17 @@ var Debugger =
 	
 	  if (!name) return '';
 	  return encodeURIComponent(stringifyPrimitive(name)) + eq +
 	         encodeURIComponent(stringifyPrimitive(obj));
 	};
 
 
 /***/ },
-/* 353 */
+/* 354 */
 /***/ function(module, exports) {
 
 	function basename(path) {
 	  return path.split("/").pop();
 	}
 	
 	function dirname(path) {
 	  var idx = path.lastIndexOf("/");
@@ -47103,57 +47328,57 @@ var Debugger =
 	  return str[0] === "/";
 	}
 	
 	module.exports = {
 	  basename, dirname, isURL, isAbsolute
 	};
 
 /***/ },
-/* 354 */
+/* 355 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(355);
+	var content = __webpack_require__(356);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./Tabs.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./Tabs.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 355 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 356 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
-	exports.push([module.id, ".tabs {\n  margin: 100px auto;\n  margin-bottom: 0;\n  width: calc(100% - 200px);\n}\n\n.tabs .tab-group {\n  margin-top: 20px;\n}\n\n.tabs .tab-group-title {\n  margin: 0 0 1em 10px;\n  color: var(--theme-highlight-lightorange);\n}\n\n.tabs .tab-list {\n  list-style: none;\n  padding: 0px;\n  margin: 0px;\n}\n\n.tabs .tab:first-child {\n  border-top: 1px solid #dddddd;\n}\n\n.tabs .tab {\n  border-bottom: 1px solid #dddddd;\n  padding: 10px;\n  font-family: sans-serif;\n  font-size: 0.9em;\n}\n\n.tabs .tab:hover {\n  background-color: var(--theme-toolbar-background);\n  cursor: pointer;\n}\n\n.tabs .tab-title {\n  line-height: 25px;\n  color: var(--theme-content-color1);\n}\n\n.tabs .tab-url {\n  color: var(--theme-highlight-bluegrey);\n}\n\n.not-connected-message {\n  margin: auto;\n  padding: 50px 100px;\n  border: 1px solid #dddddd;\n  background-color: #fbfbfb;\n  color: #9a9a9a;\n}\n\n.node-message {\n  margin: 3em 0;\n  text-align: center;\n  font-size: 0.9em;\n}\n", ""]);
+	exports.push([module.id, ".tabs {\n  margin: 100px auto;\n  margin-bottom: 0;\n  width: calc(100% - 200px);\n}\n\n.tabs .tab-group {\n  margin-top: 20px;\n}\n\n.tabs .tab-group-title {\n  margin: 0 0 1em 10px;\n  color: var(--theme-highlight-lightorange);\n}\n\n.tabs .tab-list {\n  list-style: none;\n  padding: 0px;\n  margin: 0px;\n}\n\n.tabs .tab:first-child {\n  border-top: 1px solid #dddddd;\n}\n\n.tabs .tab {\n  border-bottom: 1px solid #dddddd;\n  padding: 10px;\n  font-family: sans-serif;\n  font-size: 0.9em;\n}\n\n.tabs .tab:hover {\n  background-color: var(--theme-toolbar-background);\n  cursor: pointer;\n}\n\n.tabs .tab-title {\n  line-height: 25px;\n  color: var(--theme-content-color1);\n}\n\n.tabs .tab-url {\n  color: var(--theme-highlight-bluegrey);\n}\n\n.not-connected-message {\n  margin: 20px;\n  padding: 50px 100px;\n  border: 1px solid #dddddd;\n  background-color: #fbfbfb;\n  color: #9a9a9a;\n  text-align: center;\n}\n\n.node-message {\n  margin: 3em 0;\n  text-align: center;\n  font-size: 0.9em;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 356 */
+/* 357 */
 /***/ function(module, exports) {
 
 	/*
 		MIT License http://www.opensource.org/licenses/mit-license.php
 		Author Tobias Koppers @sokra
 	*/
 	// css base code, injected by the css-loader
 	module.exports = function() {
@@ -47199,17 +47424,17 @@ var Debugger =
 				}
 			}
 		};
 		return list;
 	};
 
 
 /***/ },
-/* 357 */
+/* 358 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/*
 		MIT License http://www.opensource.org/licenses/mit-license.php
 		Author Tobias Koppers @sokra
 	*/
 	var stylesInDom = {},
 		memoize = function(fn) {
@@ -47451,53 +47676,58 @@ var Debugger =
 		linkElement.href = URL.createObjectURL(blob);
 	
 		if(oldSrc)
 			URL.revokeObjectURL(oldSrc);
 	}
 
 
 /***/ },
-/* 358 */
+/* 359 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	var createFactory = React.createFactory;
 	
 	var _require = __webpack_require__(15);
 	
 	var connect = _require.connect;
 	
 	var _require2 = __webpack_require__(2);
 	
 	var bindActionCreators = _require2.bindActionCreators;
 	
-	var actions = __webpack_require__(359);
-	
-	__webpack_require__(367);
+	var actions = __webpack_require__(360);
+	
 	__webpack_require__(369);
-	var Sources = createFactory(__webpack_require__(371));
-	var Editor = createFactory(__webpack_require__(396));
-	var SplitBox = createFactory(__webpack_require__(407));
-	var RightSidebar = createFactory(__webpack_require__(411));
-	var SourceTabs = createFactory(__webpack_require__(477));
-	var SourceFooter = createFactory(__webpack_require__(482));
-	var Autocomplete = createFactory(__webpack_require__(483));
-	
-	var _require3 = __webpack_require__(347);
+	__webpack_require__(371);
+	__webpack_require__(373);
+	var Sources = createFactory(__webpack_require__(375));
+	var Editor = createFactory(__webpack_require__(414));
+	var SplitBox = createFactory(__webpack_require__(425));
+	var RightSidebar = createFactory(__webpack_require__(429));
+	var SourceTabs = createFactory(__webpack_require__(498));
+	var SourceFooter = createFactory(__webpack_require__(503));
+	var Autocomplete = createFactory(__webpack_require__(504));
+	
+	var _require3 = __webpack_require__(348);
 	
 	var getSelectedSource = _require3.getSelectedSource;
 	var getSources = _require3.getSources;
 	
-	var _require4 = __webpack_require__(323);
+	var _require4 = __webpack_require__(324);
 	
 	var endTruncateStr = _require4.endTruncateStr;
 	
+	var _require5 = __webpack_require__(513);
+	
+	var KeyShortcuts = _require5.KeyShortcuts;
+	
 	
 	var App = React.createClass({
 	  propTypes: {
 	    sources: PropTypes.object,
 	    selectedSource: PropTypes.object,
 	    selectSource: PropTypes.func
 	  },
 	
@@ -47505,26 +47735,34 @@ var Debugger =
 	
 	  getInitialState() {
 	    return {
 	      searchOn: false
 	    };
 	  },
 	
 	  componentDidMount() {
-	    window.addEventListener("keydown", this.toggleSourcesSearch, false);
+	    this.shortcuts = new KeyShortcuts({ window });
+	    this.shortcuts.on("Cmd+P", this.toggleSourcesSearch);
+	    window.addEventListener("keydown", this.onKeyDown);
 	  },
 	
 	  componentWillUnmount() {
-	    window.removeEventListener("keydown", this.toggleSourcesSearch, false);
-	  },
-	
-	  toggleSourcesSearch(e) {
-	    if ((e.metaKey || e.ctrlKey) && e.key == "p") {
-	      this.setState({ searchOn: !this.state.searchOn });
+	    this.shortcuts.off("Cmd+P", this.toggleSourcesSearch);
+	    window.removeEventListener("keydown", this.onKeyDown);
+	  },
+	
+	  toggleSourcesSearch(key, e) {
+	    e.preventDefault();
+	    this.setState({ searchOn: !this.state.searchOn });
+	  },
+	
+	  onKeyDown(e) {
+	    if (e.key === "Escape") {
+	      this.setState({ searchOn: false });
 	      e.preventDefault();
 	    }
 	  },
 	
 	  renderSourcesSearch() {
 	    function getSourcePath(source) {
 	      var url = source.get("url") || "";
 	      var path = new URL(url).pathname;
@@ -47583,69 +47821,50 @@ var Debugger =
 	    }));
 	  }
 	});
 	
 	module.exports = connect(state => ({ sources: getSources(state),
 	  selectedSource: getSelectedSource(state) }), dispatch => bindActionCreators(actions, dispatch))(App);
 
 /***/ },
-/* 359 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var constants = __webpack_require__(337);
-	var breakpoints = __webpack_require__(360);
-	var eventListeners = __webpack_require__(362);
-	var sources = __webpack_require__(363);
-	var tabs = __webpack_require__(365);
-	var pause = __webpack_require__(366);
-	
-	function willNavigate() {
-	  return { type: constants.NAVIGATE };
-	}
-	
-	function navigate() {
-	  return _ref => {
-	    // We need to load all the sources again because they might have
-	    // come from bfcache, so we won't get a `newSource` notification.
-	    //
-	    // TODO: This seems to be buggy on the debugger server side. When
-	    // the page is loaded from bfcache, we still get sources from the
-	    // *previous* page as well. For now, emulate the current debugger
-	    // behavior by not showing sources loaded by bfcache.
-	    // return dispatch(sources.loadSources());
-	
-	    var dispatch = _ref.dispatch;
-	  };
-	}
-	
-	module.exports = Object.assign({ willNavigate, navigate }, breakpoints, eventListeners, sources, tabs, pause);
-
-/***/ },
 /* 360 */
 /***/ function(module, exports, __webpack_require__) {
 
+	var breakpoints = __webpack_require__(361);
+	var eventListeners = __webpack_require__(363);
+	var sources = __webpack_require__(364);
+	var tabs = __webpack_require__(366);
+	var pause = __webpack_require__(367);
+	var navigation = __webpack_require__(368);
+	
+	module.exports = Object.assign(navigation, breakpoints, eventListeners, sources, tabs, pause);
+
+/***/ },
+/* 361 */
+/***/ function(module, exports, __webpack_require__) {
+
 	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) { return step("next", value); }, function (err) { return 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/. */
 	
-	var constants = __webpack_require__(337);
-	
-	var _require = __webpack_require__(331);
+	var constants = __webpack_require__(338);
+	
+	var _require = __webpack_require__(332);
 	
 	var PROMISE = _require.PROMISE;
 	
-	var _require2 = __webpack_require__(347);
+	var _require2 = __webpack_require__(348);
 	
 	var getBreakpoint = _require2.getBreakpoint;
 	var getBreakpoints = _require2.getBreakpoints;
 	
-	var _require3 = __webpack_require__(361);
+	var _require3 = __webpack_require__(362);
 	
 	var getOriginalLocation = _require3.getOriginalLocation;
 	var getGeneratedLocation = _require3.getGeneratedLocation;
 	
 	function _breakpointExists(state, location) {
 	  var currentBp = getBreakpoint(state, location);
 	  return currentBp && !currentBp.disabled;
 	}
@@ -47799,17 +48018,17 @@ var Debugger =
 	  addBreakpoint,
 	  disableBreakpoint,
 	  removeBreakpoint,
 	  removeAllBreakpoints,
 	  setBreakpointCondition
 	};
 
 /***/ },
-/* 361 */
+/* 362 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var getOriginalSources = (() => {
 	  var _ref2 = _asyncToGenerator(function* (state, source) {
 	    var originalSourceUrls = yield getOriginalSourceUrls(source);
 	    return originalSourceUrls.map(function (url) {
 	      return getSourceByURL(state, url);
 	    });
@@ -47913,21 +48132,21 @@ var Debugger =
 	
 	  return function getOriginalSourceTexts(_x9, _x10, _x11) {
 	    return _ref6.apply(this, arguments);
 	  };
 	})();
 	
 	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) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
 	
-	var _require = __webpack_require__(323);
+	var _require = __webpack_require__(324);
 	
 	var workerTask = _require.workerTask;
 	
-	var _require2 = __webpack_require__(347);
+	var _require2 = __webpack_require__(348);
 	
 	var getSource = _require2.getSource;
 	var getSourceByURL = _require2.getSourceByURL;
 	
 	var _require3 = __webpack_require__(196);
 	
 	var isEnabled = _require3.isEnabled;
 	var getValue = _require3.getValue;
@@ -47959,16 +48178,17 @@ var Debugger =
 	var getGeneratedSourceLocation = sourceMapTask("getGeneratedSourceLocation");
 	var createOriginalSources = sourceMapTask("createOriginalSources");
 	var getOriginalSourceUrls = sourceMapTask("getOriginalSourceUrls");
 	var getOriginalTexts = sourceMapTask("getOriginalTexts");
 	var isOriginal = sourceMapTask("isOriginal");
 	var isGenerated = sourceMapTask("isGenerated");
 	var getGeneratedSourceId = sourceMapTask("getGeneratedSourceId");
 	var createSourceMap = sourceMapTask("createSourceMap");
+	var clearData = sourceMapTask("clearData");
 	
 	function _shouldSourceMap(generatedSource) {
 	  return isEnabled("features.sourceMaps") && generatedSource.sourceMapURL;
 	}
 	
 	module.exports = {
 	  getGeneratedLocation,
 	  getOriginalLocation,
@@ -47979,36 +48199,37 @@ var Debugger =
 	  getOriginalSourcePosition,
 	  getGeneratedSourceLocation,
 	  createOriginalSources,
 	  getOriginalSourceUrls,
 	  getOriginalTexts,
 	  isOriginal,
 	  isGenerated,
 	  getGeneratedSourceId,
-	  createSourceMap
-	};
-
-/***/ },
-/* 362 */
+	  createSourceMap,
+	  clearData
+	};
+
+/***/ },
+/* 363 */
 /***/ 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/. */
 	/* global window gThreadClient setNamedTimeout services EVENTS */
 	/* eslint no-shadow: 0  */
 	
-	var constants = __webpack_require__(337);
-	
-	var _require = __webpack_require__(323);
+	var constants = __webpack_require__(338);
+	
+	var _require = __webpack_require__(324);
 	
 	var asPaused = _require.asPaused;
 	
-	var _require2 = __webpack_require__(333);
+	var _require2 = __webpack_require__(334);
 	
 	var reportException = _require2.reportException;
 	
 	var _require3 = __webpack_require__(246);
 	
 	var Task = _require3.Task;
 	
 	// delay is in ms
@@ -48113,17 +48334,17 @@ var Debugger =
 	      });
 	    });
 	  };
 	}
 	
 	module.exports = { updateEventBreakpoints, fetchEventListeners };
 
 /***/ },
-/* 363 */
+/* 364 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 	
 	var _prettyPrintSource = (() => {
 	  var _ref = _asyncToGenerator(function* (_ref2) {
 	    var source = _ref2.source;
 	    var sourceText = _ref2.sourceText;
@@ -48162,53 +48383,53 @@ var Debugger =
 	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) { return step("next", value); }, function (err) { return 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/. */
 	
 	var defer = __webpack_require__(261);
 	
-	var _require = __webpack_require__(331);
+	var _require = __webpack_require__(332);
 	
 	var PROMISE = _require.PROMISE;
 	
 	var _require2 = __webpack_require__(246);
 	
 	var Task = _require2.Task;
 	
-	var _require3 = __webpack_require__(364);
+	var _require3 = __webpack_require__(365);
 	
 	var isJavaScript = _require3.isJavaScript;
 	
-	var _require4 = __webpack_require__(322);
+	var _require4 = __webpack_require__(323);
 	
 	var networkRequest = _require4.networkRequest;
 	
-	var _require5 = __webpack_require__(323);
+	var _require5 = __webpack_require__(324);
 	
 	var workerTask = _require5.workerTask;
 	
 	
-	var constants = __webpack_require__(337);
+	var constants = __webpack_require__(338);
 	var invariant = __webpack_require__(175);
 	
 	var _require6 = __webpack_require__(196);
 	
 	var isEnabled = _require6.isEnabled;
 	
-	var _require7 = __webpack_require__(361);
+	var _require7 = __webpack_require__(362);
 	
 	var createOriginalSources = _require7.createOriginalSources;
 	var getOriginalSourceTexts = _require7.getOriginalSourceTexts;
 	var createSourceMap = _require7.createSourceMap;
 	var makeOriginalSource = _require7.makeOriginalSource;
 	var getGeneratedSource = _require7.getGeneratedSource;
 	
-	var _require8 = __webpack_require__(347);
+	var _require8 = __webpack_require__(348);
 	
 	var getSource = _require8.getSource;
 	var getSourceByURL = _require8.getSourceByURL;
 	var getSourceText = _require8.getSourceText;
 	var getPendingSelectedSourceURL = _require8.getPendingSelectedSourceURL;
 	var getSourceMap = _require8.getSourceMap;
 	var getSourceMapURL = _require8.getSourceMapURL;
 	
@@ -48567,17 +48788,17 @@ var Debugger =
 	  closeTab,
 	  blackbox,
 	  togglePrettyPrint,
 	  loadSourceText,
 	  getTextForSources
 	};
 
 /***/ },
-/* 364 */
+/* 365 */
 /***/ function(module, exports) {
 
 	
 	/**
 	 * Trims the query part or reference identifier of a url string, if necessary.
 	 *
 	 * @param string url - The source url.
 	 * @return string - The shortened url.
@@ -48605,25 +48826,25 @@ var Debugger =
 	  return url && /\.jsm?$/.test(trimUrlQuery(url)) || contentType.includes("javascript");
 	}
 	
 	module.exports = {
 	  isJavaScript
 	};
 
 /***/ },
-/* 365 */
+/* 366 */
 /***/ 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/. */
 	/* global window */
 	
-	var constants = __webpack_require__(337);
+	var constants = __webpack_require__(338);
 	
 	function newTabs(tabs) {
 	  return {
 	    type: constants.ADD_TABS,
 	    value: tabs
 	  };
 	}
 	
@@ -48637,17 +48858,17 @@ var Debugger =
 	}
 	
 	module.exports = {
 	  newTabs,
 	  selectTab
 	};
 
 /***/ },
-/* 366 */
+/* 367 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var updateFrame = (() => {
 	  var _ref = _asyncToGenerator(function* (state, frame) {
 	    var originalLocation = yield getOriginalLocation(state, frame.location);
 	
 	    return Frame.update(frame, {
 	      $merge: { location: Location(originalLocation) }
@@ -48661,40 +48882,40 @@ var Debugger =
 	
 	/**
 	 * Debugger has just resumed
 	 */
 	
 	
 	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) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
 	
-	var constants = __webpack_require__(337);
-	
-	var _require = __webpack_require__(363);
+	var constants = __webpack_require__(338);
+	
+	var _require = __webpack_require__(364);
 	
 	var selectSource = _require.selectSource;
 	
-	var _require2 = __webpack_require__(331);
+	var _require2 = __webpack_require__(332);
 	
 	var PROMISE = _require2.PROMISE;
 	
-	var _require3 = __webpack_require__(262);
+	var _require3 = __webpack_require__(263);
 	
 	var Location = _require3.Location;
 	var Frame = _require3.Frame;
 	
-	var _require4 = __webpack_require__(347);
+	var _require4 = __webpack_require__(348);
 	
 	var getExpressions = _require4.getExpressions;
 	
-	var _require5 = __webpack_require__(361);
+	var _require5 = __webpack_require__(362);
 	
 	var getOriginalLocation = _require5.getOriginalLocation;
 	
-	var _require6 = __webpack_require__(323);
+	var _require6 = __webpack_require__(324);
 	
 	var asyncMap = _require6.asyncMap;
 	function resumed() {
 	  return _ref2 => {
 	    var dispatch = _ref2.dispatch;
 	    var client = _ref2.client;
 	
 	    return dispatch({
@@ -48829,173 +49050,263 @@ var Debugger =
 	 * Add expression for debugger to watch
 	 * @param expression
 	 */
 	function addExpression(expression) {
 	  return _ref11 => {
 	    var dispatch = _ref11.dispatch;
 	    var getState = _ref11.getState;
 	
+	    var id = expression.id !== undefined ? parseInt(expression.id, 10) : getExpressions(getState()).toSeq().size++;
 	    dispatch({
 	      type: constants.ADD_EXPRESSION,
-	      id: expression.id || `${ getExpressions(getState()).toSeq().size++ }`,
+	      id: id,
 	      input: expression.input
 	    });
+	    dispatch(evaluateExpressions());
 	  };
 	}
 	
 	function updateExpression(expression) {
 	  return _ref12 => {
 	    var dispatch = _ref12.dispatch;
 	
 	    dispatch({
 	      type: constants.UPDATE_EXPRESSION,
 	      id: expression.id,
 	      input: expression.input
 	    });
 	  };
 	}
 	
-	function evaluateExpressions() {
+	function deleteExpression(expression) {
 	  return _ref13 => {
 	    var dispatch = _ref13.dispatch;
-	    var getState = _ref13.getState;
-	    var client = _ref13.client;
+	
+	    dispatch({
+	      type: constants.DELETE_EXPRESSION,
+	      id: expression.id
+	    });
+	  };
+	}
+	
+	function evaluateExpressions() {
+	  return _ref14 => {
+	    var dispatch = _ref14.dispatch;
+	    var getState = _ref14.getState;
+	    var client = _ref14.client;
 	
 	    for (var expression of getExpressions(getState())) {
 	      dispatch({
 	        type: constants.EVALUATE_EXPRESSION,
 	        id: expression.id,
 	        input: expression.input,
 	        [PROMISE]: client.evaluate(expression.input)
 	      });
 	    }
 	  };
 	}
 	
 	module.exports = {
 	  addExpression,
 	  updateExpression,
+	  deleteExpression,
 	  resumed,
 	  paused,
 	  pauseOnExceptions,
 	  command,
 	  breakOnNext,
 	  selectFrame,
 	  loadObjectProperties
 	};
 
 /***/ },
-/* 367 */
+/* 368 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var constants = __webpack_require__(338);
+	
+	var _require = __webpack_require__(362);
+	
+	var clearData = _require.clearData;
+	
+	
+	function willNavigate() {
+	  clearData();
+	  return { type: constants.NAVIGATE };
+	}
+	
+	function navigate() {
+	  return _ref => {
+	    // We need to load all the sources again because they might have
+	    // come from bfcache, so we won't get a `newSource` notification.
+	    //
+	    // TODO: This seems to be buggy on the debugger server side. When
+	    // the page is loaded from bfcache, we still get sources from the
+	    // *previous* page as well. For now, emulate the current debugger
+	    // behavior by not showing sources loaded by bfcache.
+	    // return dispatch(sources.loadSources());
+	
+	    var dispatch = _ref.dispatch;
+	  };
+	}
+	
+	module.exports = {
+	  willNavigate,
+	  navigate
+	};
+
+/***/ },
+/* 369 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(368);
+	var content = __webpack_require__(370);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./App.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./App.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 368 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 370 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
 	exports.push([module.id, "/* vim:set ts=2 sw=2 sts=2 et: */\n\n/* 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 file,\n * You can obtain one at http://mozilla.org/MPL/2.0/. */\n\n* {\n  box-sizing: border-box;\n}\n\nhtml,\nbody {\n  font-family: \"SF UI Text\", sans-serif;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  width: 100%;\n}\n\n#mount {\n  display: flex;\n  height: 100%;\n}\n\n.debugger {\n  display: flex;\n  flex: 1;\n}\n\n.center-pane {\n  display: flex;\n  position: relative;\n  flex: 1;\n  background-color: #fcfcfc;\n}\n\n.editor-container {\n  display: flex;\n  flex: 1;\n}\n\n.subsettings:hover {\n  cursor: pointer;\n}\n\n.source-footer {\n  background: white;\n  position: absolute;\n  bottom: 0;\n  right: 0;\n  z-index: 100;\n  width: 100px;\n  opacity: 0.9;\n}\n\n.source-footer .command-bar {\n  float: right;\n}\n\n.command-bar > span {\n  cursor: pointer;\n  margin-right: 0.7em;\n  width: 1em;\n  height: 1.1em;\n  display: inline-block;\n  text-align: center;\n  transition: opacity 200ms;\n}\n\n.welcomebox {\n  margin: 50px auto;\n  padding: 20px;\n  font-size: 1em;\n  color: var(--theme-gray-darker);\n  font-weight: lighter;\n  text-align: center;\n  width: 100%;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 369 */
+/* 371 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(370);
+	var content = __webpack_require__(372);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./variables.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./variables.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 370 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 372 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
 	exports.push([module.id, "/* vim:set ts=2 sw=2 sts=2 et: */\n/* 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/* Variable declarations for light and dark devtools themes.\n * Colors are taken from:\n * https://developer.mozilla.org/en-US/docs/Tools/DevToolsColors.\n * Changes should be kept in sync with commandline.css and commandline.inc.css.\n */\n\n/* IMPORTANT NOTE:\n * This file is parsed in js (see client/shared/theme.js)\n * so the formatting should be consistent (i.e. no '}' inside a rule).\n */\n\n:root .theme-light {\n  --theme-body-background: white;\n  --theme-sidebar-background: white;\n  --theme-contrast-background: #e6b064;\n\n  --theme-tab-toolbar-background: #fcfcfc;\n  --theme-toolbar-background: #fcfcfc;\n  --theme-selection-background: #4c9ed9;\n  --theme-selection-background-semitransparent: rgba(76, 158, 217, 0.15);\n  --theme-selection-color: #f5f7fa;\n  --theme-splitter-color: #dde1e4;\n  --theme-breakpoint-background: #fafafa;\n  --theme-comment: #696969;\n\n  --theme-body-color: #393f4c;\n  --theme-body-color-alt: #585959;\n  --theme-body-color-inactive: #999797;\n  --theme-content-color1: #292e33;\n  --theme-content-color2: #8fa1b2;\n  --theme-content-color3: #667380;\n\n  --theme-gray: #dde1e4;\n  --theme-gray-darker: #ccd1d5;\n\n  --theme-highlight-green: #2cbb0f;\n  --theme-highlight-blue: #0088cc;\n  --theme-highlight-bluegrey: #0072ab;\n  --theme-highlight-purple: #5b5fff;\n  --theme-highlight-lightorange: #d97e00;\n  --theme-highlight-orange: #f13c00;\n  --theme-highlight-red: #ed2655;\n  --theme-highlight-pink: #b82ee5;\n\n  /* Colors used in Graphs, like performance tools. Similar colors to Chrome's timeline. */\n  --theme-graphs-green: #85d175;\n  --theme-graphs-blue: #83b7f6;\n  --theme-graphs-bluegrey: #0072ab;\n  --theme-graphs-purple: #b693eb;\n  --theme-graphs-yellow: #efc052;\n  --theme-graphs-orange: #d97e00;\n  --theme-graphs-red: #e57180;\n  --theme-graphs-grey: #cccccc;\n  --theme-graphs-full-red: #f00;\n  --theme-graphs-full-blue: #00f;\n\n  --breakpoint-active-color: rgba(44,187,15,.1);\n}\n\n:root .theme-dark {\n  --theme-body-background: #393f4c;\n  --theme-sidebar-background: #393f4c;\n  --theme-contrast-background: #ffb35b;\n\n  --theme-tab-toolbar-background: #272b35;\n  --theme-toolbar-background: #272b35;\n  --theme-selection-background: #5675B9;\n  --theme-selection-background-semitransparent: rgba(86, 117, 185, 0.5);\n  --theme-selection-color: #f5f7fa;\n  --theme-splitter-color: #454d5d;\n  --theme-breakpoint-background: #fafafa; /* Match not found */\n  --theme-comment: #757873;\n\n  --theme-body-color: #8fa1b2;\n  --theme-body-color-alt: #b6babf;\n  --theme-body-color-inactive: #8fa1b2;\n  --theme-content-color1: #a9bacb;\n  --theme-content-color2: #8fa1b2;\n  --theme-content-color3: #5f7387;\n\n  --theme-gray: #dde1e4; /* Match not found */\n  --theme-gray-darker: #ccd1d5; /* Match not found */\n\n  --theme-highlight-green: #00ff7f;\n  --theme-highlight-blue: #46afe3;\n  --theme-highlight-bluegrey: #5e88b0;\n  --theme-highlight-purple: #bcb8db;\n  --theme-highlight-lightorange: #d99b28;\n  --theme-highlight-orange: #d96629;\n  --theme-highlight-red: #eb5368;\n  --theme-highlight-pink: #df80ff;\n  --theme-highlight-gray: #e9f4fe;\n\n  /* Colors used in Graphs, like performance tools. Similar colors to Chrome's timeline. */\n  --theme-graphs-green: #70bf53;\n  --theme-graphs-blue: #46afe3;\n  --theme-graphs-bluegrey: #5e88b0;\n  --theme-graphs-purple: #df80ff;\n  --theme-graphs-yellow: #d99b28;\n  --theme-graphs-orange: #d96629;\n  --theme-graphs-red: #eb5368;\n  --theme-graphs-grey: #757873;\n  --theme-graphs-full-red: #f00;\n  --theme-graphs-full-blue: #00f;\n\n  --breakpoint-active-color: rgba(44,187,15,.1); /* Match not found */\n}\n\n:root .theme-firebug {\n  --theme-body-background: #fcfcfc;\n  --theme-sidebar-background: #fcfcfc;\n  --theme-contrast-background: #e6b064;\n\n  --theme-tab-toolbar-background: #ebeced;\n  --theme-toolbar-background: #f0f1f2;\n  --theme-selection-background: #3399ff;\n  --theme-selection-background-semitransparent: rgba(128,128,128,0.2);\n  --theme-selection-color: white;\n  --theme-splitter-color: #aabccf;\n  --theme-comment: green;\n\n  --theme-body-color: #18191a;\n  --theme-body-color-alt: #585959;\n  --theme-content-color1: #292e33;\n  --theme-content-color2: #8fa1b2;\n  --theme-content-color3: #667380;\n\n  --theme-gray: #dde1e4; /* Match not found */\n  --theme-gray-darker: #ccd1d5; /* Match not found */\n\n  --theme-highlight-green: #2cbb0f;\n  --theme-highlight-blue: #3455db;\n  --theme-highlight-bluegrey: #0072ab;\n  --theme-highlight-purple: #887ce6;\n  --theme-highlight-lightorange: #d97e00;\n  --theme-highlight-orange: #f13c00;\n  --theme-highlight-red: #e22f6f;\n  --theme-highlight-pink: #b82ee5;\n  --theme-highlight-gray: #dde1e4;\n\n  /* Colors used in Graphs, like performance tools. Mostly similar to some \"highlight-*\" colors. */\n  --theme-graphs-green: #70bf53;\n  --theme-graphs-blue: #46afe3;\n  --theme-graphs-bluegrey: #5e88b0;\n  --theme-graphs-purple: #df80ff;\n  --theme-graphs-yellow: #d99b28;\n  --theme-graphs-orange: #d96629;\n  --theme-graphs-red: #eb5368;\n  --theme-graphs-grey: #757873;\n  --theme-graphs-full-red: #f00;\n  --theme-graphs-full-blue: #00f;\n\n  --breakpoint-active-color: rgba(44,187,15,.1); /* Match not found */\n}", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 371 */
+/* 373 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// style-loader: Adds some css to the DOM by adding a <style> tag
+	
+	// load the styles
+	var content = __webpack_require__(374);
+	if(typeof content === 'string') content = [[module.id, content, '']];
+	// add the styles to the DOM
+	var update = __webpack_require__(358)(content, {});
+	if(content.locals) module.exports = content.locals;
+	// Hot Module Replacement
+	if(false) {
+		// When the styles change, update the <style> tags
+		if(!content.locals) {
+			module.hot.accept("!!./../../../../node_modules/css-loader/index.js!./light-theme.css", function() {
+				var newContent = require("!!./../../../../node_modules/css-loader/index.js!./light-theme.css");
+				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
+				update(newContent);
+			});
+		}
+		// When the module is disposed, remove the <style> tags
+		module.hot.dispose(function() { update(); });
+	}
+
+/***/ },
+/* 374 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
+	// imports
+	
+	
+	// module
+	exports.push([module.id, "/* vim:set ts=2 sw=2 sts=2 et: */\n/* 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\nbody {\n  margin: 0;\n}\n\n.theme-body {\n  background: var(--theme-body-background);\n  color: var(--theme-body-color);\n}\n\n.theme-sidebar {\n  background: var(--theme-sidebar-background);\n  color: var(--theme-body-color);\n}\n\n::-moz-selection {\n  background-color: var(--theme-selection-background);\n  color: var(--theme-selection-color);\n}\n\n.theme-bg-darker {\n  background: var(--theme-selection-background-semitransparent);\n}\n\n.theme-selected,\n.CodeMirror-hint-active {\n  background-color: var(--theme-selection-background);\n  color: var(--theme-selection-color);\n}\n\n.theme-bg-contrast,\n.variable-or-property:not([overridden])[changed] {\n  background: var(--theme-contrast-background);\n}\n\n.theme-link,\n.cm-s-mozilla .cm-link,\n.CodeMirror-Tern-type {\n  color: var(--theme-highlight-blue);\n}\n\n/*\n * FIXME: http://bugzil.la/575675 CSS links without :visited set cause assertion\n * failures in debug builds.\n */\n.theme-link:visited,\n.cm-s-mozilla .cm-link:visited {\n  color: var(--theme-highlight-blue);\n}\n\n.theme-comment,\n.cm-s-mozilla .cm-meta,\n.cm-s-mozilla .cm-hr,\n.cm-s-mozilla .cm-comment,\n.variable-or-property .token-undefined,\n.variable-or-property .token-null,\n.CodeMirror-Tern-completion-unknown:before {\n  color: var(--theme-comment);\n}\n\n.theme-gutter {\n  background-color: var(--theme-tab-toolbar-background);\n  color: var(--theme-content-color3);\n  border-color: var(--theme-splitter-color);\n}\n\n.theme-separator { /* grey */\n  border-color: #cddae5;\n}\n\n.cm-s-mozilla .cm-unused-line {\n  text-decoration: line-through;\n  text-decoration-color: var(--theme-highlight-bluegrey);\n}\n\n.cm-s-mozilla .cm-executed-line {\n  background-color: #fcfffc;\n}\n\n.theme-fg-color1,\n.cm-s-mozilla .cm-number,\n.variable-or-property .token-number,\n.variable-or-property[return] > .title > .name,\n.variable-or-property[scope] > .title > .name {\n  color: var(--theme-highlight-purple);\n}\n\n.CodeMirror-Tern-completion-number:before {\n  background-color: hsl(72,100%,27%);\n}\n\n.theme-fg-color2,\n.cm-s-mozilla .cm-attribute,\n.cm-s-mozilla .cm-builtin,\n.cm-s-mozilla .cm-property,\n.variables-view-variable > .title > .name {\n  color: var(--theme-highlight-red);\n}\n\n.cm-s-mozilla .cm-def {\n  color: var(--theme-body-color);\n}\n\n.CodeMirror-Tern-completion-object:before {\n  background-color: hsl(208,56%,40%);\n}\n\n.theme-fg-color3,\n.cm-s-mozilla .cm-variable,\n.cm-s-mozilla .cm-tag,\n.cm-s-mozilla .cm-header,\n.cm-s-mozilla .cm-bracket,\n.cm-s-mozilla .cm-qualifier,\n.variables-view-property > .title > .name {\n  color: var(--theme-highlight-blue);\n}\n\n.CodeMirror-Tern-completion-array:before {\n  background-color: var(--theme-highlight-bluegrey);\n}\n\n.theme-fg-color4 {\n  color: var(--theme-highlight-orange);\n}\n\n.theme-fg-color5,\n.cm-s-mozilla .cm-keyword {\n  color: var(--theme-highlight-red);\n}\n\n.theme-fg-color6,\n.cm-s-mozilla .cm-string,\n.cm-s-mozilla .cm-string-2,\n.variable-or-property .token-string,\n.CodeMirror-Tern-farg {\n  color: var(--theme-highlight-purple);\n}\n\n.CodeMirror-Tern-completion-string:before,\n.CodeMirror-Tern-completion-fn:before {\n  background-color: hsl(24,85%,39%);\n}\n\n.theme-fg-color7,\n.cm-s-mozilla .cm-atom,\n.cm-s-mozilla .cm-quote,\n.cm-s-mozilla .cm-error,\n.variable-or-property .token-boolean,\n.variable-or-property .token-domnode,\n.variable-or-property[exception] > .title > .name {\n  color: var(--theme-highlight-red);\n}\n\n.CodeMirror-Tern-completion-bool:before {\n  background-color: #bf5656;\n}\n\n.variable-or-property .token-domnode {\n  font-weight: bold;\n}\n\n.theme-fg-contrast { /* To be used for text on theme-bg-contrast */\n  color: black;\n}\n\n.theme-toolbar,\n.devtools-toolbar,\n.devtools-sidebar-tabs tabs,\n.devtools-sidebar-alltabs,\n.cm-s-mozilla .CodeMirror-dialog { /* General toolbar styling */\n  color: var(--theme-body-color);\n  background-color: var(--theme-toolbar-background);\n  border-color: var(--theme-splitter-color);\n}\n\n.ruleview-swatch,\n.computedview-colorswatch {\n  box-shadow: 0 0 0 1px #c4c4c4;\n}\n\n/* CodeMirror specific styles.\n * Best effort to match the existing theme, some of the colors\n * are duplicated here to prevent weirdness in the main theme. */\n\n.CodeMirror.cm-s-mozilla { /* Inherit platform specific font sizing and styles */\n  font-family: inherit;\n  font-size: inherit;\n  background: transparent;\n}\n\n.CodeMirror.cm-s-mozilla  pre,\n.cm-s-mozilla .cm-variable-2,\n.cm-s-mozilla .cm-variable-3,\n.cm-s-mozilla .cm-operator,\n.cm-s-mozilla .cm-special {\n  color: var(--theme-body-color);\n}\n\n.cm-s-mozilla .CodeMirror-lines .CodeMirror-cursor {\n  border-left: solid 1px black;\n}\n\n.cm-s-mozilla.CodeMirror-focused .CodeMirror-selected { /* selected text (focused) */\n  background: rgb(185, 215, 253);\n}\n\n.cm-s-mozilla .CodeMirror-selected { /* selected text (unfocused) */\n  background: rgb(176, 176, 176);\n}\n\n.cm-s-mozilla .CodeMirror-activeline-background { /* selected color with alpha */\n  background: rgba(185, 215, 253, .35);\n}\n\ndiv.cm-s-mozilla span.CodeMirror-matchingbracket { /* highlight brackets */\n  outline: solid 1px rgba(0, 0, 0, .25);\n  color: black;\n}\n\n/* Highlight for a line that contains an error. */\ndiv.CodeMirror div.error-line {\n  background: rgba(255,0,0,0.2);\n}\n\n/* Generic highlighted text */\ndiv.CodeMirror span.marked-text {\n  background: rgba(255,255,0,0.2);\n  border: 1px dashed rgba(192,192,0,0.6);\n  margin-inline-start: -1px;\n  margin-inline-end: -1px;\n}\n\n/* Highlight for evaluating current statement. */\ndiv.CodeMirror span.eval-text {\n  background-color: #ccd;\n}\n\n.cm-s-mozilla .CodeMirror-linenumber { /* line number text */\n  color: var(--theme-content-color3);\n}\n\n.cm-s-mozilla .CodeMirror-gutters { /* vertical line next to line numbers */\n  border-right-color: var(--theme-splitter-color);\n  background-color: var(--theme-sidebar-background);\n}\n\n.cm-s-markup-view pre {\n  line-height: 1.4em;\n  min-height: 1.4em;\n}\n", ""]);
+	
+	// exports
+
+
+/***/ },
+/* 375 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
-	var ImPropTypes = __webpack_require__(372);
+	var ImPropTypes = __webpack_require__(376);
 	
 	var _require = __webpack_require__(2);
 	
 	var bindActionCreators = _require.bindActionCreators;
 	
 	var _require2 = __webpack_require__(15);
 	
 	var connect = _require2.connect;
 	
-	var SourcesTree = React.createFactory(__webpack_require__(373));
-	var actions = __webpack_require__(359);
-	
-	var _require3 = __webpack_require__(347);
+	var SourcesTree = React.createFactory(__webpack_require__(377));
+	var actions = __webpack_require__(360);
+	
+	var _require3 = __webpack_require__(348);
 	
 	var getSelectedSource = _require3.getSelectedSource;
 	var getSources = _require3.getSources;
 	
 	
-	__webpack_require__(394);
+	__webpack_require__(412);
 	
 	var Sources = React.createClass({
 	  propTypes: {
 	    sources: ImPropTypes.map.isRequired,
 	    selectSource: PropTypes.func.isRequired
 	  },
 	
 	  displayName: "Sources",
@@ -49009,28 +49320,28 @@ var Debugger =
 	    return dom.div({ className: "sources-panel" }, SourcesTree({ sources, selectSource }));
 	  }
 	});
 	
 	module.exports = connect(state => ({ selectedSource: getSelectedSource(state),
 	  sources: getSources(state) }), dispatch => bindActionCreators(actions, dispatch))(Sources);
 
 /***/ },
-/* 372 */
+/* 376 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
 	 * This is a straight rip-off of the React.js ReactPropTypes.js proptype validators,
 	 * modified to make it possible to validate Immutable.js data.
 	 *     ImmutableTypes.listOf is patterned after React.PropTypes.arrayOf, but for Immutable.List
 	 *     ImmutableTypes.shape  is based on React.PropTypes.shape, but for any Immutable.Iterable
 	 */
 	"use strict";
 	
-	var Immutable = __webpack_require__(340);
+	var Immutable = __webpack_require__(341);
 	
 	var ANONYMOUS = "<<anonymous>>";
 	
 	var ImmutablePropTypes = {
 	  listOf: createListOfTypeChecker,
 	  mapOf: createMapOfTypeChecker,
 	  orderedMapOf: createOrderedMapOfTypeChecker,
 	  setOf: createSetOfTypeChecker,
@@ -49213,58 +49524,43 @@ var Debugger =
 	
 	function createMapContainsChecker(shapeTypes) {
 	  return createShapeTypeChecker(shapeTypes, "Map", Immutable.Map.isMap);
 	}
 	
 	module.exports = ImmutablePropTypes;
 
 /***/ },
-/* 373 */
+/* 377 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
-	var _require = __webpack_require__(374);
+	var _require = __webpack_require__(378);
 	
 	var nodeHasChildren = _require.nodeHasChildren;
 	var createParentMap = _require.createParentMap;
 	var addToTree = _require.addToTree;
 	var collapseTree = _require.collapseTree;
 	var createTree = _require.createTree;
 	
 	
-	var classnames = __webpack_require__(375);
-	var ImPropTypes = __webpack_require__(372);
-	var Arrow = React.createFactory(__webpack_require__(376));
-	
-	var _require2 = __webpack_require__(340);
+	var classnames = __webpack_require__(379);
+	var ImPropTypes = __webpack_require__(376);
+	
+	var _require2 = __webpack_require__(341);
 	
 	var Set = _require2.Set;
 	
-	var debounce = __webpack_require__(381);
-	
-	var ManagedTree = React.createFactory(__webpack_require__(384));
-	var FolderIcon = React.createFactory(__webpack_require__(388).FolderIcon);
-	var DomainIcon = React.createFactory(__webpack_require__(388).DomainIcon);
-	var FileIcon = React.createFactory(__webpack_require__(388).FileIcon);
-	
-	var folder = FolderIcon({
-	  className: classnames("folder")
-	});
-	
-	var domain = DomainIcon({
-	  className: classnames("domain")
-	});
-	
-	var file = FileIcon({
-	  className: classnames("file")
-	});
+	var debounce = __webpack_require__(380);
+	
+	var ManagedTree = React.createFactory(__webpack_require__(383));
+	var Svg = __webpack_require__(387);
 	
 	var SourcesTree = React.createClass({
 	  propTypes: {
 	    sources: ImPropTypes.map.isRequired,
 	    selectSource: PropTypes.func.isRequired
 	  },
 	
 	  displayName: "SourcesTree",
@@ -49327,30 +49623,30 @@ var Debugger =
 	  selectItem(item) {
 	    if (!nodeHasChildren(item)) {
 	      this.props.selectSource(item.contents.get("id"));
 	    }
 	  },
 	
 	  getIcon(item, depth) {
 	    if (depth === 0) {
-	      return domain;
+	      return new Svg("domain");
 	    }
 	
 	    if (!nodeHasChildren(item)) {
-	      return file;
-	    }
-	
-	    return folder;
+	      return new Svg("file");
+	    }
+	
+	    return new Svg("folder");
 	  },
 	
 	  renderItem(item, depth, focused, _, expanded, _ref) {
 	    var setExpanded = _ref.setExpanded;
 	
-	    var arrow = Arrow({
+	    var arrow = new Svg("arrow", {
 	      className: classnames({ expanded: expanded,
 	        hidden: !nodeHasChildren(item) }),
 	      onClick: e => {
 	        e.stopPropagation();
 	        setExpanded(item, !expanded);
 	      }
 	    });
 	
@@ -49399,22 +49695,22 @@ var Debugger =
 	      }
 	    }, tree);
 	  }
 	});
 	
 	module.exports = SourcesTree;
 
 /***/ },
-/* 374 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var URL = __webpack_require__(348);
-	
-	var _require = __webpack_require__(333);
+/* 378 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var URL = __webpack_require__(349);
+	
+	var _require = __webpack_require__(334);
 	
 	var assert = _require.assert;
 	
 	
 	function nodeHasChildren(item) {
 	  return Array.isArray(item.contents);
 	}
 	
@@ -49585,17 +49881,17 @@ var Debugger =
 	  nodeHasChildren,
 	  createParentMap,
 	  addToTree,
 	  collapseTree,
 	  createTree
 	};
 
 /***/ },
-/* 375 */
+/* 379 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
 	  Copyright (c) 2016 Jed Watson.
 	  Licensed under the MIT License (MIT), see
 	  http://jedwatson.github.io/classnames
 	*/
 	/* global define */
@@ -49639,245 +49935,22 @@ var Debugger =
 			}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
 		} else {
 			window.classNames = classNames;
 		}
 	}());
 
 
 /***/ },
-/* 376 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var React = __webpack_require__(17);
-	var InlineSVG = __webpack_require__(377);
-	var dom = React.DOM;
-	
-	__webpack_require__(378);
-	
-	// This is inline because it's much faster. We need to revisit how we
-	// load SVGs, at least for components that render them several times.
-	var Arrow = props => {
-	  var className = "arrow " + (props.className || "");
-	  return dom.span(Object.assign({}, props, { className }), React.createElement(InlineSVG, {
-	    src: __webpack_require__(380)
-	  }));
-	};
-	
-	module.exports = Arrow;
-
-/***/ },
-/* 377 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	
-	Object.defineProperty(exports, '__esModule', {
-	    value: true
-	});
-	
-	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-	
-	var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
-	
-	var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
-	
-	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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
-	
-	function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-	
-	var _react = __webpack_require__(17);
-	
-	var _react2 = _interopRequireDefault(_react);
-	
-	var DOMParser = typeof window !== 'undefined' && window.DOMParser;
-	var process = process || {};
-	process.env = process.env || {};
-	var parserAvailable = typeof DOMParser !== 'undefined' && DOMParser.prototype != null && DOMParser.prototype.parseFromString != null;
-	
-	if ("production" !== process.env.NODE_ENV && !parserAvailable) {
-	    console.info('<InlineSVG />: `raw` prop works only when `window.DOMParser` exists.');
-	}
-	
-	function isParsable(src) {
-	    // kinda naive but meh, ain't gonna use full-blown parser for this
-	    return parserAvailable && typeof src === 'string' && src.trim().substr(0, 4) === '<svg';
-	}
-	
-	// parse SVG string using `DOMParser`
-	function parseFromSVGString(src) {
-	    var parser = new DOMParser();
-	    return parser.parseFromString(src, "image/svg+xml");
-	}
-	
-	// Transform DOM prop/attr names applicable to `<svg>` element but react-limited
-	function switchSVGAttrToReactProp(propName) {
-	    switch (propName) {
-	        case 'class':
-	            return 'className';
-	        default:
-	            return propName;
-	    }
-	}
-	
-	var InlineSVG = (function (_React$Component) {
-	    _inherits(InlineSVG, _React$Component);
-	
-	    _createClass(InlineSVG, null, [{
-	        key: 'defaultProps',
-	        value: {
-	            element: 'i',
-	            raw: false,
-	            src: ''
-	        },
-	        enumerable: true
-	    }, {
-	        key: 'propTypes',
-	        value: {
-	            src: _react2['default'].PropTypes.string.isRequired,
-	            element: _react2['default'].PropTypes.string,
-	            raw: _react2['default'].PropTypes.bool
-	        },
-	        enumerable: true
-	    }]);
-	
-	    function InlineSVG(props) {
-	        _classCallCheck(this, InlineSVG);
-	
-	        _get(Object.getPrototypeOf(InlineSVG.prototype), 'constructor', this).call(this, props);
-	        this._extractSVGProps = this._extractSVGProps.bind(this);
-	    }
-	
-	    // Serialize `Attr` objects in `NamedNodeMap`
-	
-	    _createClass(InlineSVG, [{
-	        key: '_serializeAttrs',
-	        value: function _serializeAttrs(map) {
-	            var ret = {};
-	            var prop = undefined;
-	            for (var i = 0; i < map.length; i++) {
-	                prop = switchSVGAttrToReactProp(map[i].name);
-	                ret[prop] = map[i].value;
-	            }
-	            return ret;
-	        }
-	
-	        // get <svg /> element props
-	    }, {
-	        key: '_extractSVGProps',
-	        value: function _extractSVGProps(src) {
-	            var map = parseFromSVGString(src).documentElement.attributes;
-	            return map.length > 0 ? this._serializeAttrs(map) : null;
-	        }
-	
-	        // get content inside <svg> element.
-	    }, {
-	        key: '_stripSVG',
-	        value: function _stripSVG(src) {
-	            return parseFromSVGString(src).documentElement.innerHTML;
-	        }
-	    }, {
-	        key: 'componentWillReceiveProps',
-	        value: function componentWillReceiveProps(_ref) {
-	            var children = _ref.children;
-	
-	            if ("production" !== process.env.NODE_ENV && children != null) {
-	                console.info('<InlineSVG />: `children` prop will be ignored.');
-	            }
-	        }
-	    }, {
-	        key: 'render',
-	        value: function render() {
-	            var Element = undefined,
-	                __html = undefined,
-	                svgProps = undefined;
-	            var _props = this.props;
-	            var element = _props.element;
-	            var raw = _props.raw;
-	            var src = _props.src;
-	
-	            var otherProps = _objectWithoutProperties(_props, ['element', 'raw', 'src']);
-	
-	            if (raw === true && isParsable(src)) {
-	                Element = 'svg';
-	                svgProps = this._extractSVGProps(src);
-	                __html = this._stripSVG(src);
-	            }
-	            __html = __html || src;
-	            Element = Element || element;
-	            svgProps = svgProps || {};
-	
-	            return _react2['default'].createElement(Element, _extends({}, svgProps, otherProps, { src: null, children: null,
-	                dangerouslySetInnerHTML: { __html: __html } }));
-	        }
-	    }]);
-	
-	    return InlineSVG;
-	})(_react2['default'].Component);
-	
-	exports['default'] = InlineSVG;
-	module.exports = exports['default'];
-
-/***/ },
-/* 378 */
-/***/ function(module, exports, __webpack_require__) {
-
-	// style-loader: Adds some css to the DOM by adding a <style> tag
-	
-	// load the styles
-	var content = __webpack_require__(379);
-	if(typeof content === 'string') content = [[module.id, content, '']];
-	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
-	if(content.locals) module.exports = content.locals;
-	// Hot Module Replacement
-	if(false) {
-		// When the styles change, update the <style> tags
-		if(!content.locals) {
-			module.hot.accept("!!./../../../../node_modules/css-loader/index.js!./Arrow.css", function() {
-				var newContent = require("!!./../../../../node_modules/css-loader/index.js!./Arrow.css");
-				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
-				update(newContent);
-			});
-		}
-		// When the module is disposed, remove the <style> tags
-		module.hot.dispose(function() { update(); });
-	}
-
-/***/ },
-/* 379 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
-	// imports
-	
-	
-	// module
-	exports.push([module.id, ".arrow svg {\n  fill: var(--theme-splitter-color);\n  margin-right: 5px;\n  margin-top: 3px;\n  transform: rotate(-90deg);\n  transition: transform 0.25s ease;\n  width: 10px;\n}\n\n.arrow.expanded svg {\n  transform: rotate(0deg);\n}\n\n.arrow.hidden {\n  visibility: hidden;\n}\n", ""]);
-	
-	// exports
-
-
-/***/ },
 /* 380 */
-/***/ function(module, exports) {
-
-	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/. --><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 16 16\"><path d=\"M8 13.4c-.5 0-.9-.2-1.2-.6L.4 5.2C0 4.7-.1 4.3.2 3.7S1 3 1.6 3h12.8c.6 0 1.2.1 1.4.7.3.6.2 1.1-.2 1.6l-6.4 7.6c-.3.4-.7.5-1.2.5z\"></path></svg>"
-
-/***/ },
-/* 381 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var isObject = __webpack_require__(212),
-	    now = __webpack_require__(382),
-	    toNumber = __webpack_require__(383);
+	    now = __webpack_require__(381),
+	    toNumber = __webpack_require__(382);
 	
 	/** Used as the `TypeError` message for "Functions" methods. */
 	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;
 	
@@ -50049,17 +50122,17 @@ var Debugger =
 	  debounced.flush = flush;
 	  return debounced;
 	}
 	
 	module.exports = debounce;
 
 
 /***/ },
-/* 382 */
+/* 381 */
 /***/ function(module, exports) {
 
 	/**
 	 * Gets the timestamp of the number of milliseconds that have elapsed since
 	 * the Unix epoch (1 January 1970 00:00:00 UTC).
 	 *
 	 * @static
 	 * @memberOf _
@@ -50076,17 +50149,17 @@ var Debugger =
 	function now() {
 	  return Date.now();
 	}
 	
 	module.exports = now;
 
 
 /***/ },
-/* 383 */
+/* 382 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var isFunction = __webpack_require__(211),
 	    isObject = __webpack_require__(212),
 	    isSymbol = __webpack_require__(241);
 	
 	/** Used as references for various `Number` constants. */
 	var NAN = 0 / 0;
@@ -50149,39 +50222,44 @@ var Debugger =
 	    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
 	    : (reIsBadHex.test(value) ? NAN : +value);
 	}
 	
 	module.exports = toNumber;
 
 
 /***/ },
-/* 384 */
+/* 383 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
-	var Tree = React.createFactory(__webpack_require__(385));
-	__webpack_require__(386);
+	var Tree = React.createFactory(__webpack_require__(384));
+	__webpack_require__(385);
 	
 	var ManagedTree = React.createClass({
 	  propTypes: Tree.propTypes,
 	
 	  displayName: "ManagedTree",
 	
 	  getInitialState() {
-	    return { expanded: new WeakMap(),
+	    return { expanded: new Set(),
 	      focusedItem: null };
 	  },
 	
-	  setExpanded(item, expanded) {
-	    var e = this.state.expanded;
-	    e.set(item, expanded);
-	    this.setState({ expanded: e });
-	
-	    if (expanded && this.props.onExpand) {
+	  setExpanded(item, isExpanded) {
+	    var expanded = this.state.expanded;
+	    var key = this.props.getKey(item);
+	    if (isExpanded) {
+	      expanded.add(key);
+	    } else {
+	      expanded.delete(key);
+	    }
+	    this.setState({ expanded });
+	
+	    if (isExpanded && this.props.onExpand) {
 	      this.props.onExpand(item);
 	    } else if (!expanded && this.props.onCollapse) {
 	      this.props.onCollapse(item);
 	    }
 	  },
 	
 	  focusItem(item) {
 	    if (!this.props.disabledFocus && this.state.focusedItem !== item) {
@@ -50197,17 +50275,17 @@ var Debugger =
 	    var _this = this;
 	
 	    var _state = this.state;
 	    var expanded = _state.expanded;
 	    var focusedItem = _state.focusedItem;
 	
 	
 	    var props = Object.assign({}, this.props, {
-	      isExpanded: item => expanded.get(item),
+	      isExpanded: item => expanded.has(this.props.getKey(item)),
 	      focused: focusedItem,
 	
 	      onExpand: item => this.setExpanded(item, true),
 	      onCollapse: item => this.setExpanded(item, false),
 	      onFocus: this.focusItem,
 	
 	      renderItem: function () {
 	        var _props;
@@ -50224,17 +50302,17 @@ var Debugger =
 	
 	    return Tree(props);
 	  }
 	});
 	
 	module.exports = ManagedTree;
 
 /***/ },
-/* 385 */
+/* 384 */
 /***/ 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/. */
 	
 	const { DOM: dom, createClass, createFactory, PropTypes } = __webpack_require__(17);
 	// const { ViewHelpers } =
@@ -50431,54 +50509,54 @@ var Debugger =
 	      scroll: 0,
 	      height: window.innerHeight,
 	      seen: new Set(),
 	    };
 	  },
 	
 	  componentDidMount() {
 	    window.addEventListener("resize", this._updateHeight);
-	    this._autoExpand();
+	    this._autoExpand(this.props);
 	    this._updateHeight();
 	  },
 	
 	  componentWillUnmount() {
 	    window.removeEventListener("resize", this._updateHeight);
 	  },
 	
 	  componentWillReceiveProps(nextProps) {
-	    this._autoExpand();
+	    this._autoExpand(nextProps);
 	    this._updateHeight();
 	  },
 	
-	  _autoExpand() {
-	    if (!this.props.autoExpandDepth) {
+	  _autoExpand(props) {
+	    if (!props.autoExpandDepth) {
 	      return;
 	    }
 	
 	    // Automatically expand the first autoExpandDepth levels for new items. Do
 	    // not use the usual DFS infrastructure because we don't want to ignore
 	    // collapsed nodes.
 	    const autoExpand = (item, currentDepth) => {
-	      if (currentDepth >= this.props.autoExpandDepth ||
+	      if (currentDepth >= props.autoExpandDepth ||
 	          this.state.seen.has(item)) {
 	        return;
 	      }
 	
-	      this.props.onExpand(item);
+	      props.onExpand(item);
 	      this.state.seen.add(item);
 	
-	      const children = this.props.getChildren(item);
+	      const children = props.getChildren(item);
 	      const length = children.length;
 	      for (let i = 0; i < length; i++) {
 	        autoExpand(children[i], currentDepth + 1);
 	      }
 	    };
 	
-	    const roots = this.props.getRoots();
+	    const roots = props.getRoots();
 	    const length = roots.length;
 	    for (let i = 0; i < length; i++) {
 	      autoExpand(roots[i], 0);
 	    }
 	  },
 	
 	  render() {
 	    const traversal = this._dfsFromRoots();
@@ -50824,221 +50902,490 @@ var Debugger =
 	    }
 	
 	    this._focus(parentIndex, parent);
 	  }),
 	});
 
 
 /***/ },
-/* 386 */
+/* 385 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(387);
+	var content = __webpack_require__(386);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../../node_modules/css-loader/index.js!./ManagedTree.css", function() {
 				var newContent = require("!!./../../../../node_modules/css-loader/index.js!./ManagedTree.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 387 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 386 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
 	exports.push([module.id, ".tree {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n\n  flex: 1;\n  white-space: nowrap;\n  overflow: auto;\n}\n\n.tree button {\n  display: block;\n}\n\n.tree .node {\n  padding: 2px 5px;\n  position: relative;\n}\n\n.tree .node.focused {\n  color: white;\n  background-color: var(--theme-selection-background);\n}\n\n.tree .node > div {\n  margin-left: 10px;\n}\n\n.tree .node.focused svg {\n  fill: white;\n}\n\n.tree-node button {\n  position: fixed;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 388 */
+/* 387 */
 /***/ function(module, exports, __webpack_require__) {
 
 	/**
 	 * This file maps the SVG React Components in the public/images directory.
 	 */
-	var Icons = __webpack_require__(389);
-	module.exports = Icons;
-
-/***/ },
-/* 389 */
+	var Svg = __webpack_require__(388);
+	module.exports = Svg;
+
+/***/ },
+/* 388 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
-	var InlineSVG = __webpack_require__(377);
-	var dom = React.DOM;
-	
-	
-	var DomainIcon = props => {
-	  return dom.span(props, React.createElement(InlineSVG, {
-	    src: __webpack_require__(390)
-	  }));
-	};
-	
-	var FileIcon = props => {
-	  return dom.span(props, React.createElement(InlineSVG, {
-	    src: __webpack_require__(391)
-	  }));
-	};
-	
-	var FolderIcon = props => {
-	  return dom.span(props, React.createElement(InlineSVG, {
-	    src: __webpack_require__(392)
-	  }));
-	};
-	
-	var WorkerIcon = props => {
-	  return dom.span(props, React.createElement(InlineSVG, {
-	    src: __webpack_require__(393)
-	  }));
-	};
-	
-	module.exports = {
-	  DomainIcon,
-	  FileIcon,
-	  FolderIcon,
-	  WorkerIcon
-	};
+	var InlineSVG = __webpack_require__(389);
+	
+	var svg = {
+	  "angle-brackets": __webpack_require__(390),
+	  "arrow": __webpack_require__(391),
+	  "blackBox": __webpack_require__(392),
+	  "breakpoint": __webpack_require__(393),
+	  "close": __webpack_require__(394),
+	  "disableBreakpoints": __webpack_require__(395),
+	  "domain": __webpack_require__(396),
+	  "file": __webpack_require__(397),
+	  "folder": __webpack_require__(398),
+	  "globe": __webpack_require__(399),
+	  "magnifying-glass": __webpack_require__(400),
+	  "pause": __webpack_require__(401),
+	  "pause-circle": __webpack_require__(402),
+	  "pause-exceptions": __webpack_require__(403),
+	  "prettyPrint": __webpack_require__(404),
+	  "resume": __webpack_require__(405),
+	  "settings": __webpack_require__(406),
+	  "stepIn": __webpack_require__(407),
+	  "stepOut": __webpack_require__(408),
+	  "stepOver": __webpack_require__(409),
+	  "subSettings": __webpack_require__(410),
+	  "worker": __webpack_require__(411)
+	};
+	
+	module.exports = function (name, props) {
+	  // eslint-disable-line
+	  if (!svg[name]) {
+	    throw new Error("Unknown SVG: " + name);
+	  }
+	  var className = props ? `${ name } ${ props.className }` : name;
+	  if (name === "subSettings") {
+	    className = "";
+	  }
+	  props = Object.assign({}, props, { className, src: svg[name] });
+	  return React.createElement(InlineSVG, props);
+	};
+
+/***/ },
+/* 389 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	
+	Object.defineProperty(exports, '__esModule', {
+	    value: true
+	});
+	
+	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+	
+	var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
+	
+	var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
+	
+	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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+	
+	function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+	
+	var _react = __webpack_require__(17);
+	
+	var _react2 = _interopRequireDefault(_react);
+	
+	var DOMParser = typeof window !== 'undefined' && window.DOMParser;
+	var process = process || {};
+	process.env = process.env || {};
+	var parserAvailable = typeof DOMParser !== 'undefined' && DOMParser.prototype != null && DOMParser.prototype.parseFromString != null;
+	
+	if ("production" !== process.env.NODE_ENV && !parserAvailable) {
+	    console.info('<InlineSVG />: `raw` prop works only when `window.DOMParser` exists.');
+	}
+	
+	function isParsable(src) {
+	    // kinda naive but meh, ain't gonna use full-blown parser for this
+	    return parserAvailable && typeof src === 'string' && src.trim().substr(0, 4) === '<svg';
+	}
+	
+	// parse SVG string using `DOMParser`
+	function parseFromSVGString(src) {
+	    var parser = new DOMParser();
+	    return parser.parseFromString(src, "image/svg+xml");
+	}
+	
+	// Transform DOM prop/attr names applicable to `<svg>` element but react-limited
+	function switchSVGAttrToReactProp(propName) {
+	    switch (propName) {
+	        case 'class':
+	            return 'className';
+	        default:
+	            return propName;
+	    }
+	}
+	
+	var InlineSVG = (function (_React$Component) {
+	    _inherits(InlineSVG, _React$Component);
+	
+	    _createClass(InlineSVG, null, [{
+	        key: 'defaultProps',
+	        value: {
+	            element: 'i',
+	            raw: false,
+	            src: ''
+	        },
+	        enumerable: true
+	    }, {
+	        key: 'propTypes',
+	        value: {
+	            src: _react2['default'].PropTypes.string.isRequired,
+	            element: _react2['default'].PropTypes.string,
+	            raw: _react2['default'].PropTypes.bool
+	        },
+	        enumerable: true
+	    }]);
+	
+	    function InlineSVG(props) {
+	        _classCallCheck(this, InlineSVG);
+	
+	        _get(Object.getPrototypeOf(InlineSVG.prototype), 'constructor', this).call(this, props);
+	        this._extractSVGProps = this._extractSVGProps.bind(this);
+	    }
+	
+	    // Serialize `Attr` objects in `NamedNodeMap`
+	
+	    _createClass(InlineSVG, [{
+	        key: '_serializeAttrs',
+	        value: function _serializeAttrs(map) {
+	            var ret = {};
+	            var prop = undefined;
+	            for (var i = 0; i < map.length; i++) {
+	                prop = switchSVGAttrToReactProp(map[i].name);
+	                ret[prop] = map[i].value;
+	            }
+	            return ret;
+	        }
+	
+	        // get <svg /> element props
+	    }, {
+	        key: '_extractSVGProps',
+	        value: function _extractSVGProps(src) {
+	            var map = parseFromSVGString(src).documentElement.attributes;
+	            return map.length > 0 ? this._serializeAttrs(map) : null;
+	        }
+	
+	        // get content inside <svg> element.
+	    }, {
+	        key: '_stripSVG',
+	        value: function _stripSVG(src) {
+	            return parseFromSVGString(src).documentElement.innerHTML;
+	        }
+	    }, {
+	        key: 'componentWillReceiveProps',
+	        value: function componentWillReceiveProps(_ref) {
+	            var children = _ref.children;
+	
+	            if ("production" !== process.env.NODE_ENV && children != null) {
+	                console.info('<InlineSVG />: `children` prop will be ignored.');
+	            }
+	        }
+	    }, {
+	        key: 'render',
+	        value: function render() {
+	            var Element = undefined,
+	                __html = undefined,
+	                svgProps = undefined;
+	            var _props = this.props;
+	            var element = _props.element;
+	            var raw = _props.raw;
+	            var src = _props.src;
+	
+	            var otherProps = _objectWithoutProperties(_props, ['element', 'raw', 'src']);
+	
+	            if (raw === true && isParsable(src)) {
+	                Element = 'svg';
+	                svgProps = this._extractSVGProps(src);
+	                __html = this._stripSVG(src);
+	            }
+	            __html = __html || src;
+	            Element = Element || element;
+	            svgProps = svgProps || {};
+	
+	            return _react2['default'].createElement(Element, _extends({}, svgProps, otherProps, { src: null, children: null,
+	                dangerouslySetInnerHTML: { __html: __html } }));
+	        }
+	    }]);
+	
+	    return InlineSVG;
+	})(_react2['default'].Component);
+	
+	exports['default'] = InlineSVG;
+	module.exports = exports['default'];
 
 /***/ },
 /* 390 */
 /***/ function(module, exports) {
 
-	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E4\"><path d=\"M9.05 4.634l-2.144.003-.116.116v1.445l.92.965.492.034.116-.116v-.617L9.13 5.7l.035-.95M12.482 10.38l-1.505-1.462H9.362l-.564.516-.034 1.108.72.768 1.323.034-.117-.116v1.2l.972 1.02.315.034.116-.116v-1.154l.422-.374.034-.927-.117.117h.26l.408-.36V10.5l-.125-.124-.575-.033\"></path><path d=\"M8.47 15.073c-3.088 0-5.6-2.513-5.6-5.602V9.4v-.003c0-.018 0-.018.002-.034l.182-.088.724.587.49.033.497.543-.034.9.317.383h.47l.114.096-.032 1.9.524.553h.105l.025-.338 1.004-.95.054-.474.53-.462v-.888l-.588-.038-1.118-1.155H4.48l-.154-.09V9.01l.155-.1h1.164v-.273l.12-.115.7.033.494-.443.034-.746-.624-.655h-.724v.28l-.11.07H4.64l-.114-.09.025-.64.48-.43v-.244h-.382c-.102 0-.152-.128-.08-.2 1.04-1.01 2.428-1.59 3.903-1.59 1.374 0 2.672.5 3.688 1.39.08.068.03.198-.075.198l-1.144-.034-.81.803.52.523v.16l-.382.388h-.158l-.176-.177v-.16l.076-.074-.252-.252-.37.362.53.53c.072.072.005.194-.096.194l-.752-.005v.844h.783L9.885 8l.16-.143h.16l.62.61v.267l.58.027.003.002V8.76l.18-.03 1.234 1.24.753-.708h.382l.116.108c0 .02.003.016.003.036v.065c0 3.09-2.515 5.603-5.605 5.603M8.47 3C4.904 3 2 5.903 2 9.47c0 3.57 2.903 6.472 6.47 6.472 3.57 0 6.472-2.903 6.472-6.47C14.942 5.9 12.04 3 8.472 3\"></path></svg>"
+	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/. --><svg viewBox=\"-1 73 16 11\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g id=\"Shape-Copy-3-+-Shape-Copy-4\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0.000000, 74.000000)\"><path d=\"M0.749321284,4.16081709 L4.43130681,0.242526751 C4.66815444,-0.00952143591 5.06030999,-0.0211407611 5.30721074,0.216574262 C5.55411149,0.454289284 5.56226116,0.851320812 5.32541353,1.103369 L1.95384971,4.69131519 L5.48809879,8.09407556 C5.73499955,8.33179058 5.74314922,8.72882211 5.50630159,8.9808703 C5.26945396,9.23291849 4.87729841,9.24453781 4.63039766,9.00682279 L0.827097345,5.34502101 C0.749816996,5.31670099 0.677016974,5.27216098 0.613753508,5.21125118 C0.427367989,5.03179997 0.377040713,4.7615583 0.465458792,4.53143559 C0.492371834,4.43667624 0.541703274,4.34676528 0.613628034,4.27022448 C0.654709457,4.22650651 0.70046335,4.19002189 0.749321284,4.16081709 Z\" id=\"Shape-Copy-3\" stroke=\"#FFFFFF\" stroke-width=\"0.05\" fill=\"#DDE1E4\"></path><path d=\"M13.7119065,5.44453032 L9.77062746,9.09174784 C9.51677479,9.3266604 9.12476399,9.31089603 8.89504684,9.05653714 C8.66532968,8.80217826 8.68489539,8.40554539 8.93874806,8.17063283 L12.5546008,4.82456128 L9.26827469,1.18571135 C9.03855754,0.931352463 9.05812324,0.534719593 9.31197591,0.299807038 C9.56582858,0.0648944831 9.95783938,0.0806588502 10.1875565,0.335017737 L13.72891,4.25625178 C13.8013755,4.28980469 13.8684335,4.3382578 13.9254821,4.40142604 C14.0883019,4.58171146 14.1258883,4.83347168 14.0435812,5.04846202 C14.0126705,5.15680232 13.9526426,5.2583679 13.8641331,5.34027361 C13.8174417,5.38348136 13.7660763,5.41820853 13.7119065,5.44453032 Z\" id=\"Shape-Copy-4\" stroke=\"#FFFFFF\" stroke-width=\"0.05\" fill=\"#DDE1E4\"></path></g></svg>"
 
 /***/ },
 /* 391 */
 /***/ function(module, exports) {
 
-	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E4\"><path d=\"M4 2v12h9V4.775L9.888 2H4zm0-1h5.888c.246 0 .483.09.666.254l3.112 2.774c.212.19.334.462.334.747V14c0 .552-.448 1-1 1H4c-.552 0-1-.448-1-1V2c0-.552.448-1 1-1z\"></path><path d=\"M9 1.5v4c0 .325.306.564.62.485l4-1c.27-.067.432-.338.365-.606-.067-.27-.338-.432-.606-.365l-4 1L10 5.5v-4c0-.276-.224-.5-.5-.5s-.5.224-.5.5z\"></path></svg>"
+	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/. --><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 16 16\"><path d=\"M8 13.4c-.5 0-.9-.2-1.2-.6L.4 5.2C0 4.7-.1 4.3.2 3.7S1 3 1.6 3h12.8c.6 0 1.2.1 1.4.7.3.6.2 1.1-.2 1.6l-6.4 7.6c-.3.4-.7.5-1.2.5z\"></path></svg>"
 
 /***/ },
 /* 392 */
 /***/ function(module, exports) {
 
-	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E5\"><path d=\"M2 5.193v7.652c0 .003-.002 0 .007 0H14v-7.69c0-.003.002 0-.007 0h-7.53v-2.15c0-.002-.004-.005-.01-.005H2.01C2 3 2 3 2 3.005V5.193zm-1 0V3.005C1 2.45 1.444 2 2.01 2h4.442c.558 0 1.01.45 1.01 1.005v1.15h6.53c.557 0 1.008.44 1.008 1v7.69c0 .553-.45 1-1.007 1H2.007c-.556 0-1.007-.44-1.007-1V5.193zM6.08 4.15H2v1h4.46v-1h-.38z\" fill-rule=\"evenodd\"></path></svg>"
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"##4A464C\"><g fill-rule=\"evenodd\"><circle cx=\"8\" cy=\"8.5\" r=\"1.5\"></circle><path d=\"M15.498 8.28l-.001-.03v-.002-.004l-.002-.018-.004-.031c0-.002 0-.002 0 0l-.004-.035.006.082c-.037-.296-.133-.501-.28-.661-.4-.522-.915-1.042-1.562-1.604-1.36-1.182-2.74-1.975-4.178-2.309a6.544 6.544 0 0 0-2.755-.042c-.78.153-1.565.462-2.369.91C3.252 5.147 2.207 6 1.252 7.035c-.216.233-.36.398-.499.577-.338.437-.338 1 0 1.437.428.552.941 1.072 1.59 1.635 1.359 1.181 2.739 1.975 4.177 2.308.907.21 1.829.223 2.756.043.78-.153 1.564-.462 2.369-.91 1.097-.612 2.141-1.464 3.097-2.499.217-.235.36-.398.498-.578.12-.128.216-.334.248-.554 0 .01 0 .01-.008.04l.013-.079-.001.011.003-.031.001-.017v.005l.001-.02v.008l.002-.03.001-.05-.001-.044v-.004-.004zm-.954.045v.007l.001.004V8.33v.012l-.001.01v-.005-.005l.002-.015-.001.008c-.002.014-.002.014 0 0l-.007.084c.003-.057-.004-.041-.014-.031-.143.182-.27.327-.468.543-.89.963-1.856 1.752-2.86 2.311-.724.404-1.419.677-2.095.81a5.63 5.63 0 0 1-2.374-.036c-1.273-.295-2.523-1.014-3.774-2.101-.604-.525-1.075-1.001-1.457-1.496-.054-.07-.054-.107 0-.177.117-.152.244-.298.442-.512.89-.963 1.856-1.752 2.86-2.311.724-.404 1.419-.678 2.095-.81a5.631 5.631 0 0 1 2.374.036c1.272.295 2.523 1.014 3.774 2.101.603.524 1.074 1 1.457 1.496.035.041.043.057.046.076 0 .01 0 .01.008.043l-.009-.047.003.02-.002-.013v-.008.016c0-.004 0-.004 0 0v-.004z\"></path></g></svg>"
 
 /***/ },
 /* 393 */
 /***/ function(module, exports) {
 
-	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E4\"><path fill-rule=\"evenodd\" d=\"M8.5 8.793L5.854 6.146l-.04-.035L7.5 4.426c.2-.2.3-.4.3-.6 0-.2-.1-.4-.2-.6l-1-1c-.4-.3-.9-.3-1.2 0l-4.1 4.1c-.2.2-.3.4-.3.6 0 .2.1.4.2.6l1 1c.3.3.9.3 1.2 0l1.71-1.71.036.04L7.793 9.5l-3.647 3.646c-.195.196-.195.512 0 .708.196.195.512.195.708 0L8.5 10.207l3.646 3.647c.196.195.512.195.708 0 .195-.196.195-.512 0-.708L9.207 9.5l2.565-2.565L13.3 8.5c.1.1 2.3 1.1 2.7.7.4-.4-.3-2.7-.5-2.9l-1.1-1.1c.1-.1.2-.4.2-.6 0-.2-.1-.4-.2-.6l-.4-.4c-.3-.3-.8-.3-1.1 0l-1.5-1.4c-.2-.2-.3-.2-.5-.2s-.3.1-.5.2L9.2 3.4c-.2.1-.2.2-.2.4s.1.4.2.5l1.874 1.92L8.5 8.792z\"></path></svg>"
+	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/. --><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 33 12\"><path id=\"base-path\" d=\"M27.1,0H1C0.4,0,0,0.4,0,1v10c0,0.6,0.4,1,1,1h26.1 c0.6,0,1.2-0.3,1.5-0.7L33,6l-4.4-5.3C28.2,0.3,27.7,0,27.1,0z\"></path></svg>"
 
 /***/ },
 /* 394 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 6 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><path d=\"M1.35191454,5.27895256 L5.31214367,1.35518468 C5.50830675,1.16082764 5.50977084,0.844248536 5.3154138,0.648085456 C5.12105677,0.451922377 4.80447766,0.450458288 4.60831458,0.644815324 L0.648085456,4.56858321 C0.451922377,4.76294025 0.450458288,5.07951935 0.644815324,5.27568243 C0.83917236,5.47184551 1.15575146,5.4733096 1.35191454,5.27895256 L1.35191454,5.27895256 Z\" id=\"Line\" stroke=\"none\" fill=\"#696969\" fill-rule=\"evenodd\"></path><path d=\"M5.31214367,4.56858321 L1.35191454,0.644815324 C1.15575146,0.450458288 0.83917236,0.451922377 0.644815324,0.648085456 C0.450458288,0.844248536 0.451922377,1.16082764 0.648085456,1.35518468 L4.60831458,5.27895256 C4.80447766,5.4733096 5.12105677,5.47184551 5.3154138,5.27568243 C5.50977084,5.07951935 5.50830675,4.76294025 5.31214367,4.56858321 L5.31214367,4.56858321 Z\" id=\"Line-Copy-2\" stroke=\"none\" fill=\"#696969\" fill-rule=\"evenodd\"></path></svg>"
+
+/***/ },
+/* 395 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"##4A464C\"><g fill-rule=\"evenodd\"><path d=\"M3.233 11.25l-.417 1H1.712C.763 12.25 0 11.574 0 10.747V6.503C0 5.675.755 5 1.712 5h4.127l-.417 1H1.597C1.257 6 1 6.225 1 6.503v4.244c0 .277.267.503.597.503h1.636zM7.405 11.27L7 12.306c.865.01 2.212-.024 2.315-.04.112-.016.112-.016.185-.035.075-.02.156-.046.251-.082.152-.056.349-.138.592-.244.415-.182.962-.435 1.612-.744l.138-.066a179.35 179.35 0 0 0 2.255-1.094c1.191-.546 1.191-2.074-.025-2.632l-.737-.34a3547.554 3547.554 0 0 0-3.854-1.78c-.029.11-.065.222-.11.336l-.232.596c.894.408 4.56 2.107 4.56 2.107.458.21.458.596 0 .806L9.197 11.27H7.405zM4.462 14.692l5-12a.5.5 0 1 0-.924-.384l-5 12a.5.5 0 1 0 .924.384z\"></path></g></svg>"
+
+/***/ },
+/* 396 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E4\"><path d=\"M9.05 4.634l-2.144.003-.116.116v1.445l.92.965.492.034.116-.116v-.617L9.13 5.7l.035-.95M12.482 10.38l-1.505-1.462H9.362l-.564.516-.034 1.108.72.768 1.323.034-.117-.116v1.2l.972 1.02.315.034.116-.116v-1.154l.422-.374.034-.927-.117.117h.26l.408-.36V10.5l-.125-.124-.575-.033\"></path><path d=\"M8.47 15.073c-3.088 0-5.6-2.513-5.6-5.602V9.4v-.003c0-.018 0-.018.002-.034l.182-.088.724.587.49.033.497.543-.034.9.317.383h.47l.114.096-.032 1.9.524.553h.105l.025-.338 1.004-.95.054-.474.53-.462v-.888l-.588-.038-1.118-1.155H4.48l-.154-.09V9.01l.155-.1h1.164v-.273l.12-.115.7.033.494-.443.034-.746-.624-.655h-.724v.28l-.11.07H4.64l-.114-.09.025-.64.48-.43v-.244h-.382c-.102 0-.152-.128-.08-.2 1.04-1.01 2.428-1.59 3.903-1.59 1.374 0 2.672.5 3.688 1.39.08.068.03.198-.075.198l-1.144-.034-.81.803.52.523v.16l-.382.388h-.158l-.176-.177v-.16l.076-.074-.252-.252-.37.362.53.53c.072.072.005.194-.096.194l-.752-.005v.844h.783L9.885 8l.16-.143h.16l.62.61v.267l.58.027.003.002V8.76l.18-.03 1.234 1.24.753-.708h.382l.116.108c0 .02.003.016.003.036v.065c0 3.09-2.515 5.603-5.605 5.603M8.47 3C4.904 3 2 5.903 2 9.47c0 3.57 2.903 6.472 6.47 6.472 3.57 0 6.472-2.903 6.472-6.47C14.942 5.9 12.04 3 8.472 3\"></path></svg>"
+
+/***/ },
+/* 397 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E4\"><path d=\"M4 2v12h9V4.775L9.888 2H4zm0-1h5.888c.246 0 .483.09.666.254l3.112 2.774c.212.19.334.462.334.747V14c0 .552-.448 1-1 1H4c-.552 0-1-.448-1-1V2c0-.552.448-1 1-1z\"></path><path d=\"M9 1.5v4c0 .325.306.564.62.485l4-1c.27-.067.432-.338.365-.606-.067-.27-.338-.432-.606-.365l-4 1L10 5.5v-4c0-.276-.224-.5-.5-.5s-.5.224-.5.5z\"></path></svg>"
+
+/***/ },
+/* 398 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E5\"><path d=\"M2 5.193v7.652c0 .003-.002 0 .007 0H14v-7.69c0-.003.002 0-.007 0h-7.53v-2.15c0-.002-.004-.005-.01-.005H2.01C2 3 2 3 2 3.005V5.193zm-1 0V3.005C1 2.45 1.444 2 2.01 2h4.442c.558 0 1.01.45 1.01 1.005v1.15h6.53c.557 0 1.008.44 1.008 1v7.69c0 .553-.45 1-1.007 1H2.007c-.556 0-1.007-.44-1.007-1V5.193zM6.08 4.15H2v1h4.46v-1h-.38z\" fill-rule=\"evenodd\"></path></svg>"
+
+/***/ },
+/* 399 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"14 6 13 12\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g id=\"world\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(14.000000, 6.000000)\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6.35076107,0.354 C3.25095418,0.354 0.729,2.87582735 0.729,5.9758879 C0.729,9.07544113 3.25082735,11.5972685 6.35076107,11.5972685 C9.45044113,11.5972685 11.9723953,9.07544113 11.9723953,5.97576107 C11.9723953,2.87582735 9.45044113,0.354 6.35076107,0.354 L6.35076107,0.354 Z M6.35076107,10.8289121 C3.67445071,10.8289121 1.49722956,8.65181776 1.49722956,5.97576107 C1.49722956,5.9443064 1.49900522,5.91335907 1.49976622,5.88215806 L2.20090094,6.4213266 L2.56313696,6.4213266 L2.97268183,6.8306178 L2.97268183,7.68217686 L3.32324919,8.03287105 L3.73926255,8.03287105 L3.73926255,9.79940584 L4.27386509,10.3361645 L4.4591686,10.3361645 L4.4591686,10.000183 L5.37655417,9.08343163 L5.37655417,8.73400577 L5.85585737,8.25203907 L5.85585737,7.37206934 L5.32518666,7.37206934 L4.28439226,6.33140176 L2.82225748,6.33140176 L2.82225748,5.56938704 L3.96286973,5.56938704 L3.96286973,5.23949352 L4.65068695,5.23949352 L5.11477015,4.77667865 L5.11477015,4.03001076 L4.49087694,3.40662489 L3.75359472,3.40662489 L3.75359472,3.78725175 L2.96228149,3.78725175 L2.96228149,3.28385021 L3.42217919,2.82319151 L3.42217919,2.49786399 L2.97001833,2.49786399 C3.84466106,1.64744643 5.03714814,1.12222956 6.35063424,1.12222956 C7.57292716,1.12222956 8.69020207,1.57730759 9.54442463,2.32587797 L8.46164839,2.32587797 L7.680355,3.10666403 L8.21508437,3.64088607 L7.87238068,3.98257509 L7.7165025,3.82669692 L7.85297518,3.68946324 L7.78930484,3.62566607 L7.78943167,3.62566607 L7.56011699,3.39559038 L7.55986332,3.39571722 L7.49758815,3.33318838 L7.01904595,3.78585658 L7.55910232,4.32654712 L6.8069806,4.32198112 L6.8069806,5.25864535 L7.66716433,5.25864535 L7.6723645,4.72112565 L7.81289584,4.57996014 L8.31819988,5.08653251 L8.31819988,5.41921636 L9.00703176,5.41921636 L9.03366676,5.39321553 L9.03430093,5.39194719 L10.195587,6.55259911 L10.8637451,5.88520206 L11.2018828,5.88520206 C11.2023901,5.9153884 11.2041658,5.94532107 11.2041658,5.97563424 C11.2040389,8.65181776 9.0269446,10.8289121 6.35076107,10.8289121 L6.35076107,10.8289121 Z\" id=\"Shape\" stroke=\"#DDE1E5\" stroke-width=\"0.25\" fill=\"#DDE1E5\"></path><polygon id=\"Shape\" stroke=\"#DDE1E5\" stroke-width=\"0.25\" fill=\"#DDE1E5\" points=\"6.50676608 1.61523076 4.52892694 1.61789426 4.52892694 2.95192735 5.34560683 3.76733891 5.72496536 3.76733891 5.72496536 3.1967157 6.50676608 2.41592965\"></polygon><polygon id=\"Shape\" stroke=\"#DDE1E5\" stroke-width=\"0.25\" fill=\"#DDE1E5\" points=\"9.59959714 6.88718547 8.28623788 5.57268471 8.28623788 5.57002121 6.79607294 5.57002121 6.35101474 6.01469891 6.35101474 6.96201714 6.98429362 7.59466185 8.12909136 7.59466185 8.12909136 8.70343893 8.99434843 9.56882283 9.20971144 9.56882283 9.20971144 8.50329592 9.63029081 8.08271655 9.63029081 7.3026915 9.87025949 7.3026915 10.1711082 7.00082814 10.0558167 6.88718547\"></polygon></g></svg>"
+
+/***/ },
+/* 400 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"488 384 14 14\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><path d=\"M495.5,391.5 L500.200877,396.200877\" id=\"Line\" stroke=\"#4A90E2\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><ellipse id=\"Oval-6\" stroke=\"#4A90E2\" stroke-width=\"1.25\" fill=\"#FFFFFF\" fill-rule=\"evenodd\" cx=\"493.5\" cy=\"389.5\" rx=\"4.5\" ry=\"4.5\"></ellipse></svg>"
+
+/***/ },
+/* 401 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#4A464C\"><g fill-rule=\"evenodd\"><path d=\"M6.5 12.003l.052-9a.5.5 0 1 0-1-.006l-.052 9a.5.5 0 1 0 1 .006zM13 11.997l-.05-9a.488.488 0 0 0-.477-.497.488.488 0 0 0-.473.503l.05 9a.488.488 0 0 0 .477.497.488.488 0 0 0 .473-.503z\"></path></g></svg>"
+
+/***/ },
+/* 402 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"975 569 11 11\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g id=\"Pause-circle\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(976.000000, 570.000000)\"><path d=\"M4.5,0.538639227 C2.3152037,0.538639227 0.538639227,2.31614868 0.538639227,4.5 C0.538639227,6.6847963 2.3152037,8.46136077 4.5,8.46136077 C6.6847963,8.46136077 8.46136077,6.6847963 8.46136077,4.5 C8.46136077,2.31614868 6.6847963,0.538639227 4.5,0.538639227 M4.5,9 C2.01847963,9 0,6.98152037 0,4.5 C0,2.01847963 2.01847963,0 4.5,0 C6.98152037,0 9,2.01847963 9,4.5 C9,6.98152037 6.98152037,9 4.5,9\" id=\"Fill-1-Copy\" stroke=\"#4990E2\" stroke-width=\"0.5\" fill=\"#4990E2\"></path><path d=\"M3,3 L3,6.5\" id=\"Line\" stroke=\"#4990E2\" stroke-width=\"1.15\" stroke-linecap=\"round\"></path><path d=\"M6,3 L6,6.5\" id=\"Line\" stroke=\"#4990E2\" stroke-width=\"1.15\" stroke-linecap=\"round\"></path></g></svg>"
+
+/***/ },
+/* 403 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.483 13.995H5.517l-3.512-3.512V5.516l3.512-3.512h4.966l3.512 3.512v4.967l-3.512 3.512zm4.37-9.042l-3.807-3.805A.503.503 0 0 0 10.691 1H5.309a.503.503 0 0 0-.356.148L1.147 4.953A.502.502 0 0 0 1 5.308v5.383c0 .134.053.262.147.356l3.806 3.806a.503.503 0 0 0 .356.147h5.382a.503.503 0 0 0 .355-.147l3.806-3.806A.502.502 0 0 0 15 10.69V5.308a.502.502 0 0 0-.147-.355z\"></path><path d=\"M10 10.5a.5.5 0 1 0 1 0v-5a.5.5 0 1 0-1 0v5zM5 10.5a.5.5 0 1 0 1 0v-5a.5.5 0 0 0-1 0v5z\"></path></svg>"
+
+/***/ },
+/* 404 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"##4A464C\"><path d=\"M4.525 13.21h-.472c-.574 0-.987-.154-1.24-.463-.253-.31-.38-.882-.38-1.719v-.573c0-.746-.097-1.265-.292-1.557-.196-.293-.51-.44-.945-.44v-.974c.435 0 .75-.146.945-.44.195-.292.293-.811.293-1.556v-.58c0-.833.126-1.404.379-1.712.253-.31.666-.464 1.24-.464h.472v.783h-.179c-.37 0-.628.08-.774.24-.145.159-.218.54-.218 1.141v.383c0 .824-.096 1.432-.287 1.823-.191.39-.516.679-.974.866.458.191.783.482.974.873.191.39.287.998.287 1.823v.382c0 .602.073.982.218 1.142.146.16.404.239.774.239h.18v.783zm9.502-4.752c-.43 0-.744.147-.942.44-.197.292-.296.811-.296 1.557v.573c0 .837-.125 1.41-.376 1.719-.251.309-.664.463-1.237.463h-.478v-.783h.185c.37 0 .628-.08.774-.24.145-.159.218-.539.218-1.14v-.383c0-.825.096-1.433.287-1.823.191-.39.516-.682.974-.873-.458-.187-.783-.476-.974-.866-.191-.391-.287-.999-.287-1.823v-.383c0-.602-.073-.982-.218-1.142-.146-.159-.404-.239-.774-.239h-.185v-.783h.478c.573 0 .986.155 1.237.464.25.308.376.88.376 1.712v.58c0 .673.088 1.174.263 1.503.176.329.5.493.975.493v.974z\" fill-rule=\"evenodd\"></path></svg>"
+
+/***/ },
+/* 405 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#696969\"><path d=\"M6.925 12.5l7.4-5-7.4-5v10zM6 12.5v-10c0-.785.8-1.264 1.415-.848l7.4 5c.58.392.58 1.304 0 1.696l-7.4 5C6.8 13.764 6 13.285 6 12.5z\" fill-rule=\"evenodd\"></path></svg>"
+
+/***/ },
+/* 406 */
+/***/ function(module, exports) {
+
+	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/. --><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 33 12\"><path id=\"base-path\" d=\"M27.1,0H1C0.4,0,0,0.4,0,1v10c0,0.6,0.4,1,1,1h26.1 c0.6,0,1.2-0.3,1.5-0.7L33,6l-4.4-5.3C28.2,0.3,27.7,0,27.1,0z\"></path></svg>"
+
+/***/ },
+/* 407 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#4A464C\"><g fill-rule=\"evenodd\"><path d=\"M1.5 14.042h4.095a.5.5 0 0 0 0-1H1.5a.5.5 0 1 0 0 1zM7.983 2a.5.5 0 0 1 .517.5v7.483l3.136-3.326a.5.5 0 1 1 .728.686l-4 4.243a.499.499 0 0 1-.73-.004L3.635 7.343a.5.5 0 0 1 .728-.686L7.5 9.983V3H1.536C1.24 3 1 2.776 1 2.5s.24-.5.536-.5h6.447zM10.5 14.042h4.095a.5.5 0 0 0 0-1H10.5a.5.5 0 1 0 0 1z\"></path></g></svg>"
+
+/***/ },
+/* 408 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"##4A464C\"><g fill-rule=\"evenodd\"><path d=\"M5 13.5H1a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1zM12 13.5H8a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1zM6.11 5.012A.427.427 0 0 1 6.21 5h7.083L9.646 1.354a.5.5 0 1 1 .708-.708l4.5 4.5a.498.498 0 0 1 0 .708l-4.5 4.5a.5.5 0 0 1-.708-.708L13.293 6H6.5v5.5a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .61-.488z\"></path></g></svg>"
+
+/***/ },
+/* 409 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#4A464C\"><g fill-rule=\"evenodd\"><path d=\"M13.297 6.912C12.595 4.39 10.167 2.5 7.398 2.5A5.898 5.898 0 0 0 1.5 8.398a.5.5 0 0 0 1 0A4.898 4.898 0 0 1 7.398 3.5c2.75 0 5.102 2.236 5.102 4.898v.004L8.669 7.029a.5.5 0 0 0-.338.942l4.462 1.598a.5.5 0 0 0 .651-.34.506.506 0 0 0 .02-.043l2-5a.5.5 0 1 0-.928-.372l-1.24 3.098z\"></path><circle cx=\"7\" cy=\"12\" r=\"1\"></circle></g></svg>"
+
+/***/ },
+/* 410 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#696969\"><path d=\"M12.219 7c.345 0 .635.117.869.352.234.234.351.524.351.869 0 .351-.118.652-.356.903-.238.25-.526.376-.864.376-.332 0-.615-.125-.85-.376a1.276 1.276 0 0 1-.351-.903A1.185 1.185 0 0 1 12.218 7zM8.234 7c.345 0 .635.117.87.352.234.234.351.524.351.869 0 .351-.119.652-.356.903-.238.25-.526.376-.865.376-.332 0-.613-.125-.844-.376a1.286 1.286 0 0 1-.347-.903c0-.352.114-.643.342-.874.228-.231.51-.347.85-.347zM4.201 7c.339 0 .627.117.864.352.238.234.357.524.357.869 0 .351-.119.652-.357.903-.237.25-.525.376-.864.376-.338 0-.623-.125-.854-.376A1.286 1.286 0 0 1 3 8.221 1.185 1.185 0 0 1 4.201 7z\" fill-rule=\"evenodd\"></path></svg>"
+
+/***/ },
+/* 411 */
+/***/ function(module, exports) {
+
+	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/. --><svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"#DDE1E4\"><path fill-rule=\"evenodd\" d=\"M8.5 8.793L5.854 6.146l-.04-.035L7.5 4.426c.2-.2.3-.4.3-.6 0-.2-.1-.4-.2-.6l-1-1c-.4-.3-.9-.3-1.2 0l-4.1 4.1c-.2.2-.3.4-.3.6 0 .2.1.4.2.6l1 1c.3.3.9.3 1.2 0l1.71-1.71.036.04L7.793 9.5l-3.647 3.646c-.195.196-.195.512 0 .708.196.195.512.195.708 0L8.5 10.207l3.646 3.647c.196.195.512.195.708 0 .195-.196.195-.512 0-.708L9.207 9.5l2.565-2.565L13.3 8.5c.1.1 2.3 1.1 2.7.7.4-.4-.3-2.7-.5-2.9l-1.1-1.1c.1-.1.2-.4.2-.6 0-.2-.1-.4-.2-.6l-.4-.4c-.3-.3-.8-.3-1.1 0l-1.5-1.4c-.2-.2-.3-.2-.5-.2s-.3.1-.5.2L9.2 3.4c-.2.1-.2.2-.2.4s.1.4.2.5l1.874 1.92L8.5 8.792z\"></path></svg>"
+
+/***/ },
+/* 412 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(395);
+	var content = __webpack_require__(413);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./Sources.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./Sources.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 395 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 413 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
-	exports.push([module.id, ".sources-panel {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n}\n\n.sources-list {\n  flex: 1;\n  display: flex;\n  overflow: hidden;\n  font-size: 0.75em;\n}\n\nul.sources-list {\n  list-style: none;\n  margin: 20px 0;\n  padding: 0;\n  padding-left: 10px;\n  flex: 1;\n  white-space: nowrap;\n}\n\n.sources-list ul {\n  list-style: none;\n  margin: 0.5em 0;\n  padding: 0;\n}\n\n.sources-list .source-item {\n  list-style: none;\n  white-space: nowrap;\n}\n\n.sources-list .label {\n  font-size: 1em;\n  padding-left: 10px;\n  color: var(--theme-comment);\n}\n\n.sources-list .source-item.selected {\n  background-color: var(--theme-selection-background);\n}\n\n.sources-list .source-item.selected .label {\n  color: var(--theme-selection-color);\n}\n\n.arrow,\n.folder,\n.domain,\n.file,\n.worker {\n  fill: var(--theme-splitter-color);\n}\n\n.domain,\n.file,\n.worker {\n  position: relative;\n  top: 1px;\n}\n\n.worker {\n  top: 2px;\n}\n\n.domain svg,\n.folder svg,\n.worker svg {\n  width: 15px;\n  margin-right: 5px;\n}\n\n.file svg {\n  width: 13px;\n  margin-right: 5px;\n}\n\n.tree {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n\n  flex: 1;\n  white-space: nowrap;\n  overflow: auto;\n}\n\n.tree button {\n  display: block;\n}\n\n.tree .node {\n  padding: 2px 5px;\n  position: relative;\n  cursor: pointer;\n}\n\n.tree .node:hover {\n  background: var(--theme-tab-toolbar-background);\n}\n\n.tree .node.focused {\n  color: white;\n  background-color: var(--theme-selection-background);\n}\n\n.tree .node > div {\n  margin-left: 10px;\n}\n\n.tree .node.focused svg {\n  fill: white;\n}\n\n.sources-list .tree-node button {\n  position: fixed;\n}\n", ""]);
+	exports.push([module.id, ".sources-panel {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n}\n\n.sources-list {\n  flex: 1;\n  display: flex;\n  overflow: hidden;\n  font-size: 0.75em;\n}\n\nul.sources-list {\n  list-style: none;\n  margin: 20px 0;\n  padding: 0;\n  padding-left: 10px;\n  flex: 1;\n  white-space: nowrap;\n}\n\n.sources-list ul {\n  list-style: none;\n  margin: 0.5em 0;\n  padding: 0;\n}\n\n.sources-list .source-item {\n  list-style: none;\n  white-space: nowrap;\n}\n\n.sources-list .label {\n  font-size: 1em;\n  padding-left: 10px;\n  color: var(--theme-comment);\n}\n\n.sources-list .source-item.selected {\n  background-color: var(--theme-selection-background);\n}\n\n.sources-list .source-item.selected .label {\n  color: var(--theme-selection-color);\n}\n\n.arrow,\n.folder,\n.domain,\n.file,\n.worker {\n  fill: var(--theme-splitter-color);\n}\n\n.domain,\n.file,\n.worker {\n  position: relative;\n  top: 1px;\n}\n\n.worker,\n.folder {\n  position: relative;\n  top: 2px;\n}\n\n.domain svg,\n.folder svg,\n.worker svg {\n  width: 15px;\n  margin-right: 5px;\n}\n\n.file svg {\n  width: 13px;\n  margin-right: 5px;\n}\n\n.tree {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n\n  flex: 1;\n  white-space: nowrap;\n  overflow: auto;\n}\n\n.tree button {\n  display: block;\n}\n\n.tree .node {\n  padding: 2px 5px;\n  position: relative;\n  cursor: pointer;\n}\n\n.tree .node:hover {\n  background: var(--theme-tab-toolbar-background);\n}\n\n.tree .node.focused {\n  color: white;\n  background-color: var(--theme-selection-background);\n}\n\n.tree .node > div {\n  margin-left: 10px;\n}\n\n.tree .node.focused svg {\n  fill: white;\n}\n\n.sources-list .tree-node button {\n  position: fixed;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 396 */
+/* 414 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
-	var ImPropTypes = __webpack_require__(372);
+	var ImPropTypes = __webpack_require__(376);
 	
 	var _require = __webpack_require__(2);
 	
 	var bindActionCreators = _require.bindActionCreators;
 	
 	var _require2 = __webpack_require__(15);
 	
 	var connect = _require2.connect;
 	
-	var CodeMirror = __webpack_require__(397);
+	var CodeMirror = __webpack_require__(415);
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	var _require3 = __webpack_require__(195);
 	
 	var debugGlobal = _require3.debugGlobal;
 	
 	var _require4 = __webpack_require__(196);
 	
 	var isFirefox = _require4.isFirefox;
 	
-	var _require5 = __webpack_require__(347);
+	var _require5 = __webpack_require__(348);
 	
 	var getSourceText = _require5.getSourceText;
 	var getBreakpointsForSource = _require5.getBreakpointsForSource;
 	var getSelectedSource = _require5.getSelectedSource;
 	var getSelectedFrame = _require5.getSelectedFrame;
 	
-	var _require6 = __webpack_require__(342);
+	var _require6 = __webpack_require__(343);
 	
 	var makeLocationId = _require6.makeLocationId;
 	
-	var actions = __webpack_require__(359);
-	
-	var _require7 = __webpack_require__(398);
+	var actions = __webpack_require__(360);
+	
+	var _require7 = __webpack_require__(416);
 	
 	var alignLine = _require7.alignLine;
 	var onWheel = _require7.onWheel;
 	var resizeBreakpointGutter = _require7.resizeBreakpointGutter;
 	
-	var Breakpoint = React.createFactory(__webpack_require__(399));
-	
-	__webpack_require__(400);
-	__webpack_require__(402);
-	__webpack_require__(404);
-	__webpack_require__(405);
+	var Breakpoint = React.createFactory(__webpack_require__(417));
+	
+	__webpack_require__(418);
+	__webpack_require__(420);
+	__webpack_require__(422);
+	__webpack_require__(423);
 	
 	function isSourceForFrame(source, frame) {
 	  return frame && frame.location.sourceId === source.get("id");
 	}
 	
 	var Editor = React.createClass({
 	  propTypes: {
 	    breakpoints: ImPropTypes.map.isRequired,
@@ -51050,32 +51397,34 @@ var Debugger =
 	  },
 	
 	  displayName: "Editor",
 	
 	  componentDidMount() {
 	    this.editor = CodeMirror.fromTextArea(this.refs.editor, {
 	      mode: "javascript",
 	      lineNumbers: true,
+	      theme: "mozilla",
 	      lineWrapping: false,
 	      smartIndent: false,
 	      matchBrackets: true,
 	      styleActiveLine: true,
 	      readOnly: true,
 	      gutters: ["breakpoints"]
 	    });
 	
 	    debugGlobal("cm", this.editor);
 	
 	    this.editor.on("gutterClick", this.onGutterClick);
 	
 	    if (isFirefox()) {
 	      this.editor.getScrollerElement().addEventListener("wheel", ev => onWheel(this.editor, ev));
 	    }
 	
+	    this.setText(this.props.sourceText.get("text"));
 	    resizeBreakpointGutter(this.editor);
 	  },
 	
 	  onGutterClick(cm, line, gutter, ev) {
 	    var bp = this.props.breakpoints.find(b => {
 	      return b.location.line === line + 1;
 	    });
 	
@@ -51110,26 +51459,36 @@ var Debugger =
 	    }
 	
 	    if (newSourceText.get("error")) {
 	      this.editor.setValue("Error");
 	      console.error(newSourceText.get("error"));
 	      return;
 	    }
 	
-	    // Only reset the editor text if the source has changed.
-	    // + Resetting the text will remove the breakpoints.
-	    // + Comparing the source text is probably inneficient.
-	    if (newSourceText.get("text") != this.editor.getValue()) {
-	      this.editor.setValue(newSourceText.get("text"));
-	    }
+	    this.setText(newSourceText.get("text"));
 	
 	    resizeBreakpointGutter(this.editor);
 	  },
 	
+	  // Only reset the editor text if the source has changed.
+	  // * Resetting the text will remove the breakpoints.
+	  // * Comparing the source text is probably inneficient.
+	  setText(text) {
+	    if (!text || !this.editor) {
+	      return;
+	    }
+	
+	    if (text == this.editor.getValue()) {
+	      return;
+	    }
+	
+	    this.editor.setValue(text);
+	  },
+	
 	  componentWillReceiveProps(nextProps) {
 	    // Clear the currently highlighted line
 	    if (isSourceForFrame(this.props.selectedSource, this.props.selectedFrame)) {
 	      this.clearDebugLine(this.props.selectedFrame.location.line);
 	    }
 	
 	    // Set the source text. The source text may not have been loaded
 	    // yet. On startup, the source text may not exist yet.
@@ -51171,17 +51530,17 @@ var Debugger =
 	    selectedSource: selectedSource,
 	    sourceText: getSourceText(state, selectedId),
 	    breakpoints: getBreakpointsForSource(state, selectedId),
 	    selectedFrame: getSelectedFrame(state)
 	  };
 	}, dispatch => bindActionCreators(actions, dispatch))(Editor);
 
 /***/ },
-/* 397 */
+/* 415 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// CodeMirror, copyright (c) by Marijn Haverbeke and others
 	// Distributed under an MIT license: http://codemirror.net/LICENSE
 	
 	// This is CodeMirror (http://codemirror.net), a code editor
 	// implemented in JavaScript on top of the browser's DOM.
 	//
@@ -60099,17 +60458,17 @@ var Debugger =
 	
 	  CodeMirror.version = "5.16.0";
 	
 	  return CodeMirror;
 	});
 
 
 /***/ },
-/* 398 */
+/* 416 */
 /***/ function(module, exports) {
 
 	// Maximum allowed margin (in number of lines) from top or bottom of the editor
 	// while shifting to a line which was initially out of view.
 	var MAX_VERTICAL_OFFSET = 3;
 	
 	/**
 	 * Aligns the provided line to either "top", "center" or "bottom" of the
@@ -60205,17 +60564,17 @@ var Debugger =
 	
 	module.exports = {
 	  alignLine,
 	  onWheel,
 	  resizeBreakpointGutter
 	};
 
 /***/ },
-/* 399 */
+/* 417 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	var PropTypes = React.PropTypes;
 	
 	
 	function makeMarker() {
 	  var marker = document.createElement("div");
@@ -60280,107 +60639,107 @@ var Debugger =
 	  render() {
 	    return null;
 	  }
 	});
 	
 	module.exports = Breakpoint;
 
 /***/ },
-/* 400 */
+/* 418 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(401);
+	var content = __webpack_require__(419);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../css-loader/index.js!./codemirror.css", function() {
 				var newContent = require("!!./../../css-loader/index.js!./codemirror.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 401 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 419 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
 	exports.push([module.id, "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n  color: black;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n  border-left: 1px solid black;\n  border-right: none;\n  width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n  width: auto;\n  border: 0 !important;\n  background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n\n.cm-animate-fat-cursor {\n  width: auto;\n  border: 0;\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n  background-color: #7e7;\n}\n@-moz-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@-webkit-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n  position: absolute;\n  left: 0; right: 0; top: -50px; bottom: -20px;\n  overflow: hidden;\n}\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  top: 0; bottom: 0;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3 {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  position: relative;\n  overflow: hidden;\n  background: white;\n}\n\n.CodeMirror-scroll {\n  overflow: scroll !important; /* Things will break if this is overridden */\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px; margin-right: -30px;\n  padding-bottom: 30px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 30px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actual scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  min-height: 100%;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: -30px;\n  /* Hack to make IE7 behave */\n  *zoom:1;\n  *display:inline;\n}\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  background: none !important;\n  border: none !important;\n}\n.CodeMirror-gutter-background {\n  position: absolute;\n  top: 0; bottom: 0;\n  z-index: 4;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n.CodeMirror-gutter-wrapper {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-font-variant-ligatures: none;\n  font-variant-ligatures: none;\n}\n.CodeMirror-wrap pre {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.CodeMirror-cursor {\n  position: absolute;\n  pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n  visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n  background: #ffa;\n  background: rgba(255, 255, 0, .4);\n}\n\n/* IE7 hack to prevent it from returning funny offsetTops on the spans */\n.CodeMirror span { *vertical-align: text-bottom; }\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 402 */
+/* 420 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(403);
+	var content = __webpack_require__(421);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./Editor.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./Editor.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 403 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 421 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
 	exports.push([module.id, "/* vim:set ts=2 sw=2 sts=2 et: */\n\n/* 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/**\n * There's a known codemirror flex issue with chrome that this addresses.\n * BUG https://github.com/devtools-html/debugger.html/issues/63\n */\n.editor-wrapper {\n  position: absolute;\n  height: calc(100% - 30px);\n  width: 100%;\n  top: 30px;\n  left: 0px;\n}\n\n.editor-wrapper .breakpoints {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n.editor.breakpoint svg {\n  fill: var(--theme-selection-background);\n  width: 60px;\n  height: 12px;\n  position: absolute;\n  top: 0;\n  right: -4px;\n}\n\n.editor.breakpoint:hover {\n  cursor: pointer;\n}\n\n.CodeMirror {\n  font-family: Menlo, monospace !important;\n}\n\n/* set the linenumber white when there is a breakpoint */\n.breakpoint .CodeMirror-linenumber {\n  color: white;\n}\n\n/* move the breakpoint below the linenumber */\n.breakpoint .CodeMirror-gutter-elt:last-child {\n  z-index: 0;\n}\n\n.debug-line .CodeMirror-line {\n  background-color: var(--breakpoint-active-color) !important;\n}\n\n/* Don't display the highlight color since the debug line\n   is already highlighted */\n.debug-line .CodeMirror-activeline-background {\n  display: none;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 404 */
+/* 422 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// CodeMirror, copyright (c) by Marijn Haverbeke and others
 	// Distributed under an MIT license: http://codemirror.net/LICENSE
 	
 	// TODO actually recognize syntax of TypeScript constructs
 	
 	(function(mod) {
 	  if (true) // CommonJS
-	    mod(__webpack_require__(397));
+	    mod(__webpack_require__(415));
 	  else if (typeof define == "function" && define.amd) // AMD
 	    define(["../../lib/codemirror"], mod);
 	  else // Plain browser env
 	    mod(CodeMirror);
 	})(function(CodeMirror) {
 	"use strict";
 	
 	function expressionAllowed(stream, state, backUp) {
@@ -61114,67 +61473,67 @@ var Debugger =
 	CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
 	CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
 	CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
 	
 	});
 
 
 /***/ },
-/* 405 */
+/* 423 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(406);
+	var content = __webpack_require__(424);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./codemirror.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./codemirror.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 406 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 424 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
-	exports.push([module.id, "\n.theme-body {\n  background: var(--theme-body-background);\n  color: var(--theme-body-color);\n}\n\n.theme-sidebar {\n  color: var(--theme-body-color);\n}\n\n.devtools-dark-theme .theme-sidebar {\n  background: var(--theme-sidebar-background);\n  color: var(--theme-content-color1);\n}\n\n::-moz-selection {\n  background-color: var(--theme-selection-background);\n  color: var(--theme-selection-color);\n}\n\n.theme-bg-darker {\n  background: var(--theme-selection-background-semitransparent);\n}\n\n.theme-selected,\n.CodeMirror-hint-active {\n  background-color: var(--theme-selection-background);\n  color: var(--theme-selection-color);\n}\n\n.theme-bg-contrast,\n.variable-or-property:not([overridden])[changed] {\n  background: var(--theme-contrast-background);\n}\n\n.theme-link,\n.cm-link,\n.CodeMirror-Tern-type {\n  color: var(--theme-highlight-blue);\n}\n\n.theme-link:visited,\n.cm-link:visited,\n.CodeMirror-Tern-type {\n  color: var(--theme-highlight-blue);\n}\n\n.theme-comment,\n.cm-meta,\n.cm-hr,\n.cm-comment,\n.variable-or-property .token-undefined,\n.variable-or-property .token-null,\n.CodeMirror-Tern-completion-unknown::before {\n  color: var(--theme-comment);\n}\n\n.theme-gutter {\n  background-color: var(--theme-tab-toolbar-background);\n  color: var(--theme-content-color3);\n  border-color: var(--theme-splitter-color);\n}\n\n.theme-separator {\n  border-color: var(--theme-splitter-color);\n}\n\n.theme-fg-color1,\n.cm-number,\n.variable-or-property .token-number,\n.variable-or-property[return] > .title > .name,\n.variable-or-property[scope] > .title > .name {\n  color: var(--theme-highlight-green);\n}\n\n.CodeMirror-Tern-completion-number:before {\n  background-color: hsl(72, 100%, 27%);\n}\n\n.devtools-dark-theme .CodeMirror-Tern-completion-number::before {\n  background-color: #5c9966;\n}\n\n.theme-fg-color2,\n.cm-attribute,\n.cm-variable,\n.cm-def,\n.cm-property,\n.cm-qualifier,\n.variables-view-variable > .title > .name {\n  color: var(--theme-highlight-blue);\n}\n\n.CodeMirror-Tern-completion-object::before {\n  background-color: hsl(208, 56%, 40%);\n}\n\n.devtools-dark-theme .CodeMirror-Tern-completion-object::before {\n  background-color: #3689b2;\n}\n\n.cm-unused-line {\n  text-decoration: line-through;\n  text-decoration-color: #0072ab;\n}\n\n.cm-executed-line {\n  background-color: #133c26;\n}\n\n.theme-fg-color3,\n.cm-builtin,\n.cm-tag,\n.cm-header,\n.cm-bracket,\n.variables-view-property > .title > .name {\n  color: var(--theme-highlight-bluegrey);\n}\n\n.devtools-dark-theme .theme-fg-color3,\n.devtools-dark-theme .cm-builtin,\n.devtools-dark-theme .cm-tag,\n.devtools-dark-theme .cm-header,\n.devtools-dark-theme .cm-bracket,\n.devtools-dark-theme .variables-view-property > .title > .name {\n  color: var(--theme-highlight-pink);\n}\n\n.CodeMirror-Tern-completion-array::before {\n  background-color: var(--theme-highlight-bluegrey);\n}\n\n.theme-fg-color4 {\n  color: var(--theme-highlight-orange);\n}\n\n.devtools-dark-theme .theme-fg-color4 {\n  color: var(--theme-highlight-purple);\n}\n\n.theme-fg-color5,\n.cm-keyword {\n  color: var(--theme-highlight-lightorange);\n}\n\n.theme-fg-color6,\n.cm-string,\n.cm-string-2,\n.variable-or-property .token-string,\n.CodeMirror-Tern-farg {\n  color: var(--theme-highlight-orange);\n}\n\n.CodeMirror-Tern-completion-string::before,\n.CodeMirror-Tern-completion-fn::before {\n  background-color: hsl(24, 85%, 39%);\n}\n\n.devtools-dark-theme .CodeMirror-Tern-completion-string::before,\n.devtools-dark-theme .CodeMirror-Tern-completion-fn::before {\n  background-color: #b26b47;\n}\n\n.theme-fg-color7,\n.cm-atom,\n.cm-quote,\n.cm-error,\n.variable-or-property .token-boolean,\n.variable-or-property .token-domnode,\n.variable-or-property[exception] > .title > .name {\n  color: var(--theme-highlight-red);\n}\n\n.CodeMirror-Tern-completion-bool::before {\n  background-color: #bf5656;\n}\n\n.variable-or-property .token-domnode {\n  font-weight: bold;\n}\n\n.theme-toolbar,\n.devtools-toolbar,\n.devtools-sidebar-tabs tabs,\n.devtools-sidebar-alltabs,\n.CodeMirror-dialog {\n  /* General toolbar styling */\n  color: var(--theme-body-color);\n  background-color: var(--theme-toolbar-background);\n  border-color: var(--theme-splitter-color);\n}\n\n.devtools-dark-theme .theme-toolbar,\n.devtools-dark-theme .devtools-toolbar,\n.devtools-dark-theme .devtools-sidebar-tabs tabs,\n.devtools-dark-theme .devtools-sidebar-alltabs,\n.devtools-dark-theme .CodeMirror-dialog {\n  /* General toolbar styling */\n  color: var(--theme-body-color-alt);\n  background-color: var(--theme-toolbar-background);\n  border-color: hsla(210, 8%, 5%, 0.6);\n}\n\n.theme-fg-contrast {\n  /* To be used for text on theme-bg-contrast */\n  color: black;\n}\n\n.ruleview-swatch,\n.computedview-colorswatch {\n  box-shadow: 0 0 0 1px #c4c4c4;\n}\n\n.devtools-dark-theme .ruleview-swatch,\n.devtools-dark-theme .computedview-colorswatch {\n  box-shadow: 0 0 0 1px #818181;\n}\n\n.CodeMirror {\n  /* Inherit platform specific font sizing and styles */\n  font-family: inherit;\n  font-size: 11px;\n  height: 100%;\n  background: var(--theme-body-background);\n}\n\n.devtools-dark-theme .CodeMirror {\n  background: var(--theme-body-background);\n}\n\n.CodeMirror pre,\n.cm-variable-2,\n.cm-variable-3,\n.cm-operator,\n.cm-special {\n  color: var(--theme-body-color);\n}\n\n.devtools-dark-theme .CodeMirror pre,\n.devtools-dark-theme .cm-variable-2,\n.devtools-dark-theme .cm-variable-3,\n.devtools-dark-theme .cm-operator,\n.devtools-dark-theme .cm-special {\n  color: var(--theme-content-color1);\n}\n\n.CodeMirror-lines .CodeMirror-cursor {\n  border-left: solid 1px black;\n}\n\n.devtools-dark-theme .CodeMirror-lines .CodeMirror-cursor {\n  border-left: solid 1px #ffffff;\n}\n\n.CodeMirror-focused .CodeMirror-selected {\n  /* selected text (focused) */\n  background: rgb(185, 215, 253);\n}\n\n.CodeMirror-selected {\n  /* selected text (unfocused) */\n  background: rgb(176, 176, 176);\n}\n\n.CodeMirror-activeline-background {\n  /* selected color with alpha */\n  background: rgba(185, 215, 253, 0.35);\n}\n\n.devtools-dark-theme .CodeMirror-activeline-background {\n  background: rgba(185, 215, 253, 0.15);\n}\n\ndiv.cm-s-mozilla span.CodeMirror-matchingbracket {\n  /* highlight brackets */\n  outline: solid 1px rgba(0, 0, 0, 0.25);\n  color: black;\n}\n\n.devtools-dark-theme div span.CodeMirror-matchingbracket {\n  outline: solid 1px rgba(255, 255, 255, .25);\n  color: white;\n}\n\n/* Highlight for a line that contains an error. */\ndiv.CodeMirror div.error-line {\n  background: rgba(255, 0, 0, 0.2);\n}\n\n/* Generic highlighted text */\ndiv.CodeMirror span.marked-text {\n  background: rgba(255, 255, 0, 0.2);\n  border: 1px dashed rgba(192, 192, 0, 0.6);\n  -moz-margin-start: -1px;\n  -moz-margin-end: -1px;\n}\n\n/* Highlight for evaluating current statement. */\ndiv.CodeMirror span.eval-text {\n  background-color: #ccccdd;\n}\n\n.devtools-dark-theme div.CodeMirror span.eval-text {\n  background-color: #555566;\n}\n\n.CodeMirror-linenumber {\n  /* line number text */\n  color: var(--theme-content-color3);\n}\n\n.CodeMirror-gutters {\n  /* vertical line next to line numbers */\n  border-right-color: var(--theme-toolbar-background);\n  background-color: var(--theme-breakpoint-background);\n}\n\n.cm-s-markup-view pre {\n  line-height: 1.4em;\n  min-height: 1.4em;\n}\n\n.CodeMirror-Tern-fname {\n  color: #f7f7f7;\n}\n\n.CodeMirror-hints,\n.CodeMirror-Tern-tooltip {\n  box-shadow: 0 0 4px rgba(128, 128, 128, 0.5);\n  background-color: var(--theme-sidebar-background);\n}\n\n.devtools-dark-theme .CodeMirror-hints,\n.devtools-dark-theme .CodeMirror-Tern-tooltip {\n  box-shadow: 0 0 4px rgba(255, 255, 255, 0.3);\n  background-color: #0f171f;\n  color: var(--theme-body-color);\n}\n", ""]);
+	exports.push([module.id, "\n.theme-body {\n  background: var(--theme-body-background);\n  color: var(--theme-body-color);\n}\n\n.theme-sidebar {\n  color: var(--theme-body-color);\n}\n\n.devtools-dark-theme .theme-sidebar {\n  background: var(--theme-sidebar-background);\n  color: var(--theme-content-color1);\n}\n\n::-moz-selection {\n  background-color: var(--theme-selection-background);\n  color: var(--theme-selection-color);\n}\n\n.theme-bg-darker {\n  background: var(--theme-selection-background-semitransparent);\n}\n\n.theme-selected,\n.CodeMirror-hint-active {\n  background-color: var(--theme-selection-background);\n  color: var(--theme-selection-color);\n}\n\n.theme-bg-contrast,\n.variable-or-property:not([overridden])[changed] {\n  background: var(--theme-contrast-background);\n}\n\n.theme-link,\n.cm-link,\n.CodeMirror-Tern-type {\n  color: var(--theme-highlight-blue);\n}\n\n.theme-link:visited,\n.cm-link:visited,\n.CodeMirror-Tern-type {\n  color: var(--theme-highlight-blue);\n}\n\n.theme-comment,\n.cm-meta,\n.cm-hr,\n.cm-comment,\n.variable-or-property .token-undefined,\n.variable-or-property .token-null,\n.CodeMirror-Tern-completion-unknown::before {\n  color: var(--theme-comment);\n}\n\n.theme-gutter {\n  background-color: var(--theme-tab-toolbar-background);\n  color: var(--theme-content-color3);\n  border-color: var(--theme-splitter-color);\n}\n\n.theme-separator {\n  border-color: var(--theme-splitter-color);\n}\n\n.theme-fg-color1,\n.cm-number,\n.variable-or-property .token-number,\n.variable-or-property[return] > .title > .name,\n.variable-or-property[scope] > .title > .name {\n  color: var(--theme-highlight-green);\n}\n\n.CodeMirror-Tern-completion-number:before {\n  background-color: hsl(72, 100%, 27%);\n}\n\n.devtools-dark-theme .CodeMirror-Tern-completion-number::before {\n  background-color: #5c9966;\n}\n\n.theme-fg-color2,\n.cm-attribute,\n.cm-variable,\n.cm-def,\n.cm-property,\n.cm-qualifier,\n.variables-view-variable > .title > .name {\n  color: var(--theme-highlight-blue);\n}\n\n.CodeMirror-Tern-completion-object::before {\n  background-color: hsl(208, 56%, 40%);\n}\n\n.devtools-dark-theme .CodeMirror-Tern-completion-object::before {\n  background-color: #3689b2;\n}\n\n.cm-unused-line {\n  text-decoration: line-through;\n  text-decoration-color: #0072ab;\n}\n\n.cm-executed-line {\n  background-color: #133c26;\n}\n\n.theme-fg-color3,\n.cm-builtin,\n.cm-tag,\n.cm-header,\n.cm-bracket,\n.variables-view-property > .title > .name {\n  color: var(--theme-highlight-bluegrey);\n}\n\n.devtools-dark-theme .theme-fg-color3,\n.devtools-dark-theme .cm-builtin,\n.devtools-dark-theme .cm-tag,\n.devtools-dark-theme .cm-header,\n.devtools-dark-theme .cm-bracket,\n.devtools-dark-theme .variables-view-property > .title > .name {\n  color: var(--theme-highlight-pink);\n}\n\n.CodeMirror-Tern-completion-array::before {\n  background-color: var(--theme-highlight-bluegrey);\n}\n\n.theme-fg-color4 {\n  color: var(--theme-highlight-orange);\n}\n\n.devtools-dark-theme .theme-fg-color4 {\n  color: var(--theme-highlight-purple);\n}\n\n.theme-fg-color5,\n.cm-keyword {\n  color: var(--theme-highlight-lightorange);\n}\n\n.theme-fg-color6,\n.cm-string,\n.cm-string-2,\n.variable-or-property .token-string,\n.CodeMirror-Tern-farg {\n  color: var(--theme-highlight-orange);\n}\n\n.CodeMirror-Tern-completion-string::before,\n.CodeMirror-Tern-completion-fn::before {\n  background-color: hsl(24, 85%, 39%);\n}\n\n.devtools-dark-theme .CodeMirror-Tern-completion-string::before,\n.devtools-dark-theme .CodeMirror-Tern-completion-fn::before {\n  background-color: #b26b47;\n}\n\n.theme-fg-color7,\n.cm-atom,\n.cm-quote,\n.cm-error,\n.variable-or-property .token-boolean,\n.variable-or-property .token-domnode,\n.variable-or-property[exception] > .title > .name {\n  color: var(--theme-highlight-red);\n}\n\n.CodeMirror-Tern-completion-bool::before {\n  background-color: #bf5656;\n}\n\n.variable-or-property .token-domnode {\n  font-weight: bold;\n}\n\n.theme-toolbar,\n.devtools-toolbar,\n.devtools-sidebar-tabs tabs,\n.devtools-sidebar-alltabs,\n.CodeMirror-dialog {\n  /* General toolbar styling */\n  color: var(--theme-body-color);\n  background-color: var(--theme-toolbar-background);\n  border-color: var(--theme-splitter-color);\n}\n\n.devtools-dark-theme .theme-toolbar,\n.devtools-dark-theme .devtools-toolbar,\n.devtools-dark-theme .devtools-sidebar-tabs tabs,\n.devtools-dark-theme .devtools-sidebar-alltabs,\n.devtools-dark-theme .CodeMirror-dialog {\n  /* General toolbar styling */\n  color: var(--theme-body-color-alt);\n  background-color: var(--theme-toolbar-background);\n  border-color: hsla(210, 8%, 5%, 0.6);\n}\n\n.theme-fg-contrast {\n  /* To be used for text on theme-bg-contrast */\n  color: black;\n}\n\n.ruleview-swatch,\n.computedview-colorswatch {\n  box-shadow: 0 0 0 1px #c4c4c4;\n}\n\n.devtools-dark-theme .ruleview-swatch,\n.devtools-dark-theme .computedview-colorswatch {\n  box-shadow: 0 0 0 1px #818181;\n}\n\n.CodeMirror.cm-s-mozilla {\n  /* Inherit platform specific font sizing and styles */\n  font-family: inherit;\n  font-size: 11px;\n  height: 100%;\n  background: var(--theme-body-background);\n}\n\n\n.devtools-dark-theme .CodeMirror {\n  background: var(--theme-body-background);\n}\n\n.CodeMirror pre,\n.cm-variable-2,\n.cm-variable-3,\n.cm-operator,\n.cm-special {\n  color: var(--theme-body-color);\n}\n\n.devtools-dark-theme .CodeMirror pre,\n.devtools-dark-theme .cm-variable-2,\n.devtools-dark-theme .cm-variable-3,\n.devtools-dark-theme .cm-operator,\n.devtools-dark-theme .cm-special {\n  color: var(--theme-content-color1);\n}\n\n.CodeMirror-lines .CodeMirror-cursor {\n  border-left: solid 1px black;\n}\n\n.devtools-dark-theme .CodeMirror-lines .CodeMirror-cursor {\n  border-left: solid 1px #ffffff;\n}\n\n.CodeMirror-focused .CodeMirror-selected {\n  /* selected text (focused) */\n  background: rgb(185, 215, 253);\n}\n\n.CodeMirror-selected {\n  /* selected text (unfocused) */\n  background: rgb(176, 176, 176);\n}\n\n.CodeMirror-activeline-background {\n  /* selected color with alpha */\n  background: rgba(185, 215, 253, 0.35);\n}\n\n.devtools-dark-theme .CodeMirror-activeline-background {\n  background: rgba(185, 215, 253, 0.15);\n}\n\ndiv.cm-s-mozilla span.CodeMirror-matchingbracket {\n  /* highlight brackets */\n  outline: solid 1px rgba(0, 0, 0, 0.25);\n  color: black;\n}\n\n.devtools-dark-theme div span.CodeMirror-matchingbracket {\n  outline: solid 1px rgba(255, 255, 255, .25);\n  color: white;\n}\n\n/* Highlight for a line that contains an error. */\ndiv.CodeMirror div.error-line {\n  background: rgba(255, 0, 0, 0.2);\n}\n\n/* Generic highlighted text */\ndiv.CodeMirror span.marked-text {\n  background: rgba(255, 255, 0, 0.2);\n  border: 1px dashed rgba(192, 192, 0, 0.6);\n  -moz-margin-start: -1px;\n  -moz-margin-end: -1px;\n}\n\n/* Highlight for evaluating current statement. */\ndiv.CodeMirror span.eval-text {\n  background-color: #ccccdd;\n}\n\n.devtools-dark-theme div.CodeMirror span.eval-text {\n  background-color: #555566;\n}\n\n.CodeMirror-linenumber {\n  /* line number text */\n  color: var(--theme-content-color3);\n}\n\n.CodeMirror-gutters {\n  /* vertical line next to line numbers */\n  border-right-color: var(--theme-toolbar-background);\n  background-color: var(--theme-breakpoint-background);\n}\n\n.cm-s-markup-view pre {\n  line-height: 1.4em;\n  min-height: 1.4em;\n}\n\n.CodeMirror-Tern-fname {\n  color: #f7f7f7;\n}\n\n.CodeMirror-hints,\n.CodeMirror-Tern-tooltip {\n  box-shadow: 0 0 4px rgba(128, 128, 128, 0.5);\n  background-color: var(--theme-sidebar-background);\n}\n\n.devtools-dark-theme .CodeMirror-hints,\n.devtools-dark-theme .CodeMirror-Tern-tooltip {\n  box-shadow: 0 0 4px rgba(255, 255, 255, 0.3);\n  background-color: #0f171f;\n  color: var(--theme-body-color);\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 407 */
+/* 425 */
 /***/ 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/. */
 	
 	var React = __webpack_require__(17);
 	var ReactDOM = __webpack_require__(176);
-	var Draggable = React.createFactory(__webpack_require__(408));
-	__webpack_require__(409);
+	var Draggable = React.createFactory(__webpack_require__(426));
+	__webpack_require__(427);
 	
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	
 	var SplitBox = React.createClass({
 	  propTypes: {
 	    left: PropTypes.any.isRequired,
@@ -61212,17 +61571,17 @@ var Debugger =
 	      onMove: x => this.onMove(x) }), dom.div({ className: rightFlex ? "controlled" : "uncontrolled",
 	      style: { width: rightFlex ? width : null } }, right));
 	  }
 	});
 	
 	module.exports = SplitBox;
 
 /***/ },
-/* 408 */
+/* 426 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	var ReactDOM = __webpack_require__(176);
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	
@@ -61266,94 +61625,93 @@ var Debugger =
 	      onMouseDown: this.startDragging
 	    });
 	  }
 	});
 	
 	module.exports = Draggable;
 
 /***/ },
-/* 409 */
+/* 427 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(410);
+	var content = __webpack_require__(428);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./SplitBox.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./SplitBox.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 410 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 428 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
 	exports.push([module.id, ".split-box {\n  display: flex;\n  flex: 1;\n  min-width: 0;\n}\n\n.split-box .uncontrolled {\n  display: flex;\n  flex: 1;\n  min-width: 0;\n  overflow: auto;\n}\n\n.split-box .controlled {\n  display: flex;\n  overflow: auto;\n}\n\n.split-box .splitter {\n  background-color: var(--theme-splitter-color);\n  border-bottom-width: 0;\n  border-color: white;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-style: solid;\n  border-top-width: 0;\n  box-sizing: content-box;\n  cursor: ew-resize;\n  flex: 0 0 1px;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 411 */
+/* 429 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	var dom = React.DOM;
 	
 	var _require = __webpack_require__(15);
 	
 	var connect = _require.connect;
 	
 	var _require2 = __webpack_require__(2);
 	
 	var bindActionCreators = _require2.bindActionCreators;
 	
-	var _require3 = __webpack_require__(347);
+	var _require3 = __webpack_require__(348);
 	
 	var getPause = _require3.getPause;
 	var getIsWaitingOnBreak = _require3.getIsWaitingOnBreak;
 	var getShouldPauseOnExceptions = _require3.getShouldPauseOnExceptions;
 	
 	var _require4 = __webpack_require__(196);
 	
 	var isEnabled = _require4.isEnabled;
 	
-	var actions = __webpack_require__(359);
-	var Breakpoints = React.createFactory(__webpack_require__(412));
-	var Expressions = React.createFactory(__webpack_require__(432));
-	var Scopes = React.createFactory(__webpack_require__(435));
-	var Frames = React.createFactory(__webpack_require__(469));
-	var Accordion = React.createFactory(__webpack_require__(472));
-	__webpack_require__(475);
-	
-	function debugBtn(onClick, type) {
-	  var className = arguments.length <= 2 || arguments[2] === undefined ? "active" : arguments[2];
-	
+	var Svg = __webpack_require__(387);
+	
+	var actions = __webpack_require__(360);
+	var Breakpoints = React.createFactory(__webpack_require__(430));
+	var Expressions = React.createFactory(__webpack_require__(450));
+	var Scopes = React.createFactory(__webpack_require__(483));
+	var Frames = React.createFactory(__webpack_require__(490));
+	var Accordion = React.createFactory(__webpack_require__(493));
+	__webpack_require__(496);
+	
+	function debugBtn(onClick, type, className, tooltip) {
 	  className = `${ type } ${ className }`;
-	
-	  return dom.span({ onClick, className, key: type }, dom.img({ src: `images/${ type }.svg` }));
+	  return dom.span({ onClick, className, key: type }, Svg(type, { title: tooltip }));
 	}
 	
 	function getItems() {
 	  var items = [{ header: "Breakpoints",
 	    component: Breakpoints,
 	    opened: true }, { header: "Call Stack",
 	    component: Frames }, { header: "Scopes",
 	    component: Scopes }];
@@ -61370,64 +61728,64 @@ var Debugger =
 	  var command = _ref.command;
 	  var breakOnNext = _ref.breakOnNext;
 	  var pause = _ref.pause;
 	  var isWaitingOnBreak = _ref.isWaitingOnBreak;
 	  var pauseOnExceptions = _ref.pauseOnExceptions;
 	  var shouldPauseOnExceptions = _ref.shouldPauseOnExceptions;
 	
 	  return dom.div({ className: "right-sidebar",
-	    style: { overflowX: "hidden" } }, dom.div({ className: "command-bar" }, pause ? [debugBtn(() => command({ type: "resume" }), "resume"), debugBtn(() => command({ type: "stepOver" }), "stepOver"), debugBtn(() => command({ type: "stepIn" }), "stepIn"), debugBtn(() => command({ type: "stepOut" }), "stepOut")] : [isWaitingOnBreak ? debugBtn(null, "pause", "disabled") : debugBtn(breakOnNext, "pause"), debugBtn(null, "stepOver", "disabled"), debugBtn(null, "stepIn", "disabled"), debugBtn(null, "stepOut", "disabled")], debugBtn(() => command({ type: "disableBreakpoints" }), "disableBreakpoints", "disabled"), debugBtn(() => pauseOnExceptions(!shouldPauseOnExceptions), "pause-exceptions", shouldPauseOnExceptions ? "enabled" : "disabled"), debugBtn(() => command({ type: "subSettings" }), "subSettings")), Accordion({
+	    style: { overflowX: "hidden" } }, dom.div({ className: "command-bar" }, pause ? [debugBtn(() => command({ type: "resume" }), "resume", "active", "Click to resume (F8)"), debugBtn(() => command({ type: "stepOver" }), "stepOver", "active", "Step Over (F10)"), debugBtn(() => command({ type: "stepIn" }), "stepIn", "active", "Step In (F11)"), debugBtn(() => command({ type: "stepOut" }), "stepOut", "active", "Step Out \u21E7 (F12)")] : [isWaitingOnBreak ? debugBtn(null, "pause", "disabled", "Click to resume (F8)") : debugBtn(breakOnNext, "pause", "Click to resume (F8)"), debugBtn(null, "stepOver", "disabled", "Step Over (F10)"), debugBtn(null, "stepIn", "disabled", "Step In (F11)"), debugBtn(null, "stepOut", "disabled", "Step Out \u21E7 (F12)")], debugBtn(() => command({ type: "disableBreakpoints" }), "disableBreakpoints", "disabled", "Disable Breakpoints"), debugBtn(() => pauseOnExceptions(!shouldPauseOnExceptions), "pause-exceptions", shouldPauseOnExceptions ? "enabled" : "disabled", "Toggle Pause on Exceptions"), debugBtn(() => command({ type: "subSettings" }), "subSettings", "", "Settings")), Accordion({
 	    items: getItems()
 	  }));
 	}
 	
 	module.exports = connect(state => ({
 	  pause: getPause(state),
 	  isWaitingOnBreak: getIsWaitingOnBreak(state),
 	  shouldPauseOnExceptions: getShouldPauseOnExceptions(state)
 	}), dispatch => bindActionCreators(actions, dispatch))(RightSidebar);
 
 /***/ },
-/* 412 */
+/* 430 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	
 	var _require = __webpack_require__(15);
 	
 	var connect = _require.connect;
 	
 	var _require2 = __webpack_require__(2);
 	
 	var bindActionCreators = _require2.bindActionCreators;
 	
-	var ImPropTypes = __webpack_require__(372);
-	var Isvg = React.createFactory(__webpack_require__(413));
-	var classnames = __webpack_require__(375);
-	var actions = __webpack_require__(359);
-	
-	var _require3 = __webpack_require__(347);
+	var ImPropTypes = __webpack_require__(376);
+	var Isvg = React.createFactory(__webpack_require__(431));
+	var classnames = __webpack_require__(379);
+	var actions = __webpack_require__(360);
+	
+	var _require3 = __webpack_require__(348);
 	
 	var getSource = _require3.getSource;
 	var getPause = _require3.getPause;
 	var getBreakpoints = _require3.getBreakpoints;
 	
-	var _require4 = __webpack_require__(342);
+	var _require4 = __webpack_require__(343);
 	
 	var makeLocationId = _require4.makeLocationId;
 	
-	var _require5 = __webpack_require__(323);
+	var _require5 = __webpack_require__(324);
 	
 	var truncateStr = _require5.truncateStr;
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	
-	__webpack_require__(430);
+	__webpack_require__(448);
 	
 	function isCurrentlyPausedAtBreakpoint(state, breakpoint) {
 	  var pause = getPause(state);
 	  if (!pause || pause.get("isInterrupted")) {
 	    return false;
 	  }
 	
 	  var bpId = makeLocationId(breakpoint.location);
@@ -61510,44 +61868,44 @@ var Debugger =
 	  });
 	}
 	
 	module.exports = connect((state, props) => ({
 	  breakpoints: _getBreakpoints(state)
 	}), dispatch => bindActionCreators(actions, dispatch))(Breakpoints);
 
 /***/ },
-/* 413 */
+/* 431 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
 	
 	var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 	
 	var _react = __webpack_require__(17);
 	
 	var _react2 = _interopRequireDefault(_react);
 	
-	var _once = __webpack_require__(414);
+	var _once = __webpack_require__(432);
 	
 	var _once2 = _interopRequireDefault(_once);
 	
-	var _httpplease = __webpack_require__(416);
+	var _httpplease = __webpack_require__(434);
 	
 	var _httpplease2 = _interopRequireDefault(_httpplease);
 	
-	var _oldiexdomain = __webpack_require__(426);
+	var _oldiexdomain = __webpack_require__(444);
 	
 	var _oldiexdomain2 = _interopRequireDefault(_oldiexdomain);
 	
-	var _shouldComponentUpdate = __webpack_require__(428);
+	var _shouldComponentUpdate = __webpack_require__(446);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 	
 	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 	
 	function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
 	
 	function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
@@ -61841,20 +62199,20 @@ var Debugger =
 	  supportTest: isSupportedEnvironment,
 	  uniquifyIDs: true,
 	  cacheGetRequests: false
 	};
 	exports.default = InlineSVG;
 	module.exports = exports['default'];
 
 /***/ },
-/* 414 */
-/***/ function(module, exports, __webpack_require__) {
-
-	var wrappy = __webpack_require__(415)
+/* 432 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var wrappy = __webpack_require__(433)
 	module.exports = wrappy(once)
 	
 	once.proto = once(function () {
 	  Object.defineProperty(Function.prototype, 'once', {
 	    value: function () {
 	      return once(this)
 	    },
 	    configurable: true
@@ -61868,17 +62226,17 @@ var Debugger =
 	    return f.value = fn.apply(this, arguments)
 	  }
 	  f.called = false
 	  return f
 	}
 
 
 /***/ },
-/* 415 */
+/* 433 */
 /***/ function(module, exports) {
 
 	// Returns a wrapper function that returns a wrapped callback
 	// The wrapper function should do some stuff, and return a
 	// presumably different callback function.
 	// This makes sure that own properties are retained, so that
 	// decorations and such are not lost along the way.
 	module.exports = wrappy
@@ -61907,30 +62265,30 @@ var Debugger =
 	      })
 	    }
 	    return ret
 	  }
 	}
 
 
 /***/ },
-/* 416 */
+/* 434 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	var
-	  cleanURL = __webpack_require__(417),
-	  XHR = __webpack_require__(418),
-	  delay = __webpack_require__(419),
-	  RequestError = __webpack_require__(420),
-	  Response = __webpack_require__(421),
-	  Request = __webpack_require__(422),
-	  extend = __webpack_require__(424),
-	  once = __webpack_require__(425);
+	  cleanURL = __webpack_require__(435),
+	  XHR = __webpack_require__(436),
+	  delay = __webpack_require__(437),
+	  RequestError = __webpack_require__(438),
+	  Response = __webpack_require__(439),
+	  Request = __webpack_require__(440),
+	  extend = __webpack_require__(442),
+	  once = __webpack_require__(443);
 	
 	var i,
 	    createError = RequestError.create;
 	
 	function factory(defaults, plugins) {
 	  defaults = defaults || {};
 	  plugins = plugins || [];
 	
@@ -62125,39 +62483,39 @@ var Debugger =
 	        'The server returned a status of ' + xhr.status +
 	        ' for the request "' +
 	        req.method.toUpperCase() + ' ' + req.url + '"';
 	  return createError(msg, req);
 	}
 
 
 /***/ },
-/* 417 */
+/* 435 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	module.exports = {
 	  processRequest: function(req) {
 	    req.url = req.url.replace(/[^%]+/g, function(s) {
 	      return encodeURI(s);
 	    });
 	  }
 	};
 
 
 /***/ },
-/* 418 */
+/* 436 */
 /***/ function(module, exports) {
 
 	module.exports = window.XMLHttpRequest;
 
 
 /***/ },
-/* 419 */
+/* 437 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	// Wrap a function in a `setTimeout` call. This is used to guarantee async
 	// behavior, which can avoid unexpected errors.
 	
 	module.exports = function(fn) {
@@ -62168,24 +62526,24 @@ var Debugger =
 	        return fn.apply(null, args);
 	      };
 	    setTimeout(newFunc, 0);
 	  };
 	};
 
 
 /***/ },
-/* 420 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	
-	var Response = __webpack_require__(421);
-	var extractResponseProps = __webpack_require__(423);
-	var extend = __webpack_require__(424);
+/* 438 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	
+	var Response = __webpack_require__(439);
+	var extractResponseProps = __webpack_require__(441);
+	var extend = __webpack_require__(442);
 	
 	function RequestError(message, props) {
 	  var err = new Error(message);
 	  err.name = 'RequestError';
 	  this.name = err.name;
 	  this.message = err.message;
 	  if (err.stack) {
 	    this.stack = err.stack;
@@ -62210,23 +62568,23 @@ var Debugger =
 	  Response.call(err, extractResponseProps(req));
 	  return err;
 	};
 	
 	module.exports = RequestError;
 
 
 /***/ },
-/* 421 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	
-	var Request = __webpack_require__(422);
-	var extractResponseProps = __webpack_require__(423);
+/* 439 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	
+	var Request = __webpack_require__(440);
+	var extractResponseProps = __webpack_require__(441);
 	
 	function Response(props) {
 	  this.request = props.request;
 	  this.xhr = props.xhr;
 	  this.headers = props.headers || {};
 	  this.status = props.status || 0;
 	  this.text = props.text;
 	  this.body = props.body;
@@ -62240,17 +62598,17 @@ var Debugger =
 	  return new Response(extractResponseProps(req));
 	};
 	
 	
 	module.exports = Response;
 
 
 /***/ },
-/* 422 */
+/* 440 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	function Request(optsOrUrl) {
 	  var opts = typeof optsOrUrl === 'string' ? {url: optsOrUrl} : optsOrUrl || {};
 	  this.method = opts.method ? opts.method.toUpperCase() : 'GET';
 	  this.url = opts.url;
@@ -62289,22 +62647,22 @@ var Debugger =
 	  }
 	};
 	
 	
 	module.exports = Request;
 
 
 /***/ },
-/* 423 */
-/***/ function(module, exports, __webpack_require__) {
-
-	'use strict';
-	
-	var extend = __webpack_require__(424);
+/* 441 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+	
+	var extend = __webpack_require__(442);
 	
 	module.exports = function(req) {
 	  var xhr = req.xhr;
 	  var props = {request: req, xhr: xhr};
 	
 	  // Try to create the response from the request. If the request was aborted,
 	  // accesssing properties of the XHR may throw an error, so we wrap in a
 	  // try/catch.
@@ -62328,17 +62686,17 @@ var Debugger =
 	    });
 	  } catch (err) {}
 	
 	  return props;
 	};
 
 
 /***/ },
-/* 424 */
+/* 442 */
 /***/ function(module, exports) {
 
 	module.exports = extend
 	
 	function extend() {
 	    var target = {}
 	
 	    for (var i = 0; i < arguments.length; i++) {
@@ -62351,17 +62709,17 @@ var Debugger =
 	        }
 	    }
 	
 	    return target
 	}
 
 
 /***/ },
-/* 425 */
+/* 443 */
 /***/ function(module, exports) {
 
 	'use strict';
 	
 	// A "once" utility.
 	module.exports = function(fn) {
 	  var result, called = false;
 	  return function() {
@@ -62370,24 +62728,24 @@ var Debugger =
 	      result = fn.apply(this, arguments);
 	    }
 	    return result;
 	  };
 	};
 
 
 /***/ },
-/* 426 */
+/* 444 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	var
-	  urllite = __webpack_require__(427),
-	  once = __webpack_require__(425);
+	  urllite = __webpack_require__(445),
+	  once = __webpack_require__(443);
 	
 	var warningShown = false;
 	
 	var supportsXHR = once(function() {
 	  return (
 	    typeof window !== 'undefined' &&
 	    window !== null &&
 	    window.XMLHttpRequest &&
@@ -62444,17 +62802,17 @@ var Debugger =
 	      xdr.setRequestHeader = function() {}; // Ignore request headers.
 	      return xdr;
 	    }
 	  }
 	};
 
 
 /***/ },
-/* 427 */
+/* 445 */
 /***/ function(module, exports) {
 
 	(function() {
 	  var URL, URL_PATTERN, defaults, urllite,
 	    __hasProp = {}.hasOwnProperty;
 	
 	  URL_PATTERN = /^(?:(?:([^:\/?\#]+:)\/+|(\/\/))(?:([a-z0-9-\._~%]+)(?::([a-z0-9-\._~%]+))?@)?(([a-z0-9-\._~%!$&'()*+,;=]+)(?::([0-9]+))?)?)?([^?\#]*?)(\?[^\#]*)?(\#.*)?$/;
 	
@@ -62515,28 +62873,28 @@ var Debugger =
 	  };
 	
 	  module.exports = urllite;
 	
 	}).call(this);
 
 
 /***/ },
-/* 428 */
+/* 446 */
 /***/ function(module, exports, __webpack_require__) {
 
 	'use strict';
 	
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
 	exports.shouldComponentUpdate = shouldComponentUpdate;
 	exports.shouldComponentUpdateContext = shouldComponentUpdateContext;
 	
-	var _shallowEqual = __webpack_require__(429);
+	var _shallowEqual = __webpack_require__(447);
 	
 	var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
 	
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 	
 	/**
 	 *  @module PureRender
 	 */
@@ -62568,17 +62926,17 @@ var Debugger =
 	 */
 	function shouldComponentUpdateContext(nextProps, nextState, nextContext) {
 	  return !(0, _shallowEqual2.default)(this.props, nextProps) || !(0, _shallowEqual2.default)(this.state, nextState) || !(0, _shallowEqual2.default)(this.context, nextContext);
 	}
 	
 	exports.default = { shouldComponentUpdate: shouldComponentUpdate, shouldComponentUpdateContext: shouldComponentUpdateContext };
 
 /***/ },
-/* 429 */
+/* 447 */
 /***/ function(module, exports) {
 
 	/**
 	 * Copyright (c) 2013-present, 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
@@ -62639,212 +62997,2764 @@ var Debugger =
 	  }
 	
 	  return true;
 	}
 	
 	module.exports = shallowEqual;
 
 /***/ },
-/* 430 */
+/* 448 */
 /***/ function(module, exports, __webpack_require__) {
 
 	// style-loader: Adds some css to the DOM by adding a <style> tag
 	
 	// load the styles
-	var content = __webpack_require__(431);
+	var content = __webpack_require__(449);
 	if(typeof content === 'string') content = [[module.id, content, '']];
 	// add the styles to the DOM
-	var update = __webpack_require__(357)(content, {});
+	var update = __webpack_require__(358)(content, {});
 	if(content.locals) module.exports = content.locals;
 	// Hot Module Replacement
 	if(false) {
 		// When the styles change, update the <style> tags
 		if(!content.locals) {
 			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./Breakpoints.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./Breakpoints.css");
 				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
 				update(newContent);
 			});
 		}
 		// When the module is disposed, remove the <style> tags
 		module.hot.dispose(function() { update(); });
 	}
 
 /***/ },
-/* 431 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 449 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
-	exports.push([module.id, ".breakpoints-list .breakpoint {\n  font-size: 12px;\n  list-style: none;\n  color: var(--theme-content-color1);\n  margin: 0.5em 0;\n  line-height: 1em;\n}\n\n/*\n.breakpoints-list .breakpoint.paused {\n}\n*/\n\n.breakpoints-list .breakpoint.disabled .breakpoint-label {\n  color: var(--theme-content-color3);\n  transition: color 0.5s linear;\n}\n\n.breakpoints-list .breakpoint:hover {\n  cursor: pointer;\n  background-color: var(--theme-toolbar-background);\n}\n\n.breakpoints-list .breakpoint-label {\n  display: inline-block;\n}\n\n.breakpoints-list .pause-indicator {\n  float: right;\n}\n", ""]);
+	exports.push([module.id, ".breakpoints-list .breakpoint {\n  font-size: 12px;\n  color: var(--theme-content-color1);\n  margin: 0.5em 0;\n  line-height: 1em;\n  display: flex;\n  flex-flow: row;\n  align-items: center;\n}\n\n.breakpoints-list .breakpoint input {\n  flex: 0 1 content;\n  order: 1;\n}\n\n/*\n.breakpoints-list .breakpoint.paused {\n}\n*/\n\n.breakpoints-list .breakpoint.disabled .breakpoint-label {\n  color: var(--theme-content-color3);\n  transition: color 0.5s linear;\n}\n\n.breakpoints-list .breakpoint:hover {\n  cursor: pointer;\n  background-color: var(--theme-toolbar-background);\n}\n\n.breakpoints-list .breakpoint-label {\n  flex: 1 0 auto;\n  order: 2;\n}\n\n.breakpoints-list .pause-indicator {\n  flex: 0 1 content;\n  order: 3;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 432 */
+/* 450 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	
 	var _require = __webpack_require__(15);
 	
 	var connect = _require.connect;
 	
 	var _require2 = __webpack_require__(2);
 	
 	var bindActionCreators = _require2.bindActionCreators;
 	
-	var ImPropTypes = __webpack_require__(372);
+	var ImPropTypes = __webpack_require__(376);
 	// const classnames = require("classnames");
-	var actions = __webpack_require__(359);
-	
-	var _require3 = __webpack_require__(347);
+	var Svg = __webpack_require__(387);
+	var actions = __webpack_require__(360);
+	
+	var _require3 = __webpack_require__(348);
 	
 	var getExpressions = _require3.getExpressions;
 	var getPause = _require3.getPause;
-	// const ObjectInspector = React.createFactory(require("./ObjectInspector"));
+	
+	var Rep = React.createFactory(__webpack_require__(451));
 	// const { truncateStr } = require("../utils/utils");
-	
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	
-	__webpack_require__(433);
+	__webpack_require__(481);
 	
 	var Expressions = React.createClass({
 	  propTypes: {
-	    pauseInfo: ImPropTypes.map,
 	    expressions: ImPropTypes.list,
 	    addExpression: PropTypes.func,
 	    updateExpression: PropTypes.func,
-	    evaluateExpression: PropTypes.func,
-	    loadObjectProperties: PropTypes.func,
-	    command: PropTypes.func
+	    deleteExpression: PropTypes.func
 	  },
 	
 	  displayName: "Expressions",
 	
-	  addExpression(e) {
-	    if (e.key === "Enter") {
-	      var expression = {
-	        input: e.target.value
-	      };
-	      if (e.target.id) {
-	        expression.id = e.target.id.split("-").pop();
-	      }
-	      this.props.addExpression(expression);
-	    }
-	  },
-	
-	  updateExpression(e) {
+	  inputKeyPress(e, _ref) {
+	    var id = _ref.id;
+	
+	    if (e.key !== "Enter") {
+	      return;
+	    }
+	    var addExpression = this.props.addExpression;
+	
+	    var expression = {
+	      input: e.target.value
+	    };
+	    if (id !== undefined) {
+	      expression.id = id;
+	    }
+	    e.target.value = "";
+	    addExpression(expression);
+	  },
+	
+	  updateExpression(e, _ref2) {
+	    var id = _ref2.id;
+	
+	    e.stopPropagation();
+	    var updateExpression = this.props.updateExpression;
+	
 	    var expression = {
-	      id: e.target.id.split("-").pop(),
-	      input: e.target.textContent.split(" --> ")[0]
-	    };
-	    this.props.updateExpression(expression);
+	      id,
+	      input: e.target.textContent
+	    };
+	    updateExpression(expression);
+	  },
+	
+	  renderExpressionValue(value) {
+	    if (!value) {
+	      return;
+	    }
+	    if (value.exception) {
+	      return Rep({ object: value.exception });
+	    }
+	    return Rep({ object: value.result });
+	  },
+	
+	  deleteExpression(e, expression) {
+	    e.stopPropagation();
+	    var deleteExpression = this.props.deleteExpression;
+	
+	    deleteExpression(expression);
+	  },
+	
+	  renderExpressionUpdating(expression) {
+	    return dom.span({ className: "expression-input-container" }, dom.input({ type: "text",
+	      className: "input-expression",
+	      onKeyPress: e => this.inputKeyPress(e, expression),
+	      defaultValue: expression.input,
+	      ref: c => {
+	        this._input = c;
+	      }
+	    }));
 	  },
 	
 	  renderExpression(expression) {
+	    return dom.span({ className: "expression-output-container",
+	      key: expression.id }, dom.span({ className: "expression-input",
+	      onClick: e => this.updateExpression(e, expression) }, expression.input), dom.span({ className: "expression-seperator" }, ": "), dom.span({ className: "expression-value" }, this.renderExpressionValue(expression.value)), dom.span({ className: "close-btn",
+	      onClick: e => this.deleteExpression(e, expression) }, Svg("close")));
+	  },
+	
+	  renderExpressionContainer(expression) {
 	    return dom.div({ className: "expression-container",
-	      key: expression.id }, expression.updating ? dom.input({ type: "text",
-	      className: "input-expression",
-	      id: "expressionInput-" + expression.id,
-	      placeholder: "Add watch Expression",
-	      onKeyPress: this.addExpression,
-	      defaultValue: expression.input }) : dom.span({ key: expression.id,
-	      id: "expressionOutput-" + expression.id,
-	      onClick: this.updateExpression }, expression.input + " --> " + JSON.stringify(expression.value || "Not Paused")));
+	      key: expression.id + expression.input }, expression.updating ? this.renderExpressionUpdating(expression) : this.renderExpression(expression));
+	  },
+	
+	  componentDidUpdate() {
+	    if (this._input) {
+	      this._input.focus();
+	    }
 	  },
 	
 	  render() {
 	    var expressions = this.props.expressions;
 	
 	    return dom.span({ className: "pane expressions-list" }, dom.input({ type: "text",
 	      className: "input-expression",
 	      placeholder: "Add watch Expression",
-	      onKeyPress: this.addExpression }), expressions.toSeq().map(expression => this.renderExpression(expression)));
+	      onKeyPress: e => this.inputKeyPress(e, {}) }), expressions.toSeq().map(expression => this.renderExpressionContainer(expression)));
 	  }
 	});
 	
 	module.exports = connect(state => ({ pauseInfo: getPause(state),
 	  expressions: getExpressions(state) }), dispatch => bindActionCreators(actions, dispatch))(Expressions);
 
 /***/ },
-/* 433 */
+/* 451 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var React = __webpack_require__(17);
+	var Rep = React.createFactory(__webpack_require__(452).Rep);
+	var Grip = __webpack_require__(478).Grip;
+	
+	__webpack_require__(479);
+	
+	function renderRep(_ref) {
+	  var object = _ref.object;
+	
+	  return Rep({ object, defaultRep: Grip });
+	}
+	
+	module.exports = renderRep;
+
+/***/ },
+/* 452 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+	/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+	/* 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/. */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  // Dependencies
+	  const React = __webpack_require__(17);
+	
+	  const { isGrip } = __webpack_require__(453);
+	
+	  // Load all existing rep templates
+	  const { Undefined } = __webpack_require__(454);
+	  const { Null } = __webpack_require__(456);
+	  const { StringRep } = __webpack_require__(457);
+	  const { Number } = __webpack_require__(458);
+	  const { ArrayRep } = __webpack_require__(459);
+	  const { Obj } = __webpack_require__(461);
+	
+	  // DOM types (grips)
+	  const { Attribute } = __webpack_require__(463);
+	  const { DateTime } = __webpack_require__(465);
+	  const { Document } = __webpack_require__(466);
+	  const { Event } = __webpack_require__(468);
+	  const { Func } = __webpack_require__(469);
+	  const { NamedNodeMap } = __webpack_require__(470);
+	  const { RegExp } = __webpack_require__(471);
+	  const { StyleSheet } = __webpack_require__(472);
+	  const { TextNode } = __webpack_require__(473);
+	  const { Window } = __webpack_require__(474);
+	  const { ObjectWithText } = __webpack_require__(475);
+	  const { ObjectWithURL } = __webpack_require__(476);
+	  const { GripArray } = __webpack_require__(477);
+	  const { Grip } = __webpack_require__(478);
+	
+	  // List of all registered template.
+	  // XXX there should be a way for extensions to register a new
+	  // or modify an existing rep.
+	  let reps = [
+	    RegExp,
+	    StyleSheet,
+	    Event,
+	    DateTime,
+	    TextNode,
+	    NamedNodeMap,
+	    Attribute,
+	    Func,
+	    ArrayRep,
+	    Document,
+	    Window,
+	    ObjectWithText,
+	    ObjectWithURL,
+	    GripArray,
+	    Grip,
+	    Undefined,
+	    Null,
+	    StringRep,
+	    Number,
+	  ];
+	
+	  /**
+	   * Generic rep that is using for rendering native JS types or an object.
+	   * The right template used for rendering is picked automatically according
+	   * to the current value type. The value must be passed is as 'object'
+	   * property.
+	   */
+	  const Rep = React.createClass({
+	    displayName: "Rep",
+	
+	    propTypes: {
+	      object: React.PropTypes.any,
+	      defaultRep: React.PropTypes.object,
+	    },
+	
+	    render: function () {
+	      let rep = getRep(this.props.object, this.props.defaultRep);
+	      return rep(this.props);
+	    },
+	  });
+	
+	  // Helpers
+	
+	  /**
+	   * Return a rep object that is responsible for rendering given
+	   * object.
+	   *
+	   * @param object {Object} Object to be rendered in the UI. This
+	   * can be generic JS object as well as a grip (handle to a remote
+	   * debuggee object).
+	   *
+	   * @param defaultObject {React.Component} The default template
+	   * that should be used to render given object