merge fx-team to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Wed, 10 Aug 2016 15:52:07 +0200
changeset 308813 ed7a4daa831ac3c547959854e44585dd62fad508
parent 308812 b83235ed0ea5a46e58ee9e6f402171bf908ac25f (current diff)
parent 308773 c9bbdb627b7804fee47aa6a6708647e6e589d09c (diff)
child 308884 c12bb83ad278a7884af9c70c3622dc6b4c819eaf
push id20279
push usercbook@mozilla.com
push dateWed, 10 Aug 2016 14:04:43 +0000
treeherderfx-team@531100c1d950 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone51.0a1
merge fx-team to mozilla-central a=merge
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
toolkit/components/thumbnails/PageThumbUtils.jsm
--- 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/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/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/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,
--- 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,
--- 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 if none is found.
+	   */
+	  function getRep(object, defaultRep = Obj) {
+	    let type = typeof object;
+	    if (type == "object" && object instanceof String) {
+	      type = "string";
+	    }
+	
+	    if (isGrip(object)) {
+	      type = object.class;
+	    }
+	
+	    for (let i = 0; i < reps.length; i++) {
+	      let rep = reps[i];
+	      try {
+	        // supportsObject could return weight (not only true/false
+	        // but a number), which would allow to priorities templates and
+	        // support better extensibility.
+	        if (rep.supportsObject(object, type)) {
+	          return React.createFactory(rep.rep);
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+	    }
+	
+	    return React.createFactory(defaultRep.rep);
+	  }
+	
+	  // Exports from this module
+	  exports.Rep = Rep;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 453 */
+/***/ 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);
+	
+	  /**
+	   * Create React factories for given arguments.
+	   * Example:
+	   *   const { Rep } = createFactories(require("./rep"));
+	   */
+	  function createFactories(args) {
+	    let result = {};
+	    for (let p in args) {
+	      result[p] = React.createFactory(args[p]);
+	    }
+	    return result;
+	  }
+	
+	  /**
+	   * Returns true if the given object is a grip (see RDP protocol)
+	   */
+	  function isGrip(object) {
+	    return object && object.actor;
+	  }
+	
+	  function escapeNewLines(value) {
+	    return value.replace(/\r/gm, "\\r").replace(/\n/gm, "\\n");
+	  }
+	
+	  function cropMultipleLines(text, limit) {
+	    return escapeNewLines(cropString(text, limit));
+	  }
+	
+	  function cropString(text, limit, alternativeText) {
+	    if (!alternativeText) {
+	      alternativeText = "\u2026";
+	    }
+	
+	    // Make sure it's a string.
+	    text = text + "";
+	
+	    // Use default limit if necessary.
+	    if (!limit) {
+	      limit = 50;
+	    }
+	
+	    // Crop the string only if a limit is actually specified.
+	    if (limit <= 0) {
+	      return text;
+	    }
+	
+	    // Set the limit at least to the length of the alternative text
+	    // plus one character of the original text.
+	    if (limit <= alternativeText.length) {
+	      limit = alternativeText.length + 1;
+	    }
+	
+	    let halfLimit = (limit - alternativeText.length) / 2;
+	
+	    if (text.length > limit) {
+	      return text.substr(0, Math.ceil(halfLimit)) + alternativeText +
+	        text.substr(text.length - Math.floor(halfLimit));
+	    }
+	
+	    return text;
+	  }
+	
+	  // Exports from this module
+	  exports.createFactories = createFactories;
+	  exports.isGrip = isGrip;
+	  exports.cropString = cropString;
+	  exports.cropMultipleLines = cropMultipleLines;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 454 */
+/***/ 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 { createFactories } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	
+	  /**
+	   * Renders undefined value
+	   */
+	  const Undefined = React.createClass({
+	    displayName: "UndefinedRep",
+	
+	    render: function () {
+	      return (
+	        ObjectBox({className: "undefined"},
+	          "undefined"
+	        )
+	      );
+	    },
+	  });
+	
+	  function supportsObject(object, type) {
+	    if (object && object.type && object.type == "undefined") {
+	      return true;
+	    }
+	
+	    return (type == "undefined");
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Undefined = {
+	    rep: Undefined,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 455 */
+/***/ 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 DOM = React.DOM;
+	
+	  /**
+	   * Renders a box for given object.
+	   */
+	  const ObjectBox = React.createClass({
+	    displayName: "ObjectBox",
+	
+	    render: function () {
+	      let className = this.props.className;
+	      let boxClassName = className ? " objectBox-" + className : "";
+	
+	      return (
+	        DOM.span({className: "objectBox" + boxClassName, role: "presentation"},
+	          this.props.children
+	        )
+	      );
+	    }
+	  });
+	
+	  // Exports from this module
+	  exports.ObjectBox = ObjectBox;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 456 */
+/***/ 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 { createFactories } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	
+	  /**
+	   * Renders null value
+	   */
+	  const Null = React.createClass({
+	    displayName: "NullRep",
+	
+	    render: function () {
+	      return (
+	        ObjectBox({className: "null"},
+	          "null"
+	        )
+	      );
+	    },
+	  });
+	
+	  function supportsObject(object, type) {
+	    if (object && object.type && object.type == "null") {
+	      return true;
+	    }
+	
+	    return (object == null);
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Null = {
+	    rep: Null,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 457 */
+/***/ 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 { createFactories, cropMultipleLines } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	
+	  /**
+	   * Renders a string. String value is enclosed within quotes.
+	   */
+	  const StringRep = React.createClass({
+	    displayName: "StringRep",
+	
+	    render: function () {
+	      let text = this.props.object;
+	      let member = this.props.member;
+	      if (member && member.open) {
+	        return (
+	          ObjectBox({className: "string"},
+	            "\"" + text + "\""
+	          )
+	        );
+	      }
+	
+	      return (
+	        ObjectBox({className: "string"},
+	          "\"" + cropMultipleLines(text) + "\""
+	        )
+	      );
+	    },
+	  });
+	
+	  function supportsObject(object, type) {
+	    return (type == "string");
+	  }
+	
+	  // Exports from this module
+	
+	  exports.StringRep = {
+	    rep: StringRep,
+	    supportsObject: supportsObject,
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 458 */
+/***/ 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 { createFactories } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	
+	  /**
+	   * Renders a number
+	   */
+	  const Number = React.createClass({
+	    displayName: "Number",
+	
+	    stringify: function (object) {
+	      return (Object.is(object, -0) ? "-0" : String(object));
+	    },
+	
+	    render: function () {
+	      let value = this.props.object;
+	      return (
+	        ObjectBox({className: "number"},
+	          this.stringify(value)
+	        )
+	      );
+	    }
+	  });
+	
+	  function supportsObject(object, type) {
+	    return type == "boolean" || type == "number";
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Number = {
+	    rep: Number,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 459 */
+/***/ 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 { createFactories } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	  const { Caption } = createFactories(__webpack_require__(460));
+	
+	  // Shortcuts
+	  const DOM = React.DOM;
+	
+	  /**
+	   * Renders an array. The array is enclosed by left and right bracket
+	   * and the max number of rendered items depends on the current mode.
+	   */
+	  let ArrayRep = React.createClass({
+	    displayName: "ArrayRep",
+	
+	    getTitle: function (object, context) {
+	      return "[" + object.length + "]";
+	    },
+	
+	    arrayIterator: function (array, max) {
+	      let items = [];
+	      let delim;
+	
+	      for (let i = 0; i < array.length && i <= max; i++) {
+	        try {
+	          let value = array[i];
+	
+	          delim = (i == array.length - 1 ? "" : ", ");
+	
+	          if (value === array) {
+	            items.push(Reference({
+	              key: i,
+	              object: value,
+	              delim: delim
+	            }));
+	          } else {
+	            items.push(ItemRep({
+	              key: i,
+	              object: value,
+	              delim: delim
+	            }));
+	          }
+	        } catch (exc) {
+	          items.push(ItemRep({
+	            object: exc,
+	            delim: delim,
+	            key: i
+	          }));
+	        }
+	      }
+	
+	      if (array.length > max + 1) {
+	        items.pop();
+	        items.push(Caption({
+	          key: "more",
+	          object: "more...",
+	        }));
+	      }
+	
+	      return items;
+	    },
+	
+	    /**
+	     * Returns true if the passed object is an array with additional (custom)
+	     * properties, otherwise returns false. Custom properties should be
+	     * displayed in extra expandable section.
+	     *
+	     * Example array with a custom property.
+	     * let arr = [0, 1];
+	     * arr.myProp = "Hello";
+	     *
+	     * @param {Array} array The array object.
+	     */
+	    hasSpecialProperties: function (array) {
+	      function isInteger(x) {
+	        let y = parseInt(x, 10);
+	        if (isNaN(y)) {
+	          return false;
+	        }
+	        return x === y.toString();
+	      }
+	
+	      let props = Object.getOwnPropertyNames(array);
+	      for (let i = 0; i < props.length; i++) {
+	        let p = props[i];
+	
+	        // Valid indexes are skipped
+	        if (isInteger(p)) {
+	          continue;
+	        }
+	
+	        // Ignore standard 'length' property, anything else is custom.
+	        if (p != "length") {
+	          return true;
+	        }
+	      }
+	
+	      return false;
+	    },
+	
+	    // Event Handlers
+	
+	    onToggleProperties: function (event) {
+	    },
+	
+	    onClickBracket: function (event) {
+	    },
+	
+	    render: function () {
+	      let mode = this.props.mode || "short";
+	      let object = this.props.object;
+	      let items;
+	
+	      if (mode == "tiny") {
+	        items = DOM.span({className: "length"}, object.length);
+	      } else {
+	        let max = (mode == "short") ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	      }
+	
+	      return (
+	        ObjectBox({
+	          className: "array",
+	          onClick: this.onToggleProperties},
+	          DOM.a({
+	            className: "objectLink",
+	            onclick: this.onClickBracket},
+	            DOM.span({
+	              className: "arrayLeftBracket",
+	              role: "presentation"},
+	              "["
+	            )
+	          ),
+	          items,
+	          DOM.a({
+	            className: "objectLink",
+	            onclick: this.onClickBracket},
+	            DOM.span({
+	              className: "arrayRightBracket",
+	              role: "presentation"},
+	              "]"
+	            )
+	          ),
+	          DOM.span({
+	            className: "arrayProperties",
+	            role: "group"}
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  /**
+	   * Renders array item. Individual values are separated by a comma.
+	   */
+	  let ItemRep = React.createFactory(React.createClass({
+	    displayName: "ItemRep",
+	
+	    render: function () {
+	      const { Rep } = createFactories(__webpack_require__(452));
+	
+	      let object = this.props.object;
+	      let delim = this.props.delim;
+	      return (
+	        DOM.span({},
+	          Rep({object: object}),
+	          delim
+	        )
+	      );
+	    }
+	  }));
+	
+	  /**
+	   * Renders cycle references in an array.
+	   */
+	  let Reference = React.createFactory(React.createClass({
+	    displayName: "Reference",
+	
+	    render: function () {
+	      let tooltip = "Circular reference";
+	      return (
+	        DOM.span({title: tooltip},
+	          "[...]")
+	      );
+	    }
+	  }));
+	
+	  function supportsObject(object, type) {
+	    return Array.isArray(object) ||
+	      Object.prototype.toString.call(object) === "[object Arguments]";
+	  }
+	
+	  // Exports from this module
+	  exports.ArrayRep = {
+	    rep: ArrayRep,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 460 */
+/***/ 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 DOM = React.DOM;
+	
+	  /**
+	   * Renders a caption. This template is used by other components
+	   * that needs to distinguish between a simple text/value and a label.
+	   */
+	  const Caption = React.createClass({
+	    displayName: "Caption",
+	
+	    render: function () {
+	      return (
+	        DOM.span({"className": "caption"}, this.props.object)
+	      );
+	    },
+	  });
+	
+	  // Exports from this module
+	  exports.Caption = Caption;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 461 */
+/***/ 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 { createFactories } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	  const { Caption } = createFactories(__webpack_require__(460));
+	  const { PropRep } = createFactories(__webpack_require__(462));
+	  // Shortcuts
+	  const { span } = React.DOM;
+	  /**
+	   * Renders an object. An object is represented by a list of its
+	   * properties enclosed in curly brackets.
+	   */
+	  const Obj = React.createClass({
+	    displayName: "Obj",
+	
+	    propTypes: {
+	      object: React.PropTypes.object,
+	      mode: React.PropTypes.string,
+	    },
+	
+	    getTitle: function () {
+	      return "Object";
+	    },
+	
+	    longPropIterator: function (object) {
+	      try {
+	        return this.propIterator(object, 100);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    shortPropIterator: function (object) {
+	      try {
+	        return this.propIterator(object, 3);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    propIterator: function (object, max) {
+	      let isInterestingProp = (t, value) => {
+	        // Do not pick objects, it could cause recursion.
+	        return (t == "boolean" || t == "number" || (t == "string" && value));
+	      };
+	
+	      // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=945377
+	      if (Object.prototype.toString.call(object) === "[object Generator]") {
+	        object = Object.getPrototypeOf(object);
+	      }
+	
+	      // Object members with non-empty values are preferred since it gives the
+	      // user a better overview of the object.
+	      let props = this.getProps(object, max, isInterestingProp);
+	
+	      if (props.length <= max) {
+	        // There are not enough props yet (or at least, not enough props to
+	        // be able to know whether we should print "more..." or not).
+	        // Let's display also empty members and functions.
+	        props = props.concat(this.getProps(object, max, (t, value) => {
+	          return !isInterestingProp(t, value);
+	        }));
+	      }
+	
+	      if (props.length > max) {
+	        props.pop();
+	        props.push(Caption({
+	          key: "more",
+	          object: "more...",
+	        }));
+	      } else if (props.length > 0) {
+	        // Remove the last comma.
+	        props[props.length - 1] = React.cloneElement(
+	          props[props.length - 1], { delim: "" });
+	      }
+	
+	      return props;
+	    },
+	
+	    getProps: function (object, max, filter) {
+	      let props = [];
+	
+	      max = max || 3;
+	      if (!object) {
+	        return props;
+	      }
+	
+	      let mode = this.props.mode;
+	
+	      try {
+	        for (let name in object) {
+	          if (props.length > max) {
+	            return props;
+	          }
+	
+	          let value;
+	          try {
+	            value = object[name];
+	          } catch (exc) {
+	            continue;
+	          }
+	
+	          let t = typeof value;
+	          if (filter(t, value)) {
+	            props.push(PropRep({
+	              key: name,
+	              mode: mode,
+	              name: name,
+	              object: value,
+	              equal: ": ",
+	              delim: ", ",
+	            }));
+	          }
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+	
+	      return props;
+	    },
+	
+	    render: function () {
+	      let object = this.props.object;
+	      let props = this.shortPropIterator(object);
+	
+	      if (this.props.mode == "tiny" || !props.length) {
+	        return (
+	          ObjectBox({className: "object"},
+	            span({className: "objectTitle"}, this.getTitle())
+	          )
+	        );
+	      }
+	
+	      return (
+	        ObjectBox({className: "object"},
+	          span({className: "objectTitle"}, this.getTitle()),
+	          span({className: "objectLeftBrace", role: "presentation"}, "{"),
+	          props,
+	          span({className: "objectRightBrace"}, "}")
+	        )
+	      );
+	    },
+	  });
+	  function supportsObject(object, type) {
+	    return true;
+	  }
+	  // Exports from this module
+	  exports.Obj = {
+	    rep: Obj,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 462 */
+/***/ 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) {
+	  const React = __webpack_require__(17);
+	  const { createFactories } = __webpack_require__(453);
+	
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Property for Obj (local JS objects) and Grip (remote JS objects)
+	   * reps. It's used to render object properties.
+	   */
+	  let PropRep = React.createFactory(React.createClass({
+	    displayName: "PropRep",
+	
+	    propTypes: {
+	      // Property name.
+	      name: React.PropTypes.string,
+	      // Equal character rendered between property name and value.
+	      equal: React.PropTypes.string,
+	      // Delimiter character used to separate individual properties.
+	      delim: React.PropTypes.string,
+	    },
+	
+	    render: function () {
+	      let { Rep } = createFactories(__webpack_require__(452));
+	
+	      return (
+	        span({},
+	          span({
+	            "className": "nodeName"},
+	            this.props.name),
+	          span({
+	            "className": "objectEqual",
+	            role: "presentation"},
+	            this.props.equal
+	          ),
+	          Rep(this.props),
+	          span({
+	            "className": "objectComma",
+	            role: "presentation"},
+	            this.props.delim
+	          )
+	        )
+	      );
+	    }
+	  }));
+	
+	  // Exports from this module
+	  exports.PropRep = PropRep;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 463 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	  const { StringRep } = __webpack_require__(457);
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	  const { rep: StringRepFactory } = createFactories(StringRep);
+	
+	  /**
+	   * Renders DOM attribute
+	   */
+	  let Attribute = React.createClass({
+	    displayName: "Attr",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      return grip.preview.nodeName;
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      let value = grip.preview.value;
+	
+	      return (
+	        ObjectLink({className: "Attr"},
+	          span({},
+	            span({className: "attrTitle"},
+	              this.getTitle(grip)
+	            ),
+	            span({className: "attrEqual"},
+	              "="
+	            ),
+	            StringRepFactory({object: value})
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (type == "Attr" && grip.preview);
+	  }
+	
+	  exports.Attribute = {
+	    rep: Attribute,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 464 */
+/***/ 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 DOM = React.DOM;
+	
+	  /**
+	   * Renders a link for given object.
+	   */
+	  const ObjectLink = React.createClass({
+	    displayName: "ObjectLink",
+	
+	    render: function () {
+	      let className = this.props.className;
+	      let objectClassName = className ? " objectLink-" + className : "";
+	      let linkClassName = "objectLink" + objectClassName + " a11yFocus";
+	
+	      return (
+	        DOM.a({className: linkClassName, _repObject: this.props.object},
+	          this.props.children
+	        )
+	      );
+	    }
+	  });
+	
+	  // Exports from this module
+	  exports.ObjectLink = ObjectLink;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 465 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Used to render JS built-in Date() object.
+	   */
+	  let DateTime = React.createClass({
+	    displayName: "Date",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getTitle: function (grip) {
+	      return new Date(grip.preview.timestamp).toISOString();
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        ObjectLink({className: "Date"},
+	          span({className: "objectTitle"},
+	            this.getTitle(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (type == "Date" && grip.preview);
+	  }
+	
+	  // Exports from this module
+	  exports.DateTime = {
+	    rep: DateTime,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 466 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	  const { getFileName } = __webpack_require__(467);
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Renders DOM document object.
+	   */
+	  let Document = React.createClass({
+	    displayName: "Document",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    getLocation: function (grip) {
+	      let location = grip.preview.location;
+	      return location ? getFileName(location) : "";
+	    },
+	
+	    getTitle: function (win, context) {
+	      return "document";
+	    },
+	
+	    getTooltip: function (doc) {
+	      return doc.location.href;
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	
+	      return (
+	        ObjectBox({className: "object"},
+	          span({className: "objectPropValue"},
+	            this.getLocation(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return (object.preview && type == "HTMLDocument");
+	  }
+	
+	  // Exports from this module
+	  exports.Document = {
+	    rep: Document,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 467 */
+/***/ 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/. */
+	/* global URLSearchParams */
+	
+	"use strict";
+	
+	// Make this available to both AMD and CJS environments
+	!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) {
+	  function parseURLParams(url) {
+	    url = new URL(url);
+	    return parseURLEncodedText(url.searchParams);
+	  }
+	
+	  function parseURLEncodedText(text) {
+	    let params = [];
+	
+	    // In case the text is empty just return the empty parameters
+	    if (text == "") {
+	      return params;
+	    }
+	
+	    let searchParams = new URLSearchParams(text);
+	    let entries = [...searchParams.entries()];
+	    return entries.map(entry => {
+	      return {
+	        name: entry[0],
+	        value: entry[1]
+	      };
+	    });
+	  }
+	
+	  function getFileName(url) {
+	    let split = splitURLBase(url);
+	    return split.name;
+	  }
+	
+	  function splitURLBase(url) {
+	    if (!isDataURL(url)) {
+	      return splitURLTrue(url);
+	    }
+	    return {};
+	  }
+	
+	  function isDataURL(url) {
+	    return (url && url.substr(0, 5) == "data:");
+	  }
+	
+	  function splitURLTrue(url) {
+	    const reSplitFile = /(.*?):\/{2,3}([^\/]*)(.*?)([^\/]*?)($|\?.*)/;
+	    let m = reSplitFile.exec(url);
+	
+	    if (!m) {
+	      return {
+	        name: url,
+	        path: url
+	      };
+	    } else if (m[4] == "" && m[5] == "") {
+	      return {
+	        protocol: m[1],
+	        domain: m[2],
+	        path: m[3],
+	        name: m[3] != "/" ? m[3] : m[2]
+	      };
+	    }
+	
+	    return {
+	      protocol: m[1],
+	      domain: m[2],
+	      path: m[2] + m[3],
+	      name: m[4] + m[5]
+	    };
+	  }
+	
+	  // Exports from this module
+	  exports.parseURLParams = parseURLParams;
+	  exports.parseURLEncodedText = parseURLEncodedText;
+	  exports.getFileName = getFileName;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 468 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  /**
+	   * Renders DOM event objects.
+	   */
+	  let Event = React.createClass({
+	    displayName: "event",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    summarizeEvent: function (grip) {
+	      let info = [grip.preview.type, " "];
+	
+	      let eventFamily = grip.class;
+	      let props = grip.preview.properties;
+	
+	      if (eventFamily == "MouseEvent") {
+	        info.push("clientX=", props.clientX, ", clientY=", props.clientY);
+	      } else if (eventFamily == "KeyboardEvent") {
+	        info.push("charCode=", props.charCode, ", keyCode=", props.keyCode);
+	      } else if (eventFamily == "MessageEvent") {
+	        info.push("origin=", props.origin, ", data=", props.data);
+	      }
+	
+	      return info.join("");
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        ObjectLink({className: "event"},
+	          this.summarizeEvent(grip)
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (grip.preview && grip.preview.kind == "DOMEvent");
+	  }
+	
+	  // Exports from this module
+	  exports.Event = {
+	    rep: Event,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 469 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip, cropString } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  /**
+	   * This component represents a template for Function objects.
+	   */
+	  let Func = React.createClass({
+	    displayName: "Func",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+	
+	    summarizeFunction: function (grip) {
+	      let name = grip.displayName || grip.name || "function";
+	      return cropString(name + "()", 100);
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	
+	      return (
+	        ObjectLink({className: "function"},
+	          this.summarizeFunction(grip)
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return (type == "function");
+	    }
+	
+	    return (type == "Function");
+	  }
+	
+	  // Exports from this module
+	
+	  exports.Func = {
+	    rep: Func,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 470 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	  const { Caption } = createFactories(__webpack_require__(460));
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Used to render a map of values provided as a grip.
+	   */
+	  let NamedNodeMap = React.createClass({
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	      provider: React.PropTypes.object,
+	    },
+	
+	    className: "NamedNodeMap",
+	
+	    getLength: function (object) {
+	      return object.preview.length;
+	    },
+	
+	    getTitle: function (object) {
+	      return object.class ? object.class : "";
+	    },
+	
+	    getItems: function (array, max) {
+	      let items = this.propIterator(array, max);
+	
+	      items = items.map(item => PropRep(item));
+	
+	      if (items.length > max + 1) {
+	        items.pop();
+	        items.push(Caption({
+	          key: "more",
+	          object: "more...",
+	        }));
+	      }
+	
+	      return items;
+	    },
+	
+	    propIterator: function (grip, max) {
+	      max = max || 3;
+	
+	      let props = [];
+	
+	      let provider = this.props.provider;
+	      if (!provider) {
+	        return props;
+	      }
+	
+	      let ownProperties = grip.preview ? grip.preview.ownProperties : [];
+	      for (let name in ownProperties) {
+	        if (props.length > max) {
+	          break;
+	        }
+	
+	        let item = ownProperties[name];
+	        let label = provider.getLabel(item);
+	        let value = provider.getValue(item);
+	
+	        props.push(Object.assign({}, this.props, {
+	          name: label,
+	          object: value,
+	          equal: ": ",
+	          delim: ", ",
+	        }));
+	      }
+	
+	      return props;
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      let mode = this.props.mode;
+	
+	      let items;
+	      if (mode == "tiny") {
+	        items = this.getLength(grip);
+	      } else {
+	        let max = (mode == "short") ? 3 : 100;
+	        items = this.getItems(grip, max);
+	      }
+	
+	      return (
+	        ObjectLink({className: "NamedNodeMap"},
+	          span({className: "objectTitle"},
+	            this.getTitle(grip)
+	          ),
+	          span({
+	            className: "arrayLeftBracket",
+	            role: "presentation"},
+	            "["
+	          ),
+	          items,
+	          span({
+	            className: "arrayRightBracket",
+	            role: "presentation"},
+	            "]"
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  /**
+	   * Property for a grip object.
+	   */
+	  let PropRep = React.createFactory(React.createClass({
+	    displayName: "PropRep",
+	
+	    propTypes: {
+	      equal: React.PropTypes.string,
+	      delim: React.PropTypes.string,
+	    },
+	
+	    render: function () {
+	      const { Rep } = createFactories(__webpack_require__(452));
+	
+	      return (
+	        span({},
+	          span({
+	            className: "nodeName"},
+	            "$prop.name"
+	          ),
+	          span({
+	            className: "objectEqual",
+	            role: "presentation"},
+	            this.props.equal
+	          ),
+	          Rep(this.props),
+	          span({
+	            className: "objectComma",
+	            role: "presentation"},
+	            this.props.delim
+	          )
+	        )
+	      );
+	    }
+	  }));
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (type == "NamedNodeMap" && grip.preview);
+	  }
+	
+	  // Exports from this module
+	  exports.NamedNodeMap = {
+	    rep: NamedNodeMap,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 471 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Renders a grip object with regular expression.
+	   */
+	  let RegExp = React.createClass({
+	    displayName: "regexp",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+	
+	    getTitle: function (grip) {
+	      return grip.class;
+	    },
+	
+	    getSource: function (grip) {
+	      return grip.displayString;
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        ObjectLink({className: "regexp"},
+	          span({className: "objectTitle"},
+	            this.getTitle(grip)
+	          ),
+	          span(" "),
+	          span({className: "regexpSource"},
+	            this.getSource(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return (type == "RegExp");
+	  }
+	
+	  // Exports from this module
+	  exports.RegExp = {
+	    rep: RegExp,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 472 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	  const { getFileName } = __webpack_require__(467);
+	
+	  // Shortcuts
+	  const DOM = React.DOM;
+	
+	  /**
+	   * Renders a grip representing CSSStyleSheet
+	   */
+	  let StyleSheet = React.createClass({
+	    displayName: "object",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+	
+	    getLocation: function (grip) {
+	      // Embedded stylesheets don't have URL and so, no preview.
+	      let url = grip.preview ? grip.preview.url : "";
+	      return url ? getFileName(url) : "";
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	
+	      return (
+	        ObjectBox({className: "object"},
+	          "StyleSheet ",
+	          DOM.span({className: "objectPropValue"},
+	            this.getLocation(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return (type == "CSSStyleSheet");
+	  }
+	
+	  // Exports from this module
+	
+	  exports.StyleSheet = {
+	    rep: StyleSheet,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 473 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip, cropMultipleLines } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  // Shortcuts
+	  const DOM = React.DOM;
+	
+	  /**
+	   * Renders DOM #text node.
+	   */
+	  let TextNode = React.createClass({
+	    displayName: "TextNode",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	    },
+	
+	    getTextContent: function (grip) {
+	      return cropMultipleLines(grip.preview.textContent);
+	    },
+	
+	    getTitle: function (win, context) {
+	      return "textNode";
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      let mode = this.props.mode || "short";
+	
+	      if (mode == "short" || mode == "tiny") {
+	        return (
+	          ObjectLink({className: "textNode"},
+	            "\"" + this.getTextContent(grip) + "\""
+	          )
+	        );
+	      }
+	
+	      return (
+	        ObjectLink({className: "textNode"},
+	          "<",
+	          DOM.span({className: "nodeTag"}, "TextNode"),
+	          " textContent=\"",
+	          DOM.span({className: "nodeValue"},
+	            this.getTextContent(grip)
+	          ),
+	          "\"",
+	          ">;"
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (grip.preview && grip.class == "Text");
+	  }
+	
+	  // Exports from this module
+	  exports.TextNode = {
+	    rep: TextNode,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 474 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip, cropString } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	
+	  // Shortcuts
+	  const DOM = React.DOM;
+	
+	  /**
+	   * Renders a grip representing a window.
+	   */
+	  let Window = React.createClass({
+	    displayName: "Window",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+	
+	    getLocation: function (grip) {
+	      return cropString(grip.preview.url);
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	
+	      return (
+	        ObjectBox({className: "Window"},
+	          DOM.span({className: "objectPropValue"},
+	            this.getLocation(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	
+	    return (object.preview && type == "Window");
+	  }
+	
+	  // Exports from this module
+	  exports.Window = {
+	    rep: Window,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 475 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Renders a grip object with textual data.
+	   */
+	  let ObjectWithText = React.createClass({
+	    displayName: "ObjectWithText",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+	
+	    getType: function (grip) {
+	      return grip.class;
+	    },
+	
+	    getDescription: function (grip) {
+	      return (grip.preview.kind == "ObjectWithText") ? grip.preview.text : "";
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        ObjectLink({className: this.getType(grip)},
+	          span({className: "objectPropValue"},
+	            this.getDescription(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (grip.preview && grip.preview.kind == "ObjectWithText");
+	  }
+	
+	  // Exports from this module
+	  exports.ObjectWithText = {
+	    rep: ObjectWithText,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 476 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectLink } = createFactories(__webpack_require__(464));
+	
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Renders a grip object with URL data.
+	   */
+	  let ObjectWithURL = React.createClass({
+	    displayName: "ObjectWithURL",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+	
+	    getType: function (grip) {
+	      return grip.class;
+	    },
+	
+	    getDescription: function (grip) {
+	      return grip.preview.url;
+	    },
+	
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        ObjectLink({className: this.getType(grip)},
+	          span({className: "objectPropValue"},
+	            this.getDescription(grip)
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (grip.preview && grip.preview.kind == "ObjectWithURL");
+	  }
+	
+	  // Exports from this module
+	  exports.ObjectWithURL = {
+	    rep: ObjectWithURL,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 477 */
+/***/ 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 { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	  const { Caption } = createFactories(__webpack_require__(460));
+	
+	  // Shortcuts
+	  const { a, span } = React.DOM;
+	
+	  /**
+	   * Renders an array. The array is enclosed by left and right bracket
+	   * and the max number of rendered items depends on the current mode.
+	   */
+	  let GripArray = React.createClass({
+	    displayName: "GripArray",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	      provider: React.PropTypes.object,
+	    },
+	
+	    getLength: function (grip) {
+	      return grip.preview ? grip.preview.length : 0;
+	    },
+	
+	    getTitle: function (object, context) {
+	      return "[" + object.length + "]";
+	    },
+	
+	    arrayIterator: function (grip, max) {
+	      let items = [];
+	
+	      if (!grip.preview || !grip.preview.length) {
+	        return items;
+	      }
+	
+	      let array = grip.preview.items;
+	      if (!array) {
+	        return items;
+	      }
+	
+	      let delim;
+	      let provider = this.props.provider;
+	
+	      for (let i = 0; i < array.length && i <= max; i++) {
+	        try {
+	          let itemGrip = array[i];
+	          let value = provider ? provider.getValue(itemGrip) : itemGrip;
+	
+	          delim = (i == array.length - 1 ? "" : ", ");
+	
+	          if (value === array) {
+	            items.push(Reference({
+	              key: i,
+	              object: value,
+	              delim: delim}
+	            ));
+	          } else {
+	            items.push(GripArrayItem(Object.assign({}, this.props, {
+	              key: i,
+	              object: value,
+	              delim: delim}
+	            )));
+	          }
+	        } catch (exc) {
+	          items.push(GripArrayItem(Object.assign({}, this.props, {
+	            object: exc,
+	            delim: delim,
+	            key: i}
+	          )));
+	        }
+	      }
+	
+	      if (array.length > max + 1) {
+	        items.pop();
+	        items.push(Caption({
+	          key: "more",
+	          object: "more..."}
+	        ));
+	      }
+	
+	      return items;
+	    },
+	
+	    render: function () {
+	      let mode = this.props.mode || "short";
+	      let object = this.props.object;
+	
+	      let items;
+	
+	      if (mode == "tiny") {
+	        items = span({className: "length"}, this.getLength(object));
+	      } else {
+	        let max = (mode == "short") ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	      }
+	
+	      return (
+	        ObjectBox({className: "array"},
+	          a({className: "objectLink"},
+	            span({
+	              className: "arrayLeftBracket",
+	              role: "presentation"},
+	              "["
+	            )
+	          ),
+	          items,
+	          a({className: "objectLink"},
+	            span({
+	              className: "arrayRightBracket",
+	              role: "presentation"},
+	              "]"
+	            )
+	          ),
+	          span({
+	            className: "arrayProperties",
+	            role: "group"}
+	          )
+	        )
+	      );
+	    },
+	  });
+	
+	  /**
+	   * Renders array item. Individual values are separated by
+	   * a delimiter (a comma by default).
+	   */
+	  let GripArrayItem = React.createFactory(React.createClass({
+	    displayName: "GripArrayItem",
+	
+	    propTypes: {
+	      delim: React.PropTypes.string,
+	    },
+	
+	    render: function () {
+	      let { Rep } = createFactories(__webpack_require__(452));
+	
+	      return (
+	        span({},
+	          Rep(Object.assign({}, this.props, {
+	            mode: "tiny"
+	          })),
+	          this.props.delim
+	        )
+	      );
+	    }
+	  }));
+	
+	  /**
+	   * Renders cycle references in an array.
+	   */
+	  let Reference = React.createFactory(React.createClass({
+	    displayName: "Reference",
+	
+	    render: function () {
+	      return (
+	        span({title: "Circular reference"},
+	          "[...]"
+	        )
+	      );
+	    }
+	  }));
+	
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	
+	    return (grip.preview && grip.preview.kind == "ArrayLike");
+	  }
+	
+	  // Exports from this module
+	  exports.GripArray = {
+	    rep: GripArray,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 478 */
+/***/ 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) {
+	  // ReactJS
+	  const React = __webpack_require__(17);
+	  // Dependencies
+	  const { createFactories, isGrip } = __webpack_require__(453);
+	  const { ObjectBox } = createFactories(__webpack_require__(455));
+	  const { Caption } = createFactories(__webpack_require__(460));
+	  const { PropRep } = createFactories(__webpack_require__(462));
+	  // Shortcuts
+	  const { span } = React.DOM;
+	
+	  /**
+	   * Renders generic grip. Grip is client representation
+	   * of remote JS object and is used as an input object
+	   * for this rep component.
+	   */
+	  const Grip = React.createClass({
+	    displayName: "Grip",
+	
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	    },
+	
+	    getTitle: function () {
+	      return this.props.object.class || "Object";
+	    },
+	
+	    longPropIterator: function (object) {
+	      try {
+	        return this.propIterator(object, 100);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    shortPropIterator: function (object) {
+	      try {
+	        return this.propIterator(object, 3);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+	
+	    propIterator: function (object, max) {
+	      // Property filter. Show only interesting properties to the user.
+	      let isInterestingProp = (type, value) => {
+	        return (
+	          type == "boolean" ||
+	          type == "number" ||
+	          type == "string" ||
+	          type == "object"
+	        );
+	      };
+	
+	      // Object members with non-empty values are preferred since it gives the
+	      // user a better overview of the object.
+	      let props = this.getProps(object, max, isInterestingProp);
+	
+	      if (props.length <= max) {
+	        // There are not enough props yet (or at least, not enough props to
+	        // be able to know whether we should print "more..." or not).
+	        // Let's display also empty members and functions.
+	        props = props.concat(this.getProps(object, max, (t, value) => {
+	          return !isInterestingProp(t, value);
+	        }));
+	      }
+	
+	      // getProps() can return max+1 properties (it can't return more)
+	      // to indicate that there is more props than allowed. Remove the last
+	      // one and append 'more...' postfix in such case.
+	      if (props.length > max) {
+	        props.pop();
+	        props.push(Caption({
+	          key: "more",
+	          object: "more...",
+	        }));
+	      } else if (props.length > 0) {
+	        // Remove the last comma.
+	        // NOTE: do not change comp._store.props directly to update a property,
+	        // it should be re-rendered or cloned with changed props
+	        let last = props.length - 1;
+	        props[last] = React.cloneElement(props[last], {
+	          delim: ""
+	        });
+	      }
+	
+	      return props;
+	    },
+	
+	    getProps: function (object, max, filter) {
+	      let props = [];
+	
+	      max = max || 3;
+	      if (!object) {
+	        return props;
+	      }
+	
+	      try {
+	        let ownProperties = object.preview ? object.preview.ownProperties : [];
+	        for (let name in ownProperties) {
+	          if (props.length > max) {
+	            return props;
+	          }
+	
+	          let prop = ownProperties[name];
+	          let value = prop.value || {};
+	
+	          // Type is specified in grip's "class" field and for primitive
+	          // values use typeof.
+	          let type = (value.class || typeof value);
+	          type = type.toLowerCase();
+	
+	          // Show only interesting properties.
+	          if (filter(type, value)) {
+	            props.push(PropRep(Object.assign({}, this.props, {
+	              key: name,
+	              mode: "tiny",
+	              name: name,
+	              object: value,
+	              equal: ": ",
+	              delim: ", ",
+	            })));
+	          }
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+	
+	      return props;
+	    },
+	
+	    render: function () {
+	      let object = this.props.object;
+	      let props = (this.props.mode == "long") ?
+	        this.longPropIterator(object) :
+	        this.shortPropIterator(object);
+	
+	      if (this.props.mode == "tiny" || !props.length) {
+	        return (
+	          ObjectBox({className: "object"},
+	            span({className: "objectTitle"}, this.getTitle(object))
+	          )
+	        );
+	      }
+	
+	      return (
+	        ObjectBox({className: "object"},
+	          span({className: "objectTitle"}, this.getTitle(object)),
+	          span({className: "objectLeftBrace", role: "presentation"}, " {"),
+	          props,
+	          span({className: "objectRightBrace"}, "}")
+	        )
+	      );
+	    },
+	  });
+	
+	  // Registration
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	    return (object.preview && object.preview.ownProperties);
+	  }
+	
+	  // Exports from this module
+	  exports.Grip = {
+	    rep: Grip,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 479 */
 /***/ 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__(434);
+	var content = __webpack_require__(480);
 	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!./reps.css", function() {
+				var newContent = require("!!./../../../../../../../../node_modules/css-loader/index.js!./reps.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(); });
+	}
+
+/***/ },
+/* 480 */
+/***/ 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.theme-dark,\n.theme-light {\n  --number-color: var(--theme-highlight-green);\n  --string-color: var(--theme-highlight-orange);\n  --null-color: var(--theme-comment);\n  --object-color: var(--theme-body-color);\n  --caption-color: var(--theme-highlight-blue);\n  --location-color: var(--theme-content-color1);\n  --source-link-color: var(--theme-highlight-blue);\n  --node-color: var(--theme-highlight-bluegrey);\n  --reference-color: var(--theme-highlight-purple);\n}\n\n.theme-firebug {\n  --number-color: #000088;\n  --string-color: #FF0000;\n  --null-color: #787878;\n  --object-color: DarkGreen;\n  --caption-color: #444444;\n  --location-color: #555555;\n  --source-link-color: blue;\n  --node-color: rgb(0, 0, 136);\n  --reference-color: rgb(102, 102, 255);\n}\n\n/******************************************************************************/\n\n.objectLink:hover {\n  cursor: pointer;\n  text-decoration: underline;\n}\n\n.inline {\n  display: inline;\n  white-space: normal;\n}\n\n.objectBox-object {\n  font-weight: bold;\n  color: var(--object-color);\n  white-space: pre-wrap;\n}\n\n.objectBox-string,\n.objectBox-text,\n.objectLink-textNode,\n.objectBox-table {\n  white-space: pre-wrap;\n}\n\n.objectBox-number,\n.objectLink-styleRule,\n.objectLink-element,\n.objectLink-textNode,\n.objectBox-array > .length {\n  color: var(--number-color);\n}\n\n.objectBox-string {\n  color: var(--string-color);\n}\n\n.objectLink-function,\n.objectBox-stackTrace,\n.objectLink-profile {\n  color: var(--object-color);\n}\n\n.objectLink-Location {\n  font-style: italic;\n  color: var(--location-color);\n}\n\n.objectBox-null,\n.objectBox-undefined,\n.objectBox-hint,\n.logRowHint {\n  font-style: italic;\n  color: var(--null-color);\n}\n\n.objectLink-sourceLink {\n  position: absolute;\n  right: 4px;\n  top: 2px;\n  padding-left: 8px;\n  font-weight: bold;\n  color: var(--source-link-color);\n}\n\n/******************************************************************************/\n\n.objectLink-event,\n.objectLink-eventLog,\n.objectLink-regexp,\n.objectLink-object,\n.objectLink-Date {\n  font-weight: bold;\n  color: var(--object-color);\n  white-space: pre-wrap;\n}\n\n/******************************************************************************/\n\n.objectLink-object .nodeName,\n.objectLink-NamedNodeMap .nodeName,\n.objectLink-NamedNodeMap .objectEqual,\n.objectLink-NamedNodeMap .arrayLeftBracket,\n.objectLink-NamedNodeMap .arrayRightBracket,\n.objectLink-Attr .attrEqual,\n.objectLink-Attr .attrTitle {\n  color: var(--node-color);\n}\n\n.objectLink-object .nodeName {\n  font-weight: normal;\n}\n\n/******************************************************************************/\n\n.objectLeftBrace,\n.objectRightBrace,\n.arrayLeftBracket,\n.arrayRightBracket {\n  cursor: pointer;\n  font-weight: bold;\n}\n\n.objectLeftBrace,\n.arrayLeftBracket {\n  margin-right: 4px;\n}\n\n.objectRightBrace,\n.arrayRightBracket {\n  margin-left: 4px;\n}\n\n/******************************************************************************/\n/* Cycle reference*/\n\n.objectLink-Reference {\n  font-weight: bold;\n  color: var(--reference-color);\n}\n\n.objectBox-array > .objectTitle {\n  font-weight: bold;\n  color: var(--object-color);\n}\n\n.caption {\n  font-weight: bold;\n  color:  var(--caption-color);\n}\n\n/******************************************************************************/\n/* Themes */\n\n.theme-dark .objectBox-null,\n.theme-dark .objectBox-undefined,\n.theme-light .objectBox-null,\n.theme-light .objectBox-undefined {\n  font-style: normal;\n}\n\n.theme-dark .objectBox-object,\n.theme-light .objectBox-object {\n  font-weight: normal;\n  white-space: pre-wrap;\n}\n\n.theme-dark .caption,\n.theme-light .caption {\n  font-weight: normal;\n}\n", ""]);
+	
+	// exports
+
+
+/***/ },
+/* 481 */
+/***/ 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__(482);
+	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!./Expressions.css", function() {
 				var newContent = require("!!./../../../node_modules/css-loader/index.js!./Expressions.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(); });
 	}
 
 /***/ },
-/* 434 */
-/***/ function(module, exports, __webpack_require__) {
-
-	exports = module.exports = __webpack_require__(356)();
+/* 482 */
+/***/ function(module, exports, __webpack_require__) {
+
+	exports = module.exports = __webpack_require__(357)();
 	// imports
 	
 	
 	// module
-	exports.push([module.id, ".input-expression {\n  width: 100%;\n  padding: 5px;\n  margin: 0px;\n  border: none;\n}\n\n.expression {\n  border: 1px;\n  padding: 2px;\n  margin: 1px;\n}\n", ""]);
+	exports.push([module.id, ".input-expression {\n  width: 100%;\n  padding: 5px;\n  margin: 0px;\n  border: none;\n  cursor: hand;\n}\n\n.expression-container {\n  border: 1px;\n  padding: 2px;\n  margin: 1px;\n  width: 100%;\n}\n\n.expression-output-container .close-btn {\n  width: 6px;\n  height: 6px;\n  float: right;\n  margin-right: 6px;\n  display: block;\n  cursor: pointer;\n}\n\n.expression-input {\n  color: var(--theme-content-color1);\n  cursor: pointer;\n  max-width: 50%;\n}\n\n.expression-value {\n  overflow-x: scroll;\n  color: var(--theme-content-color2);\n  max-width: 50% !important;\n}\n", ""]);
 	
 	// exports
 
 
 /***/ },
-/* 435 */
+/* 483 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
 	
 	var _require = __webpack_require__(2);
 	
 	var bindActionCreators = _require.bindActionCreators;
 	
 	var _require2 = __webpack_require__(15);
 	
 	var connect = _require2.connect;
 	
-	var ImPropTypes = __webpack_require__(372);
-	var actions = __webpack_require__(359);
-	
-	var _require3 = __webpack_require__(347);
+	var ImPropTypes = __webpack_require__(376);
+	var actions = __webpack_require__(360);
+	
+	var _require3 = __webpack_require__(348);
 	
 	var getPause = _require3.getPause;
 	var getLoadedObjects = _require3.getLoadedObjects;
 	
-	var ObjectInspector = React.createFactory(__webpack_require__(436));
+	var ObjectInspector = React.createFactory(__webpack_require__(484));
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	
-	__webpack_require__(467);
+	__webpack_require__(488);
 	
 	function info(text) {
 	  return dom.div({ className: "pane-info" }, text);
 	}
 	
 	// Create the tree nodes representing all the variables and arguments
 	// for the bindings from a scope.
 	function getBindingVariables(bindings, parentName) {
@@ -62974,24 +65884,24 @@ var Debugger =
 	    return dom.div({ className: "pane scopes-list" }, pauseInfo ? scopeInspector : info("Not Paused"));
 	  }
 	});
 	
 	module.exports = connect(state => ({ pauseInfo: getPause(state),
 	  loadedObjects: getLoadedObjects(state) }), dispatch => bindActionCreators(actions, dispatch))(Scopes);
 
 /***/ },
-/* 436 */
+/* 484 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
-	var classnames = __webpack_require__(375);
-	var ManagedTree = React.createFactory(__webpack_require__(384));
-	var Arrow = React.createFactory(__webpack_require__(376));
-	var Rep = __webpack_require__(437);
+	var classnames = __webpack_require__(379);
+	var ManagedTree = React.createFactory(__webpack_require__(383));
+	var Arrow = React.createFactory(__webpack_require__(485));
+	var Rep = __webpack_require__(451);
 	var dom = React.DOM;
 	var PropTypes = React.PropTypes;
 	
 	// This implements a component that renders an interactive inspector
 	// for looking at JavaScript objects. It expects descriptions of
 	// objects from the protocol, and will dynamically fetch child
 	// properties as objects are expanded.
 	//
@@ -63163,2599 +66073,151 @@ var Debugger =
 	      renderItem: this.renderItem
 	    });
 	  }
 	});
 	
 	module.exports = ObjectInspector;
 
 /***/ },
-/* 437 */
+/* 485 */
 /***/ function(module, exports, __webpack_require__) {
 
 	var React = __webpack_require__(17);
-	var Rep = React.createFactory(__webpack_require__(438).Rep);
-	var Grip = __webpack_require__(464).Grip;
-	
-	__webpack_require__(465);
-	
-	function renderRep(_ref) {
-	  var object = _ref.object;
-	
-	  return Rep({ object, defaultRep: Grip });
-	}
-	
-	module.exports = renderRep;
-
-/***/ },
-/* 438 */
-/***/ 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__(439);
-	
-	  // Load all existing rep templates
-	  const { Undefined } = __webpack_require__(440);
-	  const { Null } = __webpack_require__(442);
-	  const { StringRep } = __webpack_require__(443);
-	  const { Number } = __webpack_require__(444);
-	  const { ArrayRep } = __webpack_require__(445);
-	  const { Obj