Bug 1325401 - Start using Reps bundle behind a flag. r=ttromey
☠☠ backed out by abb4c9666456 ☠ ☠
authorJason Laster <jason.laster.11@gmail.com>
Mon, 09 Jan 2017 14:09:00 -0500
changeset 458364 35986e7aa356808141490d526d7eb417d5ab5992
parent 458363 60088a8114792606827fe4e412cbaa011593199d
child 458365 d54ebcd1a796122e40d2bd3b6cb301aec273accd
push id40935
push userbmo:cam@mcc.id.au
push dateTue, 10 Jan 2017 07:11:37 +0000
reviewersttromey
bugs1325401
milestone53.0a1
Bug 1325401 - Start using Reps bundle behind a flag. r=ttromey
devtools/client/preferences/devtools.js
devtools/client/shared/components/moz.build
devtools/client/shared/components/reps.css
devtools/client/shared/components/reps.js
devtools/client/webconsole/new-console-output/components/grip-message-body.js
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -319,16 +319,19 @@ pref("devtools.webconsole.autoMultiline"
 
 // Enable the experimental webconsole frontend
 #if defined(NIGHTLY_BUILD)
 pref("devtools.webconsole.new-frontend-enabled", true);
 #else
 pref("devtools.webconsole.new-frontend-enabled", false);
 #endif
 
+// Enable loading reps from a bundle
+pref("devtools.webconsole.use-reps-bundle", false);
+
 // Enable the experimental support for source maps in console (work in progress)
 pref("devtools.sourcemap.locations.enabled", false);
 
 // The number of lines that are displayed in the web console.
 pref("devtools.hud.loglimit", 1000);
 
 // The number of lines that are displayed in the web console for the Net,
 // CSS, JS and Web Developer categories. These defaults should be kept in sync
--- a/devtools/client/shared/components/moz.build
+++ b/devtools/client/shared/components/moz.build
@@ -11,16 +11,18 @@ DIRS += [
     'tree'
 ]
 
 DevToolsModules(
     'frame.js',
     'h-split-box.js',
     'notification-box.css',
     'notification-box.js',
+    'reps.css',
+    'reps.js',
     'search-box.js',
     'sidebar-toggle.css',
     'sidebar-toggle.js',
     'stack-trace.js',
     'tree.js',
 )
 
 MOCHITEST_CHROME_MANIFESTS += ['test/mochitest/chrome.ini']
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/reps.css
@@ -0,0 +1,533 @@
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* 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/. */
+
+.theme-dark,
+.theme-light {
+  --number-color: var(--theme-highlight-green);
+  --string-color: var(--theme-highlight-orange);
+  --null-color: var(--theme-comment);
+  --object-color: var(--theme-body-color);
+  --caption-color: var(--theme-highlight-blue);
+  --location-color: var(--theme-content-color1);
+  --source-link-color: var(--theme-highlight-blue);
+  --node-color: var(--theme-highlight-bluegrey);
+  --reference-color: var(--theme-highlight-purple);
+}
+
+.theme-firebug {
+  --number-color: #000088;
+  --string-color: #FF0000;
+  --null-color: #787878;
+  --object-color: DarkGreen;
+  --caption-color: #444444;
+  --location-color: #555555;
+  --source-link-color: blue;
+  --node-color: rgb(0, 0, 136);
+  --reference-color: rgb(102, 102, 255);
+}
+
+/******************************************************************************/
+
+.objectLink:hover {
+  cursor: pointer;
+  text-decoration: underline;
+}
+
+.inline {
+  display: inline;
+  white-space: normal;
+}
+
+.objectBox-object {
+  font-weight: bold;
+  color: var(--object-color);
+  white-space: pre-wrap;
+}
+
+.objectBox-string,
+.objectBox-text,
+.objectLink-textNode,
+.objectBox-table {
+  white-space: pre-wrap;
+}
+
+.objectBox-number,
+.objectLink-styleRule,
+.objectLink-element,
+.objectLink-textNode,
+.objectBox-array > .length {
+  color: var(--number-color);
+}
+
+.objectBox-string {
+  color: var(--string-color);
+}
+
+.objectLink-function,
+.objectBox-stackTrace,
+.objectLink-profile {
+  color: var(--object-color);
+}
+
+.objectLink-Location {
+  font-style: italic;
+  color: var(--location-color);
+}
+
+.objectBox-null,
+.objectBox-undefined,
+.objectBox-hint,
+.logRowHint {
+  font-style: italic;
+  color: var(--null-color);
+}
+
+.objectLink-sourceLink {
+  position: absolute;
+  right: 4px;
+  top: 2px;
+  padding-left: 8px;
+  font-weight: bold;
+  color: var(--source-link-color);
+}
+
+/******************************************************************************/
+
+.objectLink-event,
+.objectLink-eventLog,
+.objectLink-regexp,
+.objectLink-object,
+.objectLink-Date {
+  font-weight: bold;
+  color: var(--object-color);
+  white-space: pre-wrap;
+}
+
+/******************************************************************************/
+
+.objectLink-object .nodeName,
+.objectLink-NamedNodeMap .nodeName,
+.objectLink-NamedNodeMap .objectEqual,
+.objectLink-NamedNodeMap .arrayLeftBracket,
+.objectLink-NamedNodeMap .arrayRightBracket,
+.objectLink-Attr .attrEqual,
+.objectLink-Attr .attrTitle {
+  color: var(--node-color);
+}
+
+.objectLink-object .nodeName {
+  font-weight: normal;
+}
+
+/******************************************************************************/
+
+.objectLeftBrace,
+.objectRightBrace,
+.arrayLeftBracket,
+.arrayRightBracket {
+  cursor: pointer;
+  font-weight: bold;
+}
+
+.objectLeftBrace,
+.arrayLeftBracket {
+  margin-right: 4px;
+}
+
+.objectRightBrace,
+.arrayRightBracket {
+  margin-left: 4px;
+}
+
+/******************************************************************************/
+/* Cycle reference*/
+
+.objectLink-Reference {
+  font-weight: bold;
+  color: var(--reference-color);
+}
+
+.objectBox-array > .objectTitle {
+  font-weight: bold;
+  color: var(--object-color);
+}
+
+.caption {
+  font-weight: bold;
+  color:  var(--caption-color);
+}
+
+/******************************************************************************/
+/* Themes */
+
+.theme-dark .objectBox-null,
+.theme-dark .objectBox-undefined,
+.theme-light .objectBox-null,
+.theme-light .objectBox-undefined {
+  font-style: normal;
+}
+
+.theme-dark .objectBox-object,
+.theme-light .objectBox-object {
+  font-weight: normal;
+  white-space: pre-wrap;
+}
+
+.theme-dark .caption,
+.theme-light .caption {
+  font-weight: normal;
+}
+:root.theme-light,
+:root .theme-light {
+  --theme-search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
+}
+
+* {
+  box-sizing: border-box;
+}
+
+html,
+body {
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+}
+
+#mount {
+  display: flex;
+  height: 100%;
+}
+
+::-webkit-scrollbar {
+  width: 8px;
+  height: 8px;
+  background: transparent;
+}
+
+::-webkit-scrollbar-track {
+  border-radius: 8px;
+  background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+  border-radius: 8px;
+  background: rgba(113, 113, 113, 0.5);
+}
+
+:root.theme-dark .CodeMirror-scrollbar-filler {
+  background: transparent;
+}
+.landing-page {
+  flex: 1;
+  display: flex;
+  width: 100vw;
+  height: 100vh;
+  flex-direction: row;
+  align-items: stretch;
+  /* Customs properties */
+  --title-font-size: 24px;
+  --ui-element-font-size: 16px;
+  --primary-line-height: 30px;
+  --secondary-line-height: 25px;
+  --base-spacing: 20px;
+  --base-transition: all 0.25s ease;
+}
+
+.landing-page .sidebar {
+  display: flex;
+  background-color: var(--theme-tab-toolbar-background);
+  width: 200px;
+  flex-direction: column;
+  border-right: 1px solid var(--theme-splitter-color);
+}
+
+.landing-page .sidebar h1 {
+  color: var(--theme-body-color);
+  font-size: var(--title-font-size);
+  margin: 0;
+  line-height: var(--primary-line-height);
+  font-weight: normal;
+  padding: calc(2 * var(--base-spacing)) var(--base-spacing);
+}
+
+.landing-page .sidebar ul {
+  list-style: none;
+  padding: 0;
+  line-height: var(--primary-line-height);
+  font-size: var(--ui-element-font-size);
+}
+
+.landing-page .sidebar li {
+  padding: calc(var(--base-spacing) / 4) var(--base-spacing);
+}
+
+.landing-page .sidebar li a {
+  color: var(--theme-body-color);
+}
+
+.landing-page .sidebar li.selected {
+  background: var(--theme-highlight-bluegrey);
+  color: var(--theme-selection-color);
+  transition: var(--base-transition);
+}
+
+.landing-page .sidebar li.selected a {
+  color: inherit;
+}
+
+.landing-page .sidebar li:hover,
+.landing-page .sidebar li:focus {
+  background: var(--theme-selection-background);
+  color: var(--theme-selection-color);
+  cursor: pointer;
+}
+
+.landing-page .sidebar li:hover a,
+.landing-page .sidebar li:focus a {
+  color: inherit;
+}
+
+.landing-page .panel {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+.landing-page .panel header {
+  display: flex;
+  align-items: baseline;
+  margin: calc(2 * var(--base-spacing)) 0 0;
+  padding-bottom: var(--base-spacing);
+}
+
+.landing-page .panel header input {
+  flex: 1;
+  color: var(--theme-body-color);
+  font-size: var(--ui-element-font-size);
+  border: 1px solid var(--theme-splitter-color);
+  padding: calc(var(--base-spacing) / 2);
+  margin: 0 var(--base-spacing);
+  transition: var(--base-transition);
+}
+
+.landing-page .panel header input:focus {
+  border: 1px solid var(--theme-selection-background);
+}
+
+.landing-page .panel .center-message {
+  font-size: var(--ui-element-font-size);
+  line-height: var(--secondary-line-height);
+  padding: calc(var(--base-spacing) / 2);
+}
+
+.landing-page .center a {
+  color: var(--theme-highlight-bluegrey);
+  text-decoration: none;
+}
+
+.landing-page .tab-group {
+  flex: 1;
+  overflow-y: auto;
+}
+
+.landing-page .tab-list {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+
+.landing-page .tab {
+  border-bottom: 1px solid var(--theme-splitter-color);
+  padding: calc(var(--base-spacing) / 2) var(--base-spacing);
+  font-family: sans-serif;
+}
+
+.landing-page .tab-title {
+  line-height: var(--secondary-line-height);
+  font-size: var(--ui-element-font-size);
+  color: var(--theme-highlight-bluegrey);
+  word-break: break-all;
+}
+
+.landing-page .tab-url {
+  color: var(--theme-comment);
+  word-break: break-all;
+}
+
+.landing-page .tab:focus,
+.landing-page .tab.active {
+  background: var(--theme-selection-background);
+  color: var(--theme-selection-color);
+  cursor: pointer;
+  transition: var(--base-transition);
+}
+
+.landing-page .tab:focus .tab-title,
+.landing-page .tab.active .tab-title {
+  color: inherit;
+}
+
+.landing-page .tab:focus .tab-url,
+.landing-page .tab.active .tab-url {
+  color: var(--theme-highlight-gray);
+}
+
+.landing-page .panel .footer-note {
+  padding: var(--base-spacing) 0;
+  text-align: center;
+  font-size: 14px;
+  color: var(--theme-comment);
+}
+.quick-links {
+  display: flex;
+  justify-content: center;
+  flex-wrap: wrap;
+  background: rgba(255,255,255,0.25);
+  padding: 0.5rem 1rem;
+}
+
+.quick-links button {
+  font-size: 1.2rem;
+  background: none;
+  border: none;
+  color: white;
+  margin: 0.5rem 0.25rem;
+  cursor: pointer;
+}
+.console-header {
+  background: var(--theme-highlight-pink);
+  color: white;
+  margin: 0;
+}
+
+.console-header form {
+  display: flex;
+  padding: 1rem;
+}
+
+.console-header h1 {
+  font-size: 14px;
+  font-weight: 100;
+  color: white;
+}
+
+.console-header input {
+  background-color: var(--theme-highlight-pink);
+  flex: 1;
+  border: 1px solid white;
+  color: white;
+  font-size: 1.25rem;
+  padding: 0.25rem;
+  line-height: 2rem;
+  padding-left: 1rem;
+  margin: 0 1rem;
+}
+
+.console-header ::-webkit-input-placeholder {
+  color: white;
+  font-size: 1rem;
+  line-height: 2rem;
+  margin: 0;
+}
+
+.console-header .clear-button {
+  background: rgba(255,255,255,0.25);
+  border: 1px solid rgba(255,255,255,0.25);
+  color: white;
+  font-size: 1.2rem;
+}
+main {
+  --default-border: 1px solid var(--theme-splitter-color);
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+}
+
+.expressions {
+  padding: 2em 1em;
+  flex: 1;
+  overflow-y: auto;
+}
+
+.rep-row {
+  border: var(--default-border);
+  margin-bottom: 1em;
+}
+
+.rep-input {
+  font-family: monospace;
+  background-color: var(--theme-toolbar-background-alt);
+  color: var(--theme-body-color);
+  padding: 0.5rem;
+}
+
+.rep-input:before {
+  content: "\279C   ";
+}
+
+.reps {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 1rem;
+  margin-bottom: 0.5rem;
+}
+
+.rep-element + .rep-element {
+  margin-left: 0.5rem;
+}
+
+.rep-element::before {
+  content: attr(data-mode) ":";
+  background-color: var(--theme-toolbar-background);;
+  font-family: monospace;
+  display: inline-block;
+  font-size: 0.75rem;
+  padding: 0.1rem 0.25rem;
+  margin-right: 0.25rem;
+  border-radius: 0.25rem;
+}
+
+.packet header {
+  display: flex;
+  background-color: var(--theme-toolbar-background-alt);
+  border-top: var(--default-border);
+  color: var(--theme-body-color);
+  padding: 0.5rem;
+}
+
+.packet header::before {
+  display: inline-block;
+  padding-right: 0.5rem;
+}
+
+.packet header.packet-expanded::before {
+  content: "\2212";
+}
+
+.packet header.packet-collapsed::before {
+  content: "+";
+}
+
+.copy-packet-button {
+  margin-left: auto;
+  margin-right: 0.5rem;
+}
+
+.packet .packet-rep {
+  padding: 1rem;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+html, body {
+  margin: 0;
+  padding: 0;
+}
+
+/*# sourceMappingURL=bundle.css.map*/
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/reps.js
@@ -0,0 +1,35193 @@
+module.exports =
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// SingleModulePlugin
+/******/ 		const smpCache = this.smpCache = this.smpCache || {};
+/******/ 		const smpMap = this.smpMap = this.smpMap || new Map();
+/******/ 		function sanitizeString(text) {
+/******/ 		   return text.replace(/__webpack_require__\(\d+\)/g,"");
+/******/ 		}
+/******/ 		function getModuleBody(id) {
+/******/ 		  if (smpCache.hasOwnProperty(id)) {
+/******/ 		    return smpCache[id];
+/******/ 		  }
+/******/
+/******/ 		  const body = sanitizeString(String(modules[id]));
+/******/ 		  smpCache[id] = body;
+/******/ 		  return body;
+/******/ 		}
+/******/ 		if (!installedModules[moduleId]) {
+/******/ 			const body = getModuleBody(moduleId);
+/******/ 			if (smpMap.has(body)) {
+/******/ 				installedModules[moduleId] = installedModules[smpMap.get(body)];
+/******/ 			}
+/******/ 			else {
+/******/ 				smpMap.set(body, moduleId)
+/******/ 			}
+/******/ 		}
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+/******/
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "/assets/build";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+	module.exports = __webpack_require__(1);
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// require("./webconsole.css")
+	__webpack_require__(2);
+
+	const React = __webpack_require__(6);
+	const ReactDOM = __webpack_require__(7);
+	const { createFactory } = React;
+
+	const { bootstrap, L10N } = __webpack_require__(9);
+	const { isFirefoxPanel } = __webpack_require__(102);
+
+	if (!isFirefoxPanel()) {
+	  const { Provider } = __webpack_require__(29);
+
+	  const RepsConsole = createFactory(__webpack_require__(255));
+	  const { configureStore } = __webpack_require__(306);
+
+	  __webpack_require__(311);
+	  L10N.setBundle(__webpack_require__(313));
+	  window.l10n = L10N;
+
+	  function onConnect({ client } = {}) {
+	    if (!client) {
+	      return;
+	    }
+
+	    let store = configureStore({
+	      makeThunkArgs: (args, state) => {
+	        return Object.assign({}, args, { client });
+	      }
+	    });
+
+	    ReactDOM.render(React.createElement(Provider, { store }, RepsConsole({ client })), root);
+	  }
+
+	  let root = document.createElement("div");
+	  root.innerText = "Waiting for connection";
+
+	  bootstrap(React, ReactDOM, root).then(onConnect, e => console.error("An error occured during the connection", e)).catch(e => console.error("An error occured in the onConnect function", e));
+	} else {
+	  const { MODE } = __webpack_require__(266);
+	  const Rep = createFactory(__webpack_require__(267));
+	  const Grip = __webpack_require__(278);
+	  const repUtils = __webpack_require__(305);
+
+	  module.exports = {
+	    Rep,
+	    Grip,
+	    repUtils,
+	    MODE
+	  };
+	}
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+	// removed by extract-text-webpack-plugin
+
+/***/ },
+/* 3 */,
+/* 4 */,
+/* 5 */,
+/* 6 */
+/***/ function(module, exports) {
+
+	module.exports = require("devtools/client/shared/vendor/react");
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	module.exports = __webpack_require__(8);
+
+
+/***/ },
+/* 8 */
+/***/ function(module, exports) {
+
+	module.exports = require("devtools/client/shared/vendor/react-dom");
+
+/***/ },
+/* 9 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* global window, document, DebuggerConfig */
+
+	const { bindActionCreators, combineReducers } = __webpack_require__(10);
+	const { Provider } = __webpack_require__(29);
+
+	const { DevToolsUtils, AppConstants } = __webpack_require__(38);
+	const { debugGlobal } = __webpack_require__(101);
+	const { setConfig, isEnabled, getValue, isDevelopment } = __webpack_require__(102);
+	const L10N = __webpack_require__(150);
+
+	setConfig(({"title":"Reps","hotReloading":true,"environment":"development","theme":"light","firefox":{"proxyHost":"localhost:9000","webSocketConnection":false,"websocketHost":"localhost:6080","mcPath":"./firefox"},"development":{"serverPort":8000}}));
+
+	// Set various flags before requiring app code.
+	if (isEnabled("logging.client")) {
+	  DevToolsUtils.dumpn.wantLogging = true;
+	}
+
+	const { getClient, firefox, chrome, startDebugging } = __webpack_require__(151);
+	const Root = __webpack_require__(220);
+
+	// Using this static variable allows webpack to know at compile-time
+	// to avoid this require and not include it at all in the output.
+	if (false) {
+	  const theme = getValue("theme");
+	  switch (theme) {
+	    case "dark":
+	      require("./lib/themes/dark-theme.css");break;
+	    case "light":
+	      require("./lib/themes/light-theme.css");break;
+	    case "firebug":
+	      require("./lib/themes/firebug-theme.css");break;
+	  }
+	  document.body.parentNode.classList.add(`theme-${ theme }`);
+	}
+
+	function initApp() {
+	  const configureStore = __webpack_require__(224);
+	  const reducers = __webpack_require__(235);
+	  const LaunchpadApp = __webpack_require__(240);
+
+	  const createStore = configureStore({
+	    log: getValue("logging.actions"),
+	    makeThunkArgs: (args, state) => {
+	      return Object.assign({}, args, { client: getClient(state) });
+	    }
+	  });
+
+	  const store = createStore(combineReducers(reducers));
+	  const actions = bindActionCreators(__webpack_require__(253), store.dispatch);
+
+	  debugGlobal("launchpadStore", store);
+
+	  if (isDevelopment()) {
+	    AppConstants.DEBUG_JS_MODULES = true;
+	  }
+
+	  return { store, actions, LaunchpadApp };
+	}
+
+	function renderRoot(_React, _ReactDOM, component, _store) {
+	  const { createElement } = _React;
+	  const mount = document.querySelector("#mount");
+
+	  // bail in test environments that do not have a mount
+	  if (!mount) {
+	    return;
+	  }
+
+	  const root = Root();
+	  mount.appendChild(root);
+
+	  if (component.props || component.propTypes) {
+	    _ReactDOM.render(createElement(Provider, { store: _store }, createElement(component)), root);
+	  } else {
+	    root.appendChild(component);
+	  }
+	}
+
+	function getTargetFromQuery() {
+	  const href = window.location.href;
+	  const nodeMatch = href.match(/node-tab=([^&#]*)/);
+	  const firefoxMatch = href.match(/firefox-tab=([^&#]*)/);
+	  const chromeMatch = href.match(/chrome-tab=([^&#]*)/);
+
+	  if (nodeMatch) {
+	    return { type: "node", param: nodeMatch[1] };
+	  } else if (firefoxMatch) {
+	    return { type: "firefox", param: firefoxMatch[1] };
+	  } else if (chromeMatch) {
+	    return { type: "chrome", param: chromeMatch[1] };
+	  }
+
+	  return null;
+	}
+
+	function bootstrap(React, ReactDOM, App, appActions, appStore) {
+	  const connTarget = getTargetFromQuery();
+	  if (connTarget) {
+	    return startDebugging(connTarget, appActions).then(({ tab, client }) => {
+	      debugGlobal("client", client.clientCommands);
+	      renderRoot(React, ReactDOM, App, appStore);
+	      return { tab, connTarget, client };
+	    });
+	  }
+
+	  const { store, actions, LaunchpadApp } = initApp();
+	  renderRoot(React, ReactDOM, LaunchpadApp, store);
+	  chrome.connectClient().then(tabs => {
+	    actions.newTabs(tabs);
+	  }).catch(e => {
+	    console.log("Connect to chrome:");
+	    console.log("https://github.com/devtools-html/debugger.html/blob/master/CONTRIBUTING.md#chrome");
+	  });
+
+	  chrome.connectNodeClient().then(tabs => {
+	    actions.newTabs(tabs);
+	  });
+
+	  return firefox.connectClient().then(tabs => {
+	    actions.newTabs(tabs);
+	  });
+	}
+
+	module.exports = {
+	  bootstrap,
+	  renderRoot,
+	  debugGlobal,
+	  L10N
+	};
+
+/***/ },
+/* 10 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined;
+
+	var _createStore = __webpack_require__(11);
+
+	var _createStore2 = _interopRequireDefault(_createStore);
+
+	var _combineReducers = __webpack_require__(24);
+
+	var _combineReducers2 = _interopRequireDefault(_combineReducers);
+
+	var _bindActionCreators = __webpack_require__(26);
+
+	var _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);
+
+	var _applyMiddleware = __webpack_require__(27);
+
+	var _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);
+
+	var _compose = __webpack_require__(28);
+
+	var _compose2 = _interopRequireDefault(_compose);
+
+	var _warning = __webpack_require__(25);
+
+	var _warning2 = _interopRequireDefault(_warning);
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+	/*
+	* This is a dummy function to check if the function name has been altered by minification.
+	* If the function has been minified and NODE_ENV !== 'production', warn the user.
+	*/
+	function isCrushed() {}
+
+	if (false) {
+	  (0, _warning2["default"])('You are currently using minified code outside of NODE_ENV === \'production\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');
+	}
+
+	exports.createStore = _createStore2["default"];
+	exports.combineReducers = _combineReducers2["default"];
+	exports.bindActionCreators = _bindActionCreators2["default"];
+	exports.applyMiddleware = _applyMiddleware2["default"];
+	exports.compose = _compose2["default"];
+
+/***/ },
+/* 11 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports.ActionTypes = undefined;
+	exports["default"] = createStore;
+
+	var _isPlainObject = __webpack_require__(12);
+
+	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
+
+	var _symbolObservable = __webpack_require__(22);
+
+	var _symbolObservable2 = _interopRequireDefault(_symbolObservable);
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+	/**
+	 * These are private action types reserved by Redux.
+	 * For any unknown actions, you must return the current state.
+	 * If the current state is undefined, you must return the initial state.
+	 * Do not reference these action types directly in your code.
+	 */
+	var ActionTypes = exports.ActionTypes = {
+	  INIT: '@@redux/INIT'
+	};
+
+	/**
+	 * Creates a Redux store that holds the state tree.
+	 * The only way to change the data in the store is to call `dispatch()` on it.
+	 *
+	 * There should only be a single store in your app. To specify how different
+	 * parts of the state tree respond to actions, you may combine several reducers
+	 * into a single reducer function by using `combineReducers`.
+	 *
+	 * @param {Function} reducer A function that returns the next state tree, given
+	 * the current state tree and the action to handle.
+	 *
+	 * @param {any} [initialState] The initial state. You may optionally specify it
+	 * to hydrate the state from the server in universal apps, or to restore a
+	 * previously serialized user session.
+	 * If you use `combineReducers` to produce the root reducer function, this must be
+	 * an object with the same shape as `combineReducers` keys.
+	 *
+	 * @param {Function} enhancer The store enhancer. You may optionally specify it
+	 * to enhance the store with third-party capabilities such as middleware,
+	 * time travel, persistence, etc. The only store enhancer that ships with Redux
+	 * is `applyMiddleware()`.
+	 *
+	 * @returns {Store} A Redux store that lets you read the state, dispatch actions
+	 * and subscribe to changes.
+	 */
+	function createStore(reducer, initialState, enhancer) {
+	  var _ref2;
+
+	  if (typeof initialState === 'function' && typeof enhancer === 'undefined') {
+	    enhancer = initialState;
+	    initialState = undefined;
+	  }
+
+	  if (typeof enhancer !== 'undefined') {
+	    if (typeof enhancer !== 'function') {
+	      throw new Error('Expected the enhancer to be a function.');
+	    }
+
+	    return enhancer(createStore)(reducer, initialState);
+	  }
+
+	  if (typeof reducer !== 'function') {
+	    throw new Error('Expected the reducer to be a function.');
+	  }
+
+	  var currentReducer = reducer;
+	  var currentState = initialState;
+	  var currentListeners = [];
+	  var nextListeners = currentListeners;
+	  var isDispatching = false;
+
+	  function ensureCanMutateNextListeners() {
+	    if (nextListeners === currentListeners) {
+	      nextListeners = currentListeners.slice();
+	    }
+	  }
+
+	  /**
+	   * Reads the state tree managed by the store.
+	   *
+	   * @returns {any} The current state tree of your application.
+	   */
+	  function getState() {
+	    return currentState;
+	  }
+
+	  /**
+	   * Adds a change listener. It will be called any time an action is dispatched,
+	   * and some part of the state tree may potentially have changed. You may then
+	   * call `getState()` to read the current state tree inside the callback.
+	   *
+	   * You may call `dispatch()` from a change listener, with the following
+	   * caveats:
+	   *
+	   * 1. The subscriptions are snapshotted just before every `dispatch()` call.
+	   * If you subscribe or unsubscribe while the listeners are being invoked, this
+	   * will not have any effect on the `dispatch()` that is currently in progress.
+	   * However, the next `dispatch()` call, whether nested or not, will use a more
+	   * recent snapshot of the subscription list.
+	   *
+	   * 2. The listener should not expect to see all state changes, as the state
+	   * might have been updated multiple times during a nested `dispatch()` before
+	   * the listener is called. It is, however, guaranteed that all subscribers
+	   * registered before the `dispatch()` started will be called with the latest
+	   * state by the time it exits.
+	   *
+	   * @param {Function} listener A callback to be invoked on every dispatch.
+	   * @returns {Function} A function to remove this change listener.
+	   */
+	  function subscribe(listener) {
+	    if (typeof listener !== 'function') {
+	      throw new Error('Expected listener to be a function.');
+	    }
+
+	    var isSubscribed = true;
+
+	    ensureCanMutateNextListeners();
+	    nextListeners.push(listener);
+
+	    return function unsubscribe() {
+	      if (!isSubscribed) {
+	        return;
+	      }
+
+	      isSubscribed = false;
+
+	      ensureCanMutateNextListeners();
+	      var index = nextListeners.indexOf(listener);
+	      nextListeners.splice(index, 1);
+	    };
+	  }
+
+	  /**
+	   * Dispatches an action. It is the only way to trigger a state change.
+	   *
+	   * The `reducer` function, used to create the store, will be called with the
+	   * current state tree and the given `action`. Its return value will
+	   * be considered the **next** state of the tree, and the change listeners
+	   * will be notified.
+	   *
+	   * The base implementation only supports plain object actions. If you want to
+	   * dispatch a Promise, an Observable, a thunk, or something else, you need to
+	   * wrap your store creating function into the corresponding middleware. For
+	   * example, see the documentation for the `redux-thunk` package. Even the
+	   * middleware will eventually dispatch plain object actions using this method.
+	   *
+	   * @param {Object} action A plain object representing “what changed”. It is
+	   * a good idea to keep actions serializable so you can record and replay user
+	   * sessions, or use the time travelling `redux-devtools`. An action must have
+	   * a `type` property which may not be `undefined`. It is a good idea to use
+	   * string constants for action types.
+	   *
+	   * @returns {Object} For convenience, the same action object you dispatched.
+	   *
+	   * Note that, if you use a custom middleware, it may wrap `dispatch()` to
+	   * return something else (for example, a Promise you can await).
+	   */
+	  function dispatch(action) {
+	    if (!(0, _isPlainObject2["default"])(action)) {
+	      throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
+	    }
+
+	    if (typeof action.type === 'undefined') {
+	      throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
+	    }
+
+	    if (isDispatching) {
+	      throw new Error('Reducers may not dispatch actions.');
+	    }
+
+	    try {
+	      isDispatching = true;
+	      currentState = currentReducer(currentState, action);
+	    } finally {
+	      isDispatching = false;
+	    }
+
+	    var listeners = currentListeners = nextListeners;
+	    for (var i = 0; i < listeners.length; i++) {
+	      listeners[i]();
+	    }
+
+	    return action;
+	  }
+
+	  /**
+	   * Replaces the reducer currently used by the store to calculate the state.
+	   *
+	   * You might need this if your app implements code splitting and you want to
+	   * load some of the reducers dynamically. You might also need this if you
+	   * implement a hot reloading mechanism for Redux.
+	   *
+	   * @param {Function} nextReducer The reducer for the store to use instead.
+	   * @returns {void}
+	   */
+	  function replaceReducer(nextReducer) {
+	    if (typeof nextReducer !== 'function') {
+	      throw new Error('Expected the nextReducer to be a function.');
+	    }
+
+	    currentReducer = nextReducer;
+	    dispatch({ type: ActionTypes.INIT });
+	  }
+
+	  /**
+	   * Interoperability point for observable/reactive libraries.
+	   * @returns {observable} A minimal observable of state changes.
+	   * For more information, see the observable proposal:
+	   * https://github.com/zenparsing/es-observable
+	   */
+	  function observable() {
+	    var _ref;
+
+	    var outerSubscribe = subscribe;
+	    return _ref = {
+	      /**
+	       * The minimal observable subscription method.
+	       * @param {Object} observer Any object that can be used as an observer.
+	       * The observer object should have a `next` method.
+	       * @returns {subscription} An object with an `unsubscribe` method that can
+	       * be used to unsubscribe the observable from the store, and prevent further
+	       * emission of values from the observable.
+	       */
+
+	      subscribe: function subscribe(observer) {
+	        if (typeof observer !== 'object') {
+	          throw new TypeError('Expected the observer to be an object.');
+	        }
+
+	        function observeState() {
+	          if (observer.next) {
+	            observer.next(getState());
+	          }
+	        }
+
+	        observeState();
+	        var unsubscribe = outerSubscribe(observeState);
+	        return { unsubscribe: unsubscribe };
+	      }
+	    }, _ref[_symbolObservable2["default"]] = function () {
+	      return this;
+	    }, _ref;
+	  }
+
+	  // When a store is created, an "INIT" action is dispatched so that every
+	  // reducer returns their initial state. This effectively populates
+	  // the initial state tree.
+	  dispatch({ type: ActionTypes.INIT });
+
+	  return _ref2 = {
+	    dispatch: dispatch,
+	    subscribe: subscribe,
+	    getState: getState,
+	    replaceReducer: replaceReducer
+	  }, _ref2[_symbolObservable2["default"]] = observable, _ref2;
+	}
+
+/***/ },
+/* 12 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var baseGetTag = __webpack_require__(13),
+	    getPrototype = __webpack_require__(19),
+	    isObjectLike = __webpack_require__(21);
+
+	/** `Object#toString` result references. */
+	var objectTag = '[object Object]';
+
+	/** Used for built-in method references. */
+	var funcProto = Function.prototype,
+	    objectProto = Object.prototype;
+
+	/** Used to resolve the decompiled source of functions. */
+	var funcToString = funcProto.toString;
+
+	/** Used to check objects for own properties. */
+	var hasOwnProperty = objectProto.hasOwnProperty;
+
+	/** Used to infer the `Object` constructor. */
+	var objectCtorString = funcToString.call(Object);
+
+	/**
+	 * Checks if `value` is a plain object, that is, an object created by the
+	 * `Object` constructor or one with a `[[Prototype]]` of `null`.
+	 *
+	 * @static
+	 * @memberOf _
+	 * @since 0.8.0
+	 * @category Lang
+	 * @param {*} value The value to check.
+	 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+	 * @example
+	 *
+	 * function Foo() {
+	 *   this.a = 1;
+	 * }
+	 *
+	 * _.isPlainObject(new Foo);
+	 * // => false
+	 *
+	 * _.isPlainObject([1, 2, 3]);
+	 * // => false
+	 *
+	 * _.isPlainObject({ 'x': 0, 'y': 0 });
+	 * // => true
+	 *
+	 * _.isPlainObject(Object.create(null));
+	 * // => true
+	 */
+	function isPlainObject(value) {
+	  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+	    return false;
+	  }
+	  var proto = getPrototype(value);
+	  if (proto === null) {
+	    return true;
+	  }
+	  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+	  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+	    funcToString.call(Ctor) == objectCtorString;
+	}
+
+	module.exports = isPlainObject;
+
+
+/***/ },
+/* 13 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var Symbol = __webpack_require__(14),
+	    getRawTag = __webpack_require__(17),
+	    objectToString = __webpack_require__(18);
+
+	/** `Object#toString` result references. */
+	var nullTag = '[object Null]',
+	    undefinedTag = '[object Undefined]';
+
+	/** Built-in value references. */
+	var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+	/**
+	 * The base implementation of `getTag` without fallbacks for buggy environments.
+	 *
+	 * @private
+	 * @param {*} value The value to query.
+	 * @returns {string} Returns the `toStringTag`.
+	 */
+	function baseGetTag(value) {
+	  if (value == null) {
+	    return value === undefined ? undefinedTag : nullTag;
+	  }
+	  value = Object(value);
+	  return (symToStringTag && symToStringTag in value)
+	    ? getRawTag(value)
+	    : objectToString(value);
+	}
+
+	module.exports = baseGetTag;
+
+
+/***/ },
+/* 14 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var root = __webpack_require__(15);
+
+	/** Built-in value references. */
+	var Symbol = root.Symbol;
+
+	module.exports = Symbol;
+
+
+/***/ },
+/* 15 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var freeGlobal = __webpack_require__(16);
+
+	/** Detect free variable `self`. */
+	var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+	/** Used as a reference to the global object. */
+	var root = freeGlobal || freeSelf || Function('return this')();
+
+	module.exports = root;
+
+
+/***/ },
+/* 16 */
+/***/ function(module, exports) {
+
+	/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
+	var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+	module.exports = freeGlobal;
+
+	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
+
+/***/ },
+/* 17 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var Symbol = __webpack_require__(14);
+
+	/** Used for built-in method references. */
+	var objectProto = Object.prototype;
+
+	/** Used to check objects for own properties. */
+	var hasOwnProperty = objectProto.hasOwnProperty;
+
+	/**
+	 * Used to resolve the
+	 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+	 * of values.
+	 */
+	var nativeObjectToString = objectProto.toString;
+
+	/** Built-in value references. */
+	var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+	/**
+	 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+	 *
+	 * @private
+	 * @param {*} value The value to query.
+	 * @returns {string} Returns the raw `toStringTag`.
+	 */
+	function getRawTag(value) {
+	  var isOwn = hasOwnProperty.call(value, symToStringTag),
+	      tag = value[symToStringTag];
+
+	  try {
+	    value[symToStringTag] = undefined;
+	    var unmasked = true;
+	  } catch (e) {}
+
+	  var result = nativeObjectToString.call(value);
+	  if (unmasked) {
+	    if (isOwn) {
+	      value[symToStringTag] = tag;
+	    } else {
+	      delete value[symToStringTag];
+	    }
+	  }
+	  return result;
+	}
+
+	module.exports = getRawTag;
+
+
+/***/ },
+/* 18 */
+/***/ function(module, exports) {
+
+	/** Used for built-in method references. */
+	var objectProto = Object.prototype;
+
+	/**
+	 * Used to resolve the
+	 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+	 * of values.
+	 */
+	var nativeObjectToString = objectProto.toString;
+
+	/**
+	 * Converts `value` to a string using `Object.prototype.toString`.
+	 *
+	 * @private
+	 * @param {*} value The value to convert.
+	 * @returns {string} Returns the converted string.
+	 */
+	function objectToString(value) {
+	  return nativeObjectToString.call(value);
+	}
+
+	module.exports = objectToString;
+
+
+/***/ },
+/* 19 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var overArg = __webpack_require__(20);
+
+	/** Built-in value references. */
+	var getPrototype = overArg(Object.getPrototypeOf, Object);
+
+	module.exports = getPrototype;
+
+
+/***/ },
+/* 20 */
+/***/ function(module, exports) {
+
+	/**
+	 * Creates a unary function that invokes `func` with its argument transformed.
+	 *
+	 * @private
+	 * @param {Function} func The function to wrap.
+	 * @param {Function} transform The argument transform.
+	 * @returns {Function} Returns the new function.
+	 */
+	function overArg(func, transform) {
+	  return function(arg) {
+	    return func(transform(arg));
+	  };
+	}
+
+	module.exports = overArg;
+
+
+/***/ },
+/* 21 */
+/***/ function(module, exports) {
+
+	/**
+	 * Checks if `value` is object-like. A value is object-like if it's not `null`
+	 * and has a `typeof` result of "object".
+	 *
+	 * @static
+	 * @memberOf _
+	 * @since 4.0.0
+	 * @category Lang
+	 * @param {*} value The value to check.
+	 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+	 * @example
+	 *
+	 * _.isObjectLike({});
+	 * // => true
+	 *
+	 * _.isObjectLike([1, 2, 3]);
+	 * // => true
+	 *
+	 * _.isObjectLike(_.noop);
+	 * // => false
+	 *
+	 * _.isObjectLike(null);
+	 * // => false
+	 */
+	function isObjectLike(value) {
+	  return value != null && typeof value == 'object';
+	}
+
+	module.exports = isObjectLike;
+
+
+/***/ },
+/* 22 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/* WEBPACK VAR INJECTION */(function(global) {/* global window */
+	'use strict';
+
+	module.exports = __webpack_require__(23)(global || window || this);
+
+	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
+
+/***/ },
+/* 23 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	module.exports = function symbolObservablePonyfill(root) {
+		var result;
+		var Symbol = root.Symbol;
+
+		if (typeof Symbol === 'function') {
+			if (Symbol.observable) {
+				result = Symbol.observable;
+			} else {
+				result = Symbol('observable');
+				Symbol.observable = result;
+			}
+		} else {
+			result = '@@observable';
+		}
+
+		return result;
+	};
+
+
+/***/ },
+/* 24 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = combineReducers;
+
+	var _createStore = __webpack_require__(11);
+
+	var _isPlainObject = __webpack_require__(12);
+
+	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
+
+	var _warning = __webpack_require__(25);
+
+	var _warning2 = _interopRequireDefault(_warning);
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+	function getUndefinedStateErrorMessage(key, action) {
+	  var actionType = action && action.type;
+	  var actionName = actionType && '"' + actionType.toString() + '"' || 'an action';
+
+	  return 'Given action ' + actionName + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state.';
+	}
+
+	function getUnexpectedStateShapeWarningMessage(inputState, reducers, action) {
+	  var reducerKeys = Object.keys(reducers);
+	  var argumentName = action && action.type === _createStore.ActionTypes.INIT ? 'initialState argument passed to createStore' : 'previous state received by the reducer';
+
+	  if (reducerKeys.length === 0) {
+	    return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';
+	  }
+
+	  if (!(0, _isPlainObject2["default"])(inputState)) {
+	    return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"');
+	  }
+
+	  var unexpectedKeys = Object.keys(inputState).filter(function (key) {
+	    return !reducers.hasOwnProperty(key);
+	  });
+
+	  if (unexpectedKeys.length > 0) {
+	    return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.');
+	  }
+	}
+
+	function assertReducerSanity(reducers) {
+	  Object.keys(reducers).forEach(function (key) {
+	    var reducer = reducers[key];
+	    var initialState = reducer(undefined, { type: _createStore.ActionTypes.INIT });
+
+	    if (typeof initialState === 'undefined') {
+	      throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined.');
+	    }
+
+	    var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');
+	    if (typeof reducer(undefined, { type: type }) === 'undefined') {
+	      throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined.');
+	    }
+	  });
+	}
+
+	/**
+	 * Turns an object whose values are different reducer functions, into a single
+	 * reducer function. It will call every child reducer, and gather their results
+	 * into a single state object, whose keys correspond to the keys of the passed
+	 * reducer functions.
+	 *
+	 * @param {Object} reducers An object whose values correspond to different
+	 * reducer functions that need to be combined into one. One handy way to obtain
+	 * it is to use ES6 `import * as reducers` syntax. The reducers may never return
+	 * undefined for any action. Instead, they should return their initial state
+	 * if the state passed to them was undefined, and the current state for any
+	 * unrecognized action.
+	 *
+	 * @returns {Function} A reducer function that invokes every reducer inside the
+	 * passed object, and builds a state object with the same shape.
+	 */
+	function combineReducers(reducers) {
+	  var reducerKeys = Object.keys(reducers);
+	  var finalReducers = {};
+	  for (var i = 0; i < reducerKeys.length; i++) {
+	    var key = reducerKeys[i];
+	    if (typeof reducers[key] === 'function') {
+	      finalReducers[key] = reducers[key];
+	    }
+	  }
+	  var finalReducerKeys = Object.keys(finalReducers);
+
+	  var sanityError;
+	  try {
+	    assertReducerSanity(finalReducers);
+	  } catch (e) {
+	    sanityError = e;
+	  }
+
+	  return function combination() {
+	    var state = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
+	    var action = arguments[1];
+
+	    if (sanityError) {
+	      throw sanityError;
+	    }
+
+	    if (false) {
+	      var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action);
+	      if (warningMessage) {
+	        (0, _warning2["default"])(warningMessage);
+	      }
+	    }
+
+	    var hasChanged = false;
+	    var nextState = {};
+	    for (var i = 0; i < finalReducerKeys.length; i++) {
+	      var key = finalReducerKeys[i];
+	      var reducer = finalReducers[key];
+	      var previousStateForKey = state[key];
+	      var nextStateForKey = reducer(previousStateForKey, action);
+	      if (typeof nextStateForKey === 'undefined') {
+	        var errorMessage = getUndefinedStateErrorMessage(key, action);
+	        throw new Error(errorMessage);
+	      }
+	      nextState[key] = nextStateForKey;
+	      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
+	    }
+	    return hasChanged ? nextState : state;
+	  };
+	}
+
+/***/ },
+/* 25 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = warning;
+	/**
+	 * Prints a warning in the console if it exists.
+	 *
+	 * @param {String} message The warning message.
+	 * @returns {void}
+	 */
+	function warning(message) {
+	  /* eslint-disable no-console */
+	  if (typeof console !== 'undefined' && typeof console.error === 'function') {
+	    console.error(message);
+	  }
+	  /* eslint-enable no-console */
+	  try {
+	    // This error was thrown as a convenience so that if you enable
+	    // "break on all exceptions" in your console,
+	    // it would pause the execution at this line.
+	    throw new Error(message);
+	    /* eslint-disable no-empty */
+	  } catch (e) {}
+	  /* eslint-enable no-empty */
+	}
+
+/***/ },
+/* 26 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = bindActionCreators;
+	function bindActionCreator(actionCreator, dispatch) {
+	  return function () {
+	    return dispatch(actionCreator.apply(undefined, arguments));
+	  };
+	}
+
+	/**
+	 * Turns an object whose values are action creators, into an object with the
+	 * same keys, but with every function wrapped into a `dispatch` call so they
+	 * may be invoked directly. This is just a convenience method, as you can call
+	 * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.
+	 *
+	 * For convenience, you can also pass a single function as the first argument,
+	 * and get a function in return.
+	 *
+	 * @param {Function|Object} actionCreators An object whose values are action
+	 * creator functions. One handy way to obtain it is to use ES6 `import * as`
+	 * syntax. You may also pass a single function.
+	 *
+	 * @param {Function} dispatch The `dispatch` function available on your Redux
+	 * store.
+	 *
+	 * @returns {Function|Object} The object mimicking the original object, but with
+	 * every action creator wrapped into the `dispatch` call. If you passed a
+	 * function as `actionCreators`, the return value will also be a single
+	 * function.
+	 */
+	function bindActionCreators(actionCreators, dispatch) {
+	  if (typeof actionCreators === 'function') {
+	    return bindActionCreator(actionCreators, dispatch);
+	  }
+
+	  if (typeof actionCreators !== 'object' || actionCreators === null) {
+	    throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');
+	  }
+
+	  var keys = Object.keys(actionCreators);
+	  var boundActionCreators = {};
+	  for (var i = 0; i < keys.length; i++) {
+	    var key = keys[i];
+	    var actionCreator = actionCreators[key];
+	    if (typeof actionCreator === 'function') {
+	      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
+	    }
+	  }
+	  return boundActionCreators;
+	}
+
+/***/ },
+/* 27 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+
+	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+	exports["default"] = applyMiddleware;
+
+	var _compose = __webpack_require__(28);
+
+	var _compose2 = _interopRequireDefault(_compose);
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+	/**
+	 * Creates a store enhancer that applies middleware to the dispatch method
+	 * of the Redux store. This is handy for a variety of tasks, such as expressing
+	 * asynchronous actions in a concise manner, or logging every action payload.
+	 *
+	 * See `redux-thunk` package as an example of the Redux middleware.
+	 *
+	 * Because middleware is potentially asynchronous, this should be the first
+	 * store enhancer in the composition chain.
+	 *
+	 * Note that each middleware will be given the `dispatch` and `getState` functions
+	 * as named arguments.
+	 *
+	 * @param {...Function} middlewares The middleware chain to be applied.
+	 * @returns {Function} A store enhancer applying the middleware.
+	 */
+	function applyMiddleware() {
+	  for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {
+	    middlewares[_key] = arguments[_key];
+	  }
+
+	  return function (createStore) {
+	    return function (reducer, initialState, enhancer) {
+	      var store = createStore(reducer, initialState, enhancer);
+	      var _dispatch = store.dispatch;
+	      var chain = [];
+
+	      var middlewareAPI = {
+	        getState: store.getState,
+	        dispatch: function dispatch(action) {
+	          return _dispatch(action);
+	        }
+	      };
+	      chain = middlewares.map(function (middleware) {
+	        return middleware(middlewareAPI);
+	      });
+	      _dispatch = _compose2["default"].apply(undefined, chain)(store.dispatch);
+
+	      return _extends({}, store, {
+	        dispatch: _dispatch
+	      });
+	    };
+	  };
+	}
+
+/***/ },
+/* 28 */
+/***/ function(module, exports) {
+
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = compose;
+	/**
+	 * Composes single-argument functions from right to left. The rightmost
+	 * function can take multiple arguments as it provides the signature for
+	 * the resulting composite function.
+	 *
+	 * @param {...Function} funcs The functions to compose.
+	 * @returns {Function} A function obtained by composing the argument functions
+	 * from right to left. For example, compose(f, g, h) is identical to doing
+	 * (...args) => f(g(h(...args))).
+	 */
+
+	function compose() {
+	  for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
+	    funcs[_key] = arguments[_key];
+	  }
+
+	  if (funcs.length === 0) {
+	    return function (arg) {
+	      return arg;
+	    };
+	  } else {
+	    var _ret = function () {
+	      var last = funcs[funcs.length - 1];
+	      var rest = funcs.slice(0, -1);
+	      return {
+	        v: function v() {
+	          return rest.reduceRight(function (composed, f) {
+	            return f(composed);
+	          }, last.apply(undefined, arguments));
+	        }
+	      };
+	    }();
+
+	    if (typeof _ret === "object") return _ret.v;
+	  }
+	}
+
+/***/ },
+/* 29 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports.connect = exports.Provider = undefined;
+
+	var _Provider = __webpack_require__(30);
+
+	var _Provider2 = _interopRequireDefault(_Provider);
+
+	var _connect = __webpack_require__(33);
+
+	var _connect2 = _interopRequireDefault(_connect);
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+	exports.Provider = _Provider2["default"];
+	exports.connect = _connect2["default"];
+
+/***/ },
+/* 30 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = undefined;
+
+	var _react = __webpack_require__(6);
+
+	var _storeShape = __webpack_require__(31);
+
+	var _storeShape2 = _interopRequireDefault(_storeShape);
+
+	var _warning = __webpack_require__(32);
+
+	var _warning2 = _interopRequireDefault(_warning);
+
+	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; }
+
+	var didWarnAboutReceivingStore = false;
+	function warnAboutReceivingStore() {
+	  if (didWarnAboutReceivingStore) {
+	    return;
+	  }
+	  didWarnAboutReceivingStore = true;
+
+	  (0, _warning2["default"])('<Provider> does not support changing `store` on the fly. ' + 'It is most likely that you see this error because you updated to ' + 'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' + 'automatically. See https://github.com/reactjs/react-redux/releases/' + 'tag/v2.0.0 for the migration instructions.');
+	}
+
+	var Provider = function (_Component) {
+	  _inherits(Provider, _Component);
+
+	  Provider.prototype.getChildContext = function getChildContext() {
+	    return { store: this.store };
+	  };
+
+	  function Provider(props, context) {
+	    _classCallCheck(this, Provider);
+
+	    var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
+
+	    _this.store = props.store;
+	    return _this;
+	  }
+
+	  Provider.prototype.render = function render() {
+	    var children = this.props.children;
+
+	    return _react.Children.only(children);
+	  };
+
+	  return Provider;
+	}(_react.Component);
+
+	exports["default"] = Provider;
+
+	if (false) {
+	  Provider.prototype.componentWillReceiveProps = function (nextProps) {
+	    var store = this.store;
+	    var nextStore = nextProps.store;
+
+	    if (store !== nextStore) {
+	      warnAboutReceivingStore();
+	    }
+	  };
+	}
+
+	Provider.propTypes = {
+	  store: _storeShape2["default"].isRequired,
+	  children: _react.PropTypes.element.isRequired
+	};
+	Provider.childContextTypes = {
+	  store: _storeShape2["default"].isRequired
+	};
+
+/***/ },
+/* 31 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+
+	var _react = __webpack_require__(6);
+
+	exports["default"] = _react.PropTypes.shape({
+	  subscribe: _react.PropTypes.func.isRequired,
+	  dispatch: _react.PropTypes.func.isRequired,
+	  getState: _react.PropTypes.func.isRequired
+	});
+
+/***/ },
+/* 32 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = warning;
+	/**
+	 * Prints a warning in the console if it exists.
+	 *
+	 * @param {String} message The warning message.
+	 * @returns {void}
+	 */
+	function warning(message) {
+	  /* eslint-disable no-console */
+	  if (typeof console !== 'undefined' && typeof console.error === 'function') {
+	    console.error(message);
+	  }
+	  /* eslint-enable no-console */
+	  try {
+	    // This error was thrown as a convenience so that you can use this stack
+	    // to find the callsite that caused this warning to fire.
+	    throw new Error(message);
+	    /* eslint-disable no-empty */
+	  } catch (e) {}
+	  /* eslint-enable no-empty */
+	}
+
+/***/ },
+/* 33 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+	exports.__esModule = true;
+	exports["default"] = connect;
+
+	var _react = __webpack_require__(6);
+
+	var _storeShape = __webpack_require__(31);
+
+	var _storeShape2 = _interopRequireDefault(_storeShape);
+
+	var _shallowEqual = __webpack_require__(34);
+
+	var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
+
+	var _wrapActionCreators = __webpack_require__(35);
+
+	var _wrapActionCreators2 = _interopRequireDefault(_wrapActionCreators);
+
+	var _warning = __webpack_require__(32);
+
+	var _warning2 = _interopRequireDefault(_warning);
+
+	var _isPlainObject = __webpack_require__(12);
+
+	var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
+
+	var _hoistNonReactStatics = __webpack_require__(36);
+
+	var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);
+
+	var _invariant = __webpack_require__(37);
+
+	var _invariant2 = _interopRequireDefault(_invariant);
+
+	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; }
+
+	var defaultMapStateToProps = function defaultMapStateToProps(state) {
+	  return {};
+	}; // eslint-disable-line no-unused-vars
+	var defaultMapDispatchToProps = function defaultMapDispatchToProps(dispatch) {
+	  return { dispatch: dispatch };
+	};
+	var defaultMergeProps = function defaultMergeProps(stateProps, dispatchProps, parentProps) {
+	  return _extends({}, parentProps, stateProps, dispatchProps);
+	};
+
+	function getDisplayName(WrappedComponent) {
+	  return WrappedComponent.displayName || WrappedComponent.name || 'Component';
+	}
+
+	var errorObject = { value: null };
+	function tryCatch(fn, ctx) {
+	  try {
+	    return fn.apply(ctx);
+	  } catch (e) {
+	    errorObject.value = e;
+	    return errorObject;
+	  }
+	}
+
+	// Helps track hot reloading.
+	var nextVersion = 0;
+
+	function connect(mapStateToProps, mapDispatchToProps, mergeProps) {
+	  var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
+
+	  var shouldSubscribe = Boolean(mapStateToProps);
+	  var mapState = mapStateToProps || defaultMapStateToProps;
+
+	  var mapDispatch = undefined;
+	  if (typeof mapDispatchToProps === 'function') {
+	    mapDispatch = mapDispatchToProps;
+	  } else if (!mapDispatchToProps) {
+	    mapDispatch = defaultMapDispatchToProps;
+	  } else {
+	    mapDispatch = (0, _wrapActionCreators2["default"])(mapDispatchToProps);
+	  }
+
+	  var finalMergeProps = mergeProps || defaultMergeProps;
+	  var _options$pure = options.pure;
+	  var pure = _options$pure === undefined ? true : _options$pure;
+	  var _options$withRef = options.withRef;
+	  var withRef = _options$withRef === undefined ? false : _options$withRef;
+
+	  var checkMergedEquals = pure && finalMergeProps !== defaultMergeProps;
+
+	  // Helps track hot reloading.
+	  var version = nextVersion++;
+
+	  return function wrapWithConnect(WrappedComponent) {
+	    var connectDisplayName = 'Connect(' + getDisplayName(WrappedComponent) + ')';
+
+	    function checkStateShape(props, methodName) {
+	      if (!(0, _isPlainObject2["default"])(props)) {
+	        (0, _warning2["default"])(methodName + '() in ' + connectDisplayName + ' must return a plain object. ' + ('Instead received ' + props + '.'));
+	      }
+	    }
+
+	    function computeMergedProps(stateProps, dispatchProps, parentProps) {
+	      var mergedProps = finalMergeProps(stateProps, dispatchProps, parentProps);
+	      if (false) {
+	        checkStateShape(mergedProps, 'mergeProps');
+	      }
+	      return mergedProps;
+	    }
+
+	    var Connect = function (_Component) {
+	      _inherits(Connect, _Component);
+
+	      Connect.prototype.shouldComponentUpdate = function shouldComponentUpdate() {
+	        return !pure || this.haveOwnPropsChanged || this.hasStoreStateChanged;
+	      };
+
+	      function Connect(props, context) {
+	        _classCallCheck(this, Connect);
+
+	        var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
+
+	        _this.version = version;
+	        _this.store = props.store || context.store;
+
+	        (0, _invariant2["default"])(_this.store, 'Could not find "store" in either the context or ' + ('props of "' + connectDisplayName + '". ') + 'Either wrap the root component in a <Provider>, ' + ('or explicitly pass "store" as a prop to "' + connectDisplayName + '".'));
+
+	        var storeState = _this.store.getState();
+	        _this.state = { storeState: storeState };
+	        _this.clearCache();
+	        return _this;
+	      }
+
+	      Connect.prototype.computeStateProps = function computeStateProps(store, props) {
+	        if (!this.finalMapStateToProps) {
+	          return this.configureFinalMapState(store, props);
+	        }
+
+	        var state = store.getState();
+	        var stateProps = this.doStatePropsDependOnOwnProps ? this.finalMapStateToProps(state, props) : this.finalMapStateToProps(state);
+
+	        if (false) {
+	          checkStateShape(stateProps, 'mapStateToProps');
+	        }
+	        return stateProps;
+	      };
+
+	      Connect.prototype.configureFinalMapState = function configureFinalMapState(store, props) {
+	        var mappedState = mapState(store.getState(), props);
+	        var isFactory = typeof mappedState === 'function';
+
+	        this.finalMapStateToProps = isFactory ? mappedState : mapState;
+	        this.doStatePropsDependOnOwnProps = this.finalMapStateToProps.length !== 1;
+
+	        if (isFactory) {
+	          return this.computeStateProps(store, props);
+	        }
+
+	        if (false) {
+	          checkStateShape(mappedState, 'mapStateToProps');
+	        }
+	        return mappedState;
+	      };
+
+	      Connect.prototype.computeDispatchProps = function computeDispatchProps(store, props) {
+	        if (!this.finalMapDispatchToProps) {
+	          return this.configureFinalMapDispatch(store, props);
+	        }
+
+	        var dispatch = store.dispatch;
+
+	        var dispatchProps = this.doDispatchPropsDependOnOwnProps ? this.finalMapDispatchToProps(dispatch, props) : this.finalMapDispatchToProps(dispatch);
+
+	        if (false) {
+	          checkStateShape(dispatchProps, 'mapDispatchToProps');
+	        }
+	        return dispatchProps;
+	      };
+
+	      Connect.prototype.configureFinalMapDispatch = function configureFinalMapDispatch(store, props) {
+	        var mappedDispatch = mapDispatch(store.dispatch, props);
+	        var isFactory = typeof mappedDispatch === 'function';
+
+	        this.finalMapDispatchToProps = isFactory ? mappedDispatch : mapDispatch;
+	        this.doDispatchPropsDependOnOwnProps = this.finalMapDispatchToProps.length !== 1;
+
+	        if (isFactory) {
+	          return this.computeDispatchProps(store, props);
+	        }
+
+	        if (false) {
+	          checkStateShape(mappedDispatch, 'mapDispatchToProps');
+	        }
+	        return mappedDispatch;
+	      };
+
+	      Connect.prototype.updateStatePropsIfNeeded = function updateStatePropsIfNeeded() {
+	        var nextStateProps = this.computeStateProps(this.store, this.props);
+	        if (this.stateProps && (0, _shallowEqual2["default"])(nextStateProps, this.stateProps)) {
+	          return false;
+	        }
+
+	        this.stateProps = nextStateProps;
+	        return true;
+	      };
+
+	      Connect.prototype.updateDispatchPropsIfNeeded = function updateDispatchPropsIfNeeded() {
+	        var nextDispatchProps = this.computeDispatchProps(this.store, this.props);
+	        if (this.dispatchProps && (0, _shallowEqual2["default"])(nextDispatchProps, this.dispatchProps)) {
+	          return false;
+	        }
+
+	        this.dispatchProps = nextDispatchProps;
+	        return true;
+	      };
+
+	      Connect.prototype.updateMergedPropsIfNeeded = function updateMergedPropsIfNeeded() {
+	        var nextMergedProps = computeMergedProps(this.stateProps, this.dispatchProps, this.props);
+	        if (this.mergedProps && checkMergedEquals && (0, _shallowEqual2["default"])(nextMergedProps, this.mergedProps)) {
+	          return false;
+	        }
+
+	        this.mergedProps = nextMergedProps;
+	        return true;
+	      };
+
+	      Connect.prototype.isSubscribed = function isSubscribed() {
+	        return typeof this.unsubscribe === 'function';
+	      };
+
+	      Connect.prototype.trySubscribe = function trySubscribe() {
+	        if (shouldSubscribe && !this.unsubscribe) {
+	          this.unsubscribe = this.store.subscribe(this.handleChange.bind(this));
+	          this.handleChange();
+	        }
+	      };
+
+	      Connect.prototype.tryUnsubscribe = function tryUnsubscribe() {
+	        if (this.unsubscribe) {
+	          this.unsubscribe();
+	          this.unsubscribe = null;
+	        }
+	      };
+
+	      Connect.prototype.componentDidMount = function componentDidMount() {
+	        this.trySubscribe();
+	      };
+
+	      Connect.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
+	        if (!pure || !(0, _shallowEqual2["default"])(nextProps, this.props)) {
+	          this.haveOwnPropsChanged = true;
+	        }
+	      };
+
+	      Connect.prototype.componentWillUnmount = function componentWillUnmount() {
+	        this.tryUnsubscribe();
+	        this.clearCache();
+	      };
+
+	      Connect.prototype.clearCache = function clearCache() {
+	        this.dispatchProps = null;
+	        this.stateProps = null;
+	        this.mergedProps = null;
+	        this.haveOwnPropsChanged = true;
+	        this.hasStoreStateChanged = true;
+	        this.haveStatePropsBeenPrecalculated = false;
+	        this.statePropsPrecalculationError = null;
+	        this.renderedElement = null;
+	        this.finalMapDispatchToProps = null;
+	        this.finalMapStateToProps = null;
+	      };
+
+	      Connect.prototype.handleChange = function handleChange() {
+	        if (!this.unsubscribe) {
+	          return;
+	        }
+
+	        var storeState = this.store.getState();
+	        var prevStoreState = this.state.storeState;
+	        if (pure && prevStoreState === storeState) {
+	          return;
+	        }
+
+	        if (pure && !this.doStatePropsDependOnOwnProps) {
+	          var haveStatePropsChanged = tryCatch(this.updateStatePropsIfNeeded, this);
+	          if (!haveStatePropsChanged) {
+	            return;
+	          }
+	          if (haveStatePropsChanged === errorObject) {
+	            this.statePropsPrecalculationError = errorObject.value;
+	          }
+	          this.haveStatePropsBeenPrecalculated = true;
+	        }
+
+	        this.hasStoreStateChanged = true;
+	        this.setState({ storeState: storeState });
+	      };
+
+	      Connect.prototype.getWrappedInstance = function getWrappedInstance() {
+	        (0, _invariant2["default"])(withRef, 'To access the wrapped instance, you need to specify ' + '{ withRef: true } as the fourth argument of the connect() call.');
+
+	        return this.refs.wrappedInstance;
+	      };
+
+	      Connect.prototype.render = function render() {
+	        var haveOwnPropsChanged = this.haveOwnPropsChanged;
+	        var hasStoreStateChanged = this.hasStoreStateChanged;
+	        var haveStatePropsBeenPrecalculated = this.haveStatePropsBeenPrecalculated;
+	        var statePropsPrecalculationError = this.statePropsPrecalculationError;
+	        var renderedElement = this.renderedElement;
+
+	        this.haveOwnPropsChanged = false;
+	        this.hasStoreStateChanged = false;
+	        this.haveStatePropsBeenPrecalculated = false;
+	        this.statePropsPrecalculationError = null;
+
+	        if (statePropsPrecalculationError) {
+	          throw statePropsPrecalculationError;
+	        }
+
+	        var shouldUpdateStateProps = true;
+	        var shouldUpdateDispatchProps = true;
+	        if (pure && renderedElement) {
+	          shouldUpdateStateProps = hasStoreStateChanged || haveOwnPropsChanged && this.doStatePropsDependOnOwnProps;
+	          shouldUpdateDispatchProps = haveOwnPropsChanged && this.doDispatchPropsDependOnOwnProps;
+	        }
+
+	        var haveStatePropsChanged = false;
+	        var haveDispatchPropsChanged = false;
+	        if (haveStatePropsBeenPrecalculated) {
+	          haveStatePropsChanged = true;
+	        } else if (shouldUpdateStateProps) {
+	          haveStatePropsChanged = this.updateStatePropsIfNeeded();
+	        }
+	        if (shouldUpdateDispatchProps) {
+	          haveDispatchPropsChanged = this.updateDispatchPropsIfNeeded();
+	        }
+
+	        var haveMergedPropsChanged = true;
+	        if (haveStatePropsChanged || haveDispatchPropsChanged || haveOwnPropsChanged) {
+	          haveMergedPropsChanged = this.updateMergedPropsIfNeeded();
+	        } else {
+	          haveMergedPropsChanged = false;
+	        }
+
+	        if (!haveMergedPropsChanged && renderedElement) {
+	          return renderedElement;
+	        }
+
+	        if (withRef) {
+	          this.renderedElement = (0, _react.createElement)(WrappedComponent, _extends({}, this.mergedProps, {
+	            ref: 'wrappedInstance'
+	          }));
+	        } else {
+	          this.renderedElement = (0, _react.createElement)(WrappedComponent, this.mergedProps);
+	        }
+
+	        return this.renderedElement;
+	      };
+
+	      return Connect;
+	    }(_react.Component);
+
+	    Connect.displayName = connectDisplayName;
+	    Connect.WrappedComponent = WrappedComponent;
+	    Connect.contextTypes = {
+	      store: _storeShape2["default"]
+	    };
+	    Connect.propTypes = {
+	      store: _storeShape2["default"]
+	    };
+
+	    if (false) {
+	      Connect.prototype.componentWillUpdate = function componentWillUpdate() {
+	        if (this.version === version) {
+	          return;
+	        }
+
+	        // We are hot reloading!
+	        this.version = version;
+	        this.trySubscribe();
+	        this.clearCache();
+	      };
+	    }
+
+	    return (0, _hoistNonReactStatics2["default"])(Connect, WrappedComponent);
+	  };
+	}
+
+/***/ },
+/* 34 */
+/***/ function(module, exports) {
+
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = shallowEqual;
+	function shallowEqual(objA, objB) {
+	  if (objA === objB) {
+	    return true;
+	  }
+
+	  var keysA = Object.keys(objA);
+	  var keysB = Object.keys(objB);
+
+	  if (keysA.length !== keysB.length) {
+	    return false;
+	  }
+
+	  // Test for A's keys different from B.
+	  var hasOwn = Object.prototype.hasOwnProperty;
+	  for (var i = 0; i < keysA.length; i++) {
+	    if (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {
+	      return false;
+	    }
+	  }
+
+	  return true;
+	}
+
+/***/ },
+/* 35 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports["default"] = wrapActionCreators;
+
+	var _redux = __webpack_require__(10);
+
+	function wrapActionCreators(actionCreators) {
+	  return function (dispatch) {
+	    return (0, _redux.bindActionCreators)(actionCreators, dispatch);
+	  };
+	}
+
+/***/ },
+/* 36 */
+/***/ function(module, exports) {
+
+	/**
+	 * Copyright 2015, Yahoo! Inc.
+	 * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
+	 */
+	'use strict';
+
+	var REACT_STATICS = {
+	    childContextTypes: true,
+	    contextTypes: true,
+	    defaultProps: true,
+	    displayName: true,
+	    getDefaultProps: true,
+	    mixins: true,
+	    propTypes: true,
+	    type: true
+	};
+
+	var KNOWN_STATICS = {
+	    name: true,
+	    length: true,
+	    prototype: true,
+	    caller: true,
+	    arguments: true,
+	    arity: true
+	};
+
+	var isGetOwnPropertySymbolsAvailable = typeof Object.getOwnPropertySymbols === 'function';
+
+	module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, customStatics) {
+	    if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components
+	        var keys = Object.getOwnPropertyNames(sourceComponent);
+
+	        /* istanbul ignore else */
+	        if (isGetOwnPropertySymbolsAvailable) {
+	            keys = keys.concat(Object.getOwnPropertySymbols(sourceComponent));
+	        }
+
+	        for (var i = 0; i < keys.length; ++i) {
+	            if (!REACT_STATICS[keys[i]] && !KNOWN_STATICS[keys[i]] && (!customStatics || !customStatics[keys[i]])) {
+	                try {
+	                    targetComponent[keys[i]] = sourceComponent[keys[i]];
+	                } catch (error) {
+
+	                }
+	            }
+	        }
+	    }
+
+	    return targetComponent;
+	};
+
+
+/***/ },
+/* 37 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Copyright 2013-2015, Facebook, Inc.
+	 * All rights reserved.
+	 *
+	 * This source code is licensed under the BSD-style license found in the
+	 * LICENSE file in the root directory of this source tree. An additional grant
+	 * of patent rights can be found in the PATENTS file in the same directory.
+	 */
+
+	'use strict';
+
+	/**
+	 * Use invariant() to assert state which your program assumes to be true.
+	 *
+	 * Provide sprintf-style format (only %s is supported) and arguments
+	 * to provide information about what broke and what you were
+	 * expecting.
+	 *
+	 * The invariant message will be stripped in production, but the invariant
+	 * will remain to ensure logic does not differ in production.
+	 */
+
+	var invariant = function(condition, format, a, b, c, d, e, f) {
+	  if (false) {
+	    if (format === undefined) {
+	      throw new Error('invariant requires an error message argument');
+	    }
+	  }
+
+	  if (!condition) {
+	    var error;
+	    if (format === undefined) {
+	      error = new Error(
+	        'Minified exception occurred; use the non-minified dev environment ' +
+	        'for the full error message and additional helpful warnings.'
+	      );
+	    } else {
+	      var args = [a, b, c, d, e, f];
+	      var argIndex = 0;
+	      error = new Error(
+	        format.replace(/%s/g, function() { return args[argIndex++]; })
+	      );
+	      error.name = 'Invariant Violation';
+	    }
+
+	    error.framesToPop = 1; // we don't care about invariant's own frame
+	    throw error;
+	  }
+	};
+
+	module.exports = invariant;
+
+
+/***/ },
+/* 38 */
+/***/ function(module, exports, __webpack_require__) {
+
+	const { KeyShortcuts } = __webpack_require__(39);
+	const { DebuggerTransport } = __webpack_require__(77);
+	const { DebuggerClient } = __webpack_require__(89);
+	const PrefsHelper = __webpack_require__(93).PrefsHelper;
+	const { TargetFactory } = __webpack_require__(94);
+	const DevToolsUtils = __webpack_require__(78);
+	const AppConstants = __webpack_require__(80);
+	const EventEmitter = __webpack_require__(70);
+	const WebsocketTransport = __webpack_require__(95);
+	const Menu = __webpack_require__(96);
+	const MenuItem = __webpack_require__(97);
+	const Tree = __webpack_require__(98);
+	const sourceUtils = __webpack_require__(99);
+	const frame = __webpack_require__(100);
+
+	module.exports = {
+	  KeyShortcuts,
+	  PrefsHelper,
+	  DebuggerClient,
+	  DebuggerTransport,
+	  TargetFactory,
+	  DevToolsUtils,
+	  AppConstants,
+	  EventEmitter,
+	  WebsocketTransport,
+	  Menu,
+	  MenuItem,
+	  Tree,
+	  sourceUtils,
+	  frame
+	};
+
+
+/***/ },
+/* 39 */
+/***/ 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 { Services: { appinfo }} = __webpack_require__(40);
+	const EventEmitter = __webpack_require__(70);
+	const isOSX = appinfo.OS === "Darwin";
+	"use strict";
+
+	// List of electron keys mapped to DOM API (DOM_VK_*) key code
+	const ElectronKeysMapping = {
+	  "F1": "DOM_VK_F1",
+	  "F2": "DOM_VK_F2",
+	  "F3": "DOM_VK_F3",
+	  "F4": "DOM_VK_F4",
+	  "F5": "DOM_VK_F5",
+	  "F6": "DOM_VK_F6",
+	  "F7": "DOM_VK_F7",
+	  "F8": "DOM_VK_F8",
+	  "F9": "DOM_VK_F9",
+	  "F10": "DOM_VK_F10",
+	  "F11": "DOM_VK_F11",
+	  "F12": "DOM_VK_F12",
+	  "F13": "DOM_VK_F13",
+	  "F14": "DOM_VK_F14",
+	  "F15": "DOM_VK_F15",
+	  "F16": "DOM_VK_F16",
+	  "F17": "DOM_VK_F17",
+	  "F18": "DOM_VK_F18",
+	  "F19": "DOM_VK_F19",
+	  "F20": "DOM_VK_F20",
+	  "F21": "DOM_VK_F21",
+	  "F22": "DOM_VK_F22",
+	  "F23": "DOM_VK_F23",
+	  "F24": "DOM_VK_F24",
+	  "Space": "DOM_VK_SPACE",
+	  "Backspace": "DOM_VK_BACK_SPACE",
+	  "Delete": "DOM_VK_DELETE",
+	  "Insert": "DOM_VK_INSERT",
+	  "Return": "DOM_VK_RETURN",
+	  "Enter": "DOM_VK_RETURN",
+	  "Up": "DOM_VK_UP",
+	  "Down": "DOM_VK_DOWN",
+	  "Left": "DOM_VK_LEFT",
+	  "Right": "DOM_VK_RIGHT",
+	  "Home": "DOM_VK_HOME",
+	  "End": "DOM_VK_END",
+	  "PageUp": "DOM_VK_PAGE_UP",
+	  "PageDown": "DOM_VK_PAGE_DOWN",
+	  "Escape": "DOM_VK_ESCAPE",
+	  "Esc": "DOM_VK_ESCAPE",
+	  "Tab": "DOM_VK_TAB",
+	  "VolumeUp": "DOM_VK_VOLUME_UP",
+	  "VolumeDown": "DOM_VK_VOLUME_DOWN",
+	  "VolumeMute": "DOM_VK_VOLUME_MUTE",
+	  "PrintScreen": "DOM_VK_PRINTSCREEN",
+	};
+
+	/**
+	 * Helper to listen for keyboard events decribed in .properties file.
+	 *
+	 * let shortcuts = new KeyShortcuts({
+	 *   window
+	 * });
+	 * shortcuts.on("Ctrl+F", event => {
+	 *   // `event` is the KeyboardEvent which relates to the key shortcuts
+	 * });
+	 *
+	 * @param DOMWindow window
+	 *        The window object of the document to listen events from.
+	 * @param DOMElement target
+	 *        Optional DOM Element on which we should listen events from.
+	 *        If omitted, we listen for all events fired on `window`.
+	 */
+	function KeyShortcuts({ window, target }) {
+	  this.window = window;
+	  this.target = target || window;
+	  this.keys = new Map();
+	  this.eventEmitter = new EventEmitter();
+	  this.target.addEventListener("keydown", this);
+	}
+
+	/*
+	 * Parse an electron-like key string and return a normalized object which
+	 * allow efficient match on DOM key event. The normalized object matches DOM
+	 * API.
+	 *
+	 * @param DOMWindow window
+	 *        Any DOM Window object, just to fetch its `KeyboardEvent` object
+	 * @param String str
+	 *        The shortcut string to parse, following this document:
+	 *        https://github.com/electron/electron/blob/master/docs/api/accelerator.md
+	 */
+	KeyShortcuts.parseElectronKey = function(window, str) {
+	  let modifiers = str.split("+");
+	  let key = modifiers.pop();
+
+	  let shortcut = {
+	    ctrl: false,
+	    meta: false,
+	    alt: false,
+	    shift: false,
+	    // Set for character keys
+	    key: undefined,
+	    // Set for non-character keys
+	    keyCode: undefined,
+	  };
+	  for (let mod of modifiers) {
+	    if (mod === "Alt") {
+	      shortcut.alt = true;
+	    } else if (["Command", "Cmd"].includes(mod)) {
+	      shortcut.meta = true;
+	    } else if (["CommandOrControl", "CmdOrCtrl"].includes(mod)) {
+	      if (isOSX) {
+	        shortcut.meta = true;
+	      } else {
+	        shortcut.ctrl = true;
+	      }
+	    } else if (["Control", "Ctrl"].includes(mod)) {
+	      shortcut.ctrl = true;
+	    } else if (mod === "Shift") {
+	      shortcut.shift = true;
+	    } else {
+	      console.error("Unsupported modifier:", mod, "from key:", str);
+	      return null;
+	    }
+	  }
+
+	  // Plus is a special case. It's a character key and shouldn't be matched
+	  // against a keycode as it is only accessible via Shift/Capslock
+	  if (key === "Plus") {
+	    key = "+";
+	  }
+
+	  if (typeof key === "string" && key.length === 1) {
+	    // Match any single character
+	    shortcut.key = key.toLowerCase();
+	  } else if (key in ElectronKeysMapping) {
+	    // Maps the others manually to DOM API DOM_VK_*
+	    key = ElectronKeysMapping[key];
+	    shortcut.keyCode = window.KeyboardEvent[key];
+	    // Used only to stringify the shortcut
+	    shortcut.keyCodeString = key;
+	    shortcut.key = key;
+	  } else {
+	    console.error("Unsupported key:", key);
+	    return null;
+	  }
+
+	  return shortcut;
+	};
+
+	KeyShortcuts.stringify = function(shortcut) {
+	  let list = [];
+	  if (shortcut.alt) {
+	    list.push("Alt");
+	  }
+	  if (shortcut.ctrl) {
+	    list.push("Ctrl");
+	  }
+	  if (shortcut.meta) {
+	    list.push("Cmd");
+	  }
+	  if (shortcut.shift) {
+	    list.push("Shift");
+	  }
+	  let key;
+	  if (shortcut.key) {
+	    key = shortcut.key.toUpperCase();
+	  } else {
+	    key = shortcut.keyCodeString;
+	  }
+	  list.push(key);
+	  return list.join("+");
+	};
+
+	KeyShortcuts.prototype = {
+	  destroy() {
+	    this.target.removeEventListener("keydown", this);
+	    this.keys.clear();
+	  },
+
+	  doesEventMatchShortcut(event, shortcut) {
+	    if (shortcut.meta != event.metaKey) {
+	      return false;
+	    }
+	    if (shortcut.ctrl != event.ctrlKey) {
+	      return false;
+	    }
+	    if (shortcut.alt != event.altKey) {
+	      return false;
+	    }
+	    // Shift is a special modifier, it may implicitely be required if the
+	    // expected key is a special character accessible via shift.
+	    if (shortcut.shift != event.shiftKey && event.key &&
+	        event.key.match(/[a-zA-Z]/)) {
+	      return false;
+	    }
+	    if (shortcut.keyCode) {
+	      return event.keyCode == shortcut.keyCode;
+	    } else if (event.key in ElectronKeysMapping) {
+	      return ElectronKeysMapping[event.key] === shortcut.key;
+	    }
+
+	    // get the key from the keyCode if key is not provided.
+	    let key = event.key || String.fromCharCode(event.keyCode);
+
+	    // For character keys, we match if the final character is the expected one.
+	    // But for digits we also accept indirect match to please azerty keyboard,
+	    // which requires Shift to be pressed to get digits.
+	    return key.toLowerCase() == shortcut.key ||
+	      (shortcut.key.match(/[0-9]/) &&
+	       event.keyCode == shortcut.key.charCodeAt(0));
+	  },
+
+	  handleEvent(event) {
+	    for (let [key, shortcut] of this.keys) {
+	      if (this.doesEventMatchShortcut(event, shortcut)) {
+	        this.eventEmitter.emit(key, event);
+	      }
+	    }
+	  },
+
+	  on(key, listener) {
+	    if (typeof listener !== "function") {
+	      throw new Error("KeyShortcuts.on() expects a function as " +
+	                      "second argument");
+	    }
+	    if (!this.keys.has(key)) {
+	      let shortcut = KeyShortcuts.parseElectronKey(this.window, key);
+	      // The key string is wrong and we were unable to compute the key shortcut
+	      if (!shortcut) {
+	        return;
+	      }
+	      this.keys.set(key, shortcut);
+	    }
+	    this.eventEmitter.on(key, listener);
+	  },
+
+	  off(key, listener) {
+	    this.eventEmitter.off(key, listener);
+	  },
+	};
+	exports.KeyShortcuts = KeyShortcuts;
+
+
+/***/ },
+/* 40 */
+/***/ function(module, exports, __webpack_require__) {
+
+	const Services = __webpack_require__(41);
+	const SplitBox = __webpack_require__(42);
+	// const SplitBoxCSS = require("./client/shared/components/splitter/SplitBox.css")
+	const Rep = __webpack_require__(44).Rep;
+	const repUtils = __webpack_require__(45);
+	const StringRep = __webpack_require__(48).StringRep;
+
+	// const repCSS = require("./client/shared/components/reps/reps.css");
+	const Grip = __webpack_require__(54).Grip;
+	const sprintf = __webpack_require__(69).sprintf;
+
+	module.exports = {
+	  Services,
+	  SplitBox,
+	  // SplitBoxCSS,
+	  Rep,
+	  repUtils,
+	  StringRep,
+	  // repCSS,
+	  Grip,
+	  sprintf
+	};
+
+
+/***/ },
+/* 41 */
+/***/ function(module, exports) {
+
+	module.exports = require("Services");
+
+/***/ },
+/* 42 */
+/***/ function(module, exports, __webpack_require__) {
+
+	const React = __webpack_require__(6);
+	const ReactDOM = __webpack_require__(7);
+	const Draggable = React.createFactory(
+	  __webpack_require__(43));
+	const { DOM: dom, PropTypes } = React;
+
+	/**
+	 * This component represents a Splitter. The splitter supports vertical
+	 * as well as horizontal mode.
+	 */
+	const SplitBox = React.createClass({
+
+	  propTypes: {
+	    // Custom class name. You can use more names separated by a space.
+	    className: PropTypes.string,
+	    // Initial size of controlled panel.
+	    initialSize: PropTypes.any,
+	    // Optional initial width of controlled panel.
+	    initialWidth: PropTypes.number,
+	    // Optional initial height of controlled panel.
+	    initialHeight: PropTypes.number,
+	    // Left/top panel
+	    startPanel: PropTypes.any,
+	    // Left/top panel collapse state.
+	    startPanelCollapsed: PropTypes.bool,
+	    // Min panel size.
+	    minSize: PropTypes.any,
+	    // Max panel size.
+	    maxSize: PropTypes.any,
+	    // Right/bottom panel
+	    endPanel: PropTypes.any,
+	    // Right/bottom panel collapse state.
+	    endPanelCollapsed: PropTypes.bool,
+	    // True if the right/bottom panel should be controlled.
+	    endPanelControl: PropTypes.bool,
+	    // Size of the splitter handle bar.
+	    splitterSize: PropTypes.number,
+	    // True if the splitter bar is vertical (default is vertical).
+	    vert: PropTypes.bool,
+	    // Optional style properties passed into the splitbox
+	    style: PropTypes.object
+	  },
+
+	  displayName: "SplitBox",
+
+	  getDefaultProps() {
+	    return {
+	      splitterSize: 5,
+	      vert: true,
+	      endPanelControl: false,
+	      endPanelCollapsed: false,
+	      startPanelCollapsed: false
+	    };
+	  },
+
+	  /**
+	   * The state stores the current orientation (vertical or horizontal)
+	   * and the current size (width/height). All these values can change
+	   * during the component's life time.
+	   */
+	  getInitialState() {
+	    return {
+	      vert: this.props.vert,
+	      width: this.props.initialWidth || this.props.initialSize,
+	      height: this.props.initialHeight || this.props.initialSize
+	    };
+	  },
+
+	  componentWillReceiveProps(nextProps) {
+	    if (this.props.vert !== nextProps.vert) {
+	      this.setState({ vert: nextProps.vert });
+	    }
+	  },
+
+	  // Dragging Events
+
+	  /**
+	   * Set 'resizing' cursor on entire document during splitter dragging.
+	   * This avoids cursor-flickering that happens when the mouse leaves
+	   * the splitter bar area (happens frequently).
+	   */
+	  onStartMove() {
+	    const splitBox = ReactDOM.findDOMNode(this);
+	    const doc = splitBox.ownerDocument;
+	    let defaultCursor = doc.documentElement.style.cursor;
+	    doc.documentElement.style.cursor =
+	      (this.state.vert ? "ew-resize" : "ns-resize");
+
+	    splitBox.classList.add("dragging");
+
+	    this.setState({
+	      defaultCursor: defaultCursor
+	    });
+	  },
+
+	  onStopMove() {
+	    const splitBox = ReactDOM.findDOMNode(this);
+	    const doc = splitBox.ownerDocument;
+	    doc.documentElement.style.cursor = this.state.defaultCursor;
+
+	    splitBox.classList.remove("dragging");
+	  },
+
+	  screenX() {
+	    const borderWidth = (window.outerWidth - window.innerWidth) / 2;
+	    return window.screenX + borderWidth;
+	  },
+
+	  screenY() {
+	    const borderHeignt = (window.outerHeight - window.innerHeight);
+	    return window.screenY + borderHeignt;
+	  },
+
+	  /**
+	   * Adjust size of the controlled panel. Depending on the current
+	   * orientation we either remember the width or height of
+	   * the splitter box.
+	   */
+	  onMove(x, y) {
+	    const node = ReactDOM.findDOMNode(this);
+	    const doc = node.ownerDocument;
+	    const win = doc.defaultView;
+
+	    let size;
+	    let { endPanelControl } = this.props;
+
+	    if (this.state.vert) {
+	      // Switch the control flag in case of RTL. Note that RTL
+	      // has impact on vertical splitter only.
+	      let dir = win.getComputedStyle(doc.documentElement).direction;
+	      if (dir == "rtl") {
+	        endPanelControl = !endPanelControl;
+	      }
+
+	      let innerOffset = x - this.screenX();
+	      size = endPanelControl ?
+	        (node.offsetLeft + node.offsetWidth) - innerOffset :
+	        innerOffset - node.offsetLeft;
+
+	      this.setState({
+	        width: size
+	      });
+	    } else {
+	      let innerOffset = y - this.screenY();
+	      size = endPanelControl ?
+	        (node.offsetTop + node.offsetHeight) - innerOffset :
+	        innerOffset - node.offsetTop;
+
+	      this.setState({
+	        height: size
+	      });
+	    }
+	  },
+
+	  // Rendering
+	  preparePanelStyles() {
+	    const vert = this.state.vert;
+	    const {
+	      minSize, maxSize, startPanelCollapsed, endPanelControl,
+	      endPanelCollapsed } = this.props;
+	    let leftPanelStyle, rightPanelStyle;
+
+	    // Set proper size for panels depending on the current state.
+	    if (vert) {
+	      let startWidth = endPanelControl ? null : this.state.width,
+	        endWidth = endPanelControl ? this.state.width : null;
+
+	      leftPanelStyle = {
+	        maxWidth: endPanelControl ? null : maxSize,
+	        minWidth: endPanelControl ? null : minSize,
+	        width: startPanelCollapsed ? 0 : startWidth
+	      };
+	      rightPanelStyle = {
+	        maxWidth: endPanelControl ? maxSize : null,
+	        minWidth: endPanelControl ? minSize : null,
+	        width: endPanelCollapsed ? 0 : endWidth
+	      };
+	    } else {
+	      leftPanelStyle = {
+	        maxHeight: endPanelControl ? null : maxSize,
+	        minHeight: endPanelControl ? null : minSize,
+	        height: endPanelControl ? null : this.state.height
+	      };
+	      rightPanelStyle = {
+	        maxHeight: endPanelControl ? maxSize : null,
+	        minHeight: endPanelControl ? minSize : null,
+	        height: endPanelControl ? this.state.height : null
+	      };
+	    }
+
+	    return { leftPanelStyle, rightPanelStyle };
+	  },
+
+	  render() {
+	    const vert = this.state.vert;
+	    const { startPanel, endPanel, endPanelControl, splitterSize } = this.props;
+
+	    let style = Object.assign({}, this.props.style);
+
+	    // Calculate class names list.
+	    let classNames = ["split-box"];
+	    classNames.push(vert ? "vert" : "horz");
+	    if (this.props.className) {
+	      classNames = classNames.concat(this.props.className.split(" "));
+	    }
+
+	    const { leftPanelStyle, rightPanelStyle } = this.preparePanelStyles();
+
+	    // Calculate splitter size
+	    let splitterStyle = {
+	      flex: `0 0 ${splitterSize}px`
+	    };
+
+	    return (
+	      dom.div({
+	        className: classNames.join(" "),
+	        style: style },
+	        startPanel ?
+	          dom.div({
+	            className: endPanelControl ? "uncontrolled" : "controlled",
+	            style: leftPanelStyle },
+	            startPanel
+	          ) : null,
+	        Draggable({
+	          className: "splitter",
+	          style: splitterStyle,
+	          onStart: this.onStartMove,
+	          onStop: this.onStopMove,
+	          onMove: this.onMove
+	        }),
+	        endPanel ?
+	          dom.div({
+	            className: endPanelControl ? "controlled" : "uncontrolled",
+	            style: rightPanelStyle },
+	            endPanel
+	          ) : null
+	      )
+	    );
+	  }
+	});
+
+	module.exports = SplitBox;
+
+
+/***/ },
+/* 43 */
+/***/ 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 React = __webpack_require__(6);
+	const ReactDOM = __webpack_require__(7);
+	const { DOM: dom, PropTypes } = React;
+	
+	const Draggable = React.createClass({
+	  displayName: "Draggable",
+	
+	  propTypes: {
+	    onMove: PropTypes.func.isRequired,
+	    onStart: PropTypes.func,
+	    onStop: PropTypes.func,
+	    style: PropTypes.object,
+	    className: PropTypes.string
+	  },
+	
+	  startDragging(ev) {
+	    ev.preventDefault();
+	    const doc = ReactDOM.findDOMNode(this).ownerDocument;
+	    doc.addEventListener("mousemove", this.onMove);
+	    doc.addEventListener("mouseup", this.onUp);
+	    this.props.onStart && this.props.onStart();
+	  },
+	
+	  onMove(ev) {
+	    ev.preventDefault();
+	    // Use screen coordinates so, moving mouse over iframes
+	    // doesn't mangle (relative) coordinates.
+	    this.props.onMove(ev.screenX, ev.screenY);
+	  },
+	
+	  onUp(ev) {
+	    ev.preventDefault();
+	    const doc = ReactDOM.findDOMNode(this).ownerDocument;
+	    doc.removeEventListener("mousemove", this.onMove);
+	    doc.removeEventListener("mouseup", this.onUp);
+	    this.props.onStop && this.props.onStop();
+	  },
+	
+	  render() {
+	    return dom.div({
+	      style: this.props.style,
+	      className: this.props.className,
+	      onMouseDown: this.startDragging
+	    });
+	  }
+	});
+	
+	module.exports = Draggable;
+
+
+/***/ },
+/* 44 */
+/***/ 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__(6);
+
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Load all existing rep templates
+	  const { Undefined } = __webpack_require__(46);
+	  const { Null } = __webpack_require__(47);
+	  const { StringRep } = __webpack_require__(48);
+	  const { Number } = __webpack_require__(49);
+	  const { ArrayRep } = __webpack_require__(50);
+	  const { Obj } = __webpack_require__(52);
+	  const { SymbolRep } = __webpack_require__(55);
+
+	  // DOM types (grips)
+	  const { Attribute } = __webpack_require__(56);
+	  const { DateTime } = __webpack_require__(57);
+	  const { Document } = __webpack_require__(58);
+	  const { Event } = __webpack_require__(59);
+	  const { Func } = __webpack_require__(60);
+	  const { RegExp } = __webpack_require__(61);
+	  const { StyleSheet } = __webpack_require__(62);
+	  const { TextNode } = __webpack_require__(63);
+	  const { Window } = __webpack_require__(64);
+	  const { ObjectWithText } = __webpack_require__(65);
+	  const { ObjectWithURL } = __webpack_require__(66);
+	  const { GripArray } = __webpack_require__(67);
+	  const { GripMap } = __webpack_require__(68);
+	  const { Grip } = __webpack_require__(54);
+
+	  // 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,
+	    Attribute,
+	    Func,
+	    ArrayRep,
+	    Document,
+	    Window,
+	    ObjectWithText,
+	    ObjectWithURL,
+	    GripArray,
+	    GripMap,
+	    Grip,
+	    Undefined,
+	    Null,
+	    StringRep,
+	    Number,
+	    SymbolRep,
+	  ];
+
+	  /**
+	   * 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,
+	      mode: React.PropTypes.string
+	    },
+
+	    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";
+	    } else if (type == "object" && object.type === "symbol") {
+	      type = "symbol";
+	    }
+
+	    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__));
+
+
+/***/ },
+/* 45 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_RESULT__;/* globals URLSearchParams */
+	/* -*- 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__(6);
+
+	  /**
+	   * 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 + "";
+
+	    // Replace all non-printable characters, except of
+	    // (horizontal) tab (HT: \x09) and newline (LF: \x0A, CR: \x0D),
+	    // with unicode replacement character (u+fffd).
+	    // eslint-disable-next-line no-control-regex
+	    let re = new RegExp("[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]", "g");
+	    text = text.replace(re, "\ufffd");
+
+	    // Crop the string only if a limit is actually specified.
+	    if (!limit || 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;
+	  }
+
+	  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 getURLDisplayString(url) {
+	    return cropString(url);
+	  }
+
+	  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.createFactories = createFactories;
+	  exports.isGrip = isGrip;
+	  exports.cropString = cropString;
+	  exports.cropMultipleLines = cropMultipleLines;
+	  exports.parseURLParams = parseURLParams;
+	  exports.parseURLEncodedText = parseURLEncodedText;
+	  exports.getFileName = getFileName;
+	  exports.getURLDisplayString = getURLDisplayString;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 46 */
+/***/ 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__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders undefined value
+	   */
+	  const Undefined = React.createClass({
+	    displayName: "UndefinedRep",
+
+	    render: function () {
+	      return (
+	        span({className: "objectBox objectBox-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__));
+
+
+/***/ },
+/* 47 */
+/***/ 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__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders null value
+	   */
+	  const Null = React.createClass({
+	    displayName: "NullRep",
+
+	    render: function () {
+	      return (
+	        span({className: "objectBox objectBox-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__));
+
+
+/***/ },
+/* 48 */
+/***/ 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__(6);
+	  const { cropMultipleLines } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a string. String value is enclosed within quotes.
+	   */
+	  const StringRep = React.createClass({
+	    displayName: "StringRep",
+
+	    propTypes: {
+	      useQuotes: React.PropTypes.bool,
+	    },
+
+	    getDefaultProps: function () {
+	      return {
+	        useQuotes: true,
+	      };
+	    },
+
+	    render: function () {
+	      let text = this.props.object;
+	      let member = this.props.member;
+	      if (member && member.open) {
+	        return (
+	          span({className: "objectBox objectBox-string"},
+	            "\"" + text + "\""
+	          )
+	        );
+	      }
+
+	      let croppedString = this.props.cropLimit ?
+	        cropMultipleLines(text, this.props.cropLimit) : cropMultipleLines(text);
+
+	      let formattedString = this.props.useQuotes ?
+	        "\"" + croppedString + "\"" : croppedString;
+
+	      return (
+	        span({className: "objectBox objectBox-string"}, formattedString
+	        )
+	      );
+	    },
+	  });
+
+	  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__));
+
+
+/***/ },
+/* 49 */
+/***/ 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__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a number
+	   */
+	  const Number = React.createClass({
+	    displayName: "Number",
+
+	    stringify: function (object) {
+	      let isNegativeZero = Object.is(object, -0) ||
+	        (object.type && object.type == "-0");
+
+	      return (isNegativeZero ? "-0" : String(object));
+	    },
+
+	    render: function () {
+	      let value = this.props.object;
+
+	      return (
+	        span({className: "objectBox objectBox-number"},
+	          this.stringify(value)
+	        )
+	      );
+	    }
+	  });
+
+	  function supportsObject(object, type) {
+	    return type == "boolean" || type == "number" ||
+	      (type == "object" && object.type == "-0");
+	  }
+
+	  // 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__));
+
+
+/***/ },
+/* 50 */
+/***/ 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__(6);
+	  const { createFactories } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+
+	  // 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 ? "" : ", ");
+
+	          items.push(ItemRep({
+	            key: i,
+	            object: value,
+	            // Hardcode tiny mode to avoid recursive handling.
+	            mode: "tiny",
+	            delim: delim
+	          }));
+	        } catch (exc) {
+	          items.push(ItemRep({
+	            key: i,
+	            object: exc,
+	            mode: "tiny",
+	            delim: delim
+	          }));
+	        }
+	      }
+
+	      if (array.length > max) {
+	        let objectLink = this.props.objectLink || DOM.span;
+	        items.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: this.props.object
+	          }, (array.length - max) + " 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;
+	      let brackets;
+	      let needSpace = function (space) {
+	        return space ? { left: "[ ", right: " ]"} : { left: "[", right: "]"};
+	      };
+
+	      if (mode == "tiny") {
+	        let isEmpty = object.length === 0;
+	        items = DOM.span({className: "length"}, isEmpty ? "" : object.length);
+	        brackets = needSpace(false);
+	      } else {
+	        let max = (mode == "short") ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	        brackets = needSpace(items.length > 0);
+	      }
+
+	      let objectLink = this.props.objectLink || DOM.span;
+
+	      return (
+	        DOM.span({
+	          className: "objectBox objectBox-array"},
+	          objectLink({
+	            className: "arrayLeftBracket",
+	            object: object
+	          }, brackets.left),
+	          items,
+	          objectLink({
+	            className: "arrayRightBracket",
+	            object: object
+	          }, brackets.right),
+	          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__(44));
+
+	      let object = this.props.object;
+	      let delim = this.props.delim;
+	      let mode = this.props.mode;
+	      return (
+	        DOM.span({},
+	          Rep({object: object, mode: mode}),
+	          delim
+	        )
+	      );
+	    }
+	  }));
+
+	  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__));
+
+
+/***/ },
+/* 51 */
+/***/ 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__(6);
+	  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__));
+
+
+/***/ },
+/* 52 */
+/***/ 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__(6);
+	  const { createFactories } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+	  const { PropRep } = createFactories(__webpack_require__(53));
+	  // 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 (object) {
+	      let className = object && object.class ? object.class : "Object";
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: object
+	        }, className);
+	      }
+	      return className;
+	    },
+
+	    safePropIterator: function (object, max) {
+	      max = (typeof max === "undefined") ? 3 : max;
+	      try {
+	        return this.propIterator(object, max);
+	      } 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();
+	        let objectLink = this.props.objectLink || span;
+
+	        props.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: object
+	          }, (Object.keys(object).length - max) + " 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;
+	      }
+
+	      // Hardcode tiny mode to avoid recursive handling.
+	      let mode = "tiny";
+
+	      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.safePropIterator(object);
+	      let objectLink = this.props.objectLink || span;
+
+	      if (this.props.mode == "tiny" || !props.length) {
+	        return (
+	          span({className: "objectBox objectBox-object"},
+	            objectLink({className: "objectTitle"}, this.getTitle(object))
+	          )
+	        );
+	      }
+
+	      return (
+	        span({className: "objectBox objectBox-object"},
+	          this.getTitle(object),
+	          objectLink({
+	            className: "objectLeftBrace",
+	            object: object
+	          }, " { "),
+	          props,
+	          objectLink({
+	            className: "objectRightBrace",
+	            object: object
+	          }, " }")
+	        )
+	      );
+	    },
+	  });
+	  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__));
+
+
+/***/ },
+/* 53 */
+/***/ 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__(6);
+	  const { createFactories } = __webpack_require__(45);
+	  const { span } = React.DOM;
+
+	  /**
+	   * Property for Obj (local JS objects), Grip (remote JS objects)
+	   * and GripMap (remote JS maps and weakmaps) reps.
+	   * It's used to render object properties.
+	   */
+	  let PropRep = React.createFactory(React.createClass({
+	    displayName: "PropRep",
+
+	    propTypes: {
+	      // Property name.
+	      name: React.PropTypes.oneOfType([
+	        React.PropTypes.string,
+	        React.PropTypes.object,
+	      ]).isRequired,
+	      // Equal character rendered between property name and value.
+	      equal: React.PropTypes.string,
+	      // Delimiter character used to separate individual properties.
+	      delim: React.PropTypes.string,
+	      mode: React.PropTypes.string,
+	    },
+
+	    render: function () {
+	      const { Grip } = __webpack_require__(54);
+	      let { Rep } = createFactories(__webpack_require__(44));
+
+	      let key;
+	      // The key can be a simple string, for plain objects,
+	      // or another object for maps and weakmaps.
+	      if (typeof this.props.name === "string") {
+	        key = span({"className": "nodeName"}, this.props.name);
+	      } else {
+	        key = Rep({
+	          object: this.props.name,
+	          mode: this.props.mode || "tiny",
+	          defaultRep: Grip,
+	          objectLink: this.props.objectLink,
+	        });
+	      }
+
+	      return (
+	        span({},
+	          key,
+	          span({
+	            "className": "objectEqual"
+	          }, this.props.equal),
+	          Rep(this.props),
+	          span({
+	            "className": "objectComma"
+	          }, 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__));
+
+
+/***/ },
+/* 54 */
+/***/ 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__(6);
+	  // Dependencies
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+	  const { PropRep } = createFactories(__webpack_require__(53));
+	  // 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 GripRep = React.createClass({
+	    displayName: "Grip",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string,
+	      isInterestingProp: React.PropTypes.func
+	    },
+
+	    getTitle: function (object) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: object
+	        }, object.class);
+	      }
+	      return object.class || "Object";
+	    },
+
+	    safePropIterator: function (object, max) {
+	      max = (typeof max === "undefined") ? 3 : max;
+	      try {
+	        return this.propIterator(object, max);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+
+	    propIterator: function (object, max) {
+	      // Property filter. Show only interesting properties to the user.
+	      let isInterestingProp = this.props.isInterestingProp || ((type, value) => {
+	        return (
+	          type == "boolean" ||
+	          type == "number" ||
+	          (type == "string" && value.length != 0)
+	        );
+	      });
+
+	      let ownProperties = object.preview ? object.preview.ownProperties : [];
+	      let indexes = this.getPropIndexes(ownProperties, max, isInterestingProp);
+	      if (indexes.length < max && indexes.length < object.ownPropertyLength) {
+	        // There are not enough props yet. Then add uninteresting props to display them.
+	        indexes = indexes.concat(
+	          this.getPropIndexes(ownProperties, max - indexes.length, (t, value, name) => {
+	            return !isInterestingProp(t, value, name);
+	          })
+	        );
+	      }
+
+	      let props = this.getProps(ownProperties, indexes);
+	      if (props.length < object.ownPropertyLength) {
+	        // There are some undisplayed props. Then display "more...".
+	        let objectLink = this.props.objectLink || span;
+
+	        props.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: object
+	          }, ((object ? object.ownPropertyLength : 0) - max) + " 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;
+	    },
+
+	    /**
+	     * Get props ordered by index.
+	     *
+	     * @param {Object} ownProperties Props object.
+	     * @param {Array} indexes Indexes of props.
+	     * @return {Array} Props.
+	     */
+	    getProps: function (ownProperties, indexes) {
+	      let props = [];
+
+	      if (!ownProperties || ownProperties.length == 0) {
+	        return props;
+	      }
+
+	      // Make indexes ordered by ascending.
+	      indexes.sort(function (a, b) {
+	        return a - b;
+	      });
+
+	      indexes.forEach((i) => {
+	        let name = Object.keys(ownProperties)[i];
+	        let prop = ownProperties[name];
+	        let value = prop.value !== undefined ? prop.value : prop;
+	        props.push(PropRep(Object.assign({}, this.props, {
+	          key: name,
+	          mode: "tiny",
+	          name: name,
+	          object: value,
+	          equal: ": ",
+	          delim: ", ",
+	          defaultRep: Grip
+	        })));
+	      });
+
+	      return props;
+	    },
+
+	    /**
+	     * Get the indexes of props in the object.
+	     *
+	     * @param {Object} ownProperties Props object.
+	     * @param {Number} max The maximum length of indexes array.
+	     * @param {Function} filter Filter the props you want.
+	     * @return {Array} Indexes of interesting props in the object.
+	     */
+	    getPropIndexes: function (ownProperties, max, filter) {
+	      let indexes = [];
+
+	      try {
+	        let i = 0;
+	        for (let name in ownProperties) {
+	          if (indexes.length >= max) {
+	            return indexes;
+	          }
+
+	          let prop = ownProperties[name];
+	          let value = prop.value !== undefined ? prop.value : prop;
+
+	          // Type is specified in grip's "class" field and for primitive
+	          // values use typeof.
+	          let type = (value.class || typeof value);
+	          type = type.toLowerCase();
+
+	          if (filter(type, value, name)) {
+	            indexes.push(i);
+	          }
+	          i++;
+	        }
+	      } catch (err) {
+	        console.error(err);
+	      }
+
+	      return indexes;
+	    },
+
+	    render: function () {
+	      let object = this.props.object;
+	      let props = this.safePropIterator(object,
+	        (this.props.mode == "long") ? 100 : 3);
+
+	      let objectLink = this.props.objectLink || span;
+	      if (this.props.mode == "tiny" || !props.length) {
+	        return (
+	          span({className: "objectBox objectBox-object"},
+	            this.getTitle(object),
+	            objectLink({
+	              className: "objectLeftBrace",
+	              object: object
+	            }, "")
+	          )
+	        );
+	      }
+
+	      return (
+	        span({className: "objectBox objectBox-object"},
+	          this.getTitle(object),
+	          objectLink({
+	            className: "objectLeftBrace",
+	            object: object
+	          }, " { "),
+	          props,
+	          objectLink({
+	            className: "objectRightBrace",
+	            object: object
+	          }, " }")
+	        )
+	      );
+	    },
+	  });
+
+	  // Registration
+	  function supportsObject(object, type) {
+	    if (!isGrip(object)) {
+	      return false;
+	    }
+	    return (object.preview && object.preview.ownProperties);
+	  }
+
+	  let Grip = {
+	    rep: GripRep,
+	    supportsObject: supportsObject
+	  };
+
+	  // Exports from this module
+	  exports.Grip = Grip;
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 55 */
+/***/ 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__(6);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a symbol.
+	   */
+	  const SymbolRep = React.createClass({
+	    displayName: "SymbolRep",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+
+	    render: function () {
+	      let {object} = this.props;
+	      let {name} = object;
+
+	      return (
+	        span({className: "objectBox objectBox-symbol"},
+	          `Symbol(${name || ""})`
+	        )
+	      );
+	    },
+	  });
+
+	  function supportsObject(object, type) {
+	    return (type == "symbol");
+	  }
+
+	  // Exports from this module
+	  exports.SymbolRep = {
+	    rep: SymbolRep,
+	    supportsObject: supportsObject,
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 56 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { StringRep } = __webpack_require__(48);
+
+	  // 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;
+	      let objectLink = this.props.objectLink || span;
+
+	      return (
+	        objectLink({className: "objectLink-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__));
+
+
+/***/ },
+/* 57 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip } = __webpack_require__(45);
+
+	  // 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) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: grip
+	        }, grip.class + " ");
+	      }
+	      return "";
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        span({className: "objectBox"},
+	          this.getTitle(grip),
+	          span({className: "Date"},
+	            new Date(grip.preview.timestamp).toISOString()
+	          )
+	        )
+	      );
+	    },
+	  });
+
+	  // 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__));
+
+
+/***/ },
+/* 58 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // 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 ? getURLDisplayString(location) : "";
+	    },
+
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return span({className: "objectBox"},
+	          this.props.objectLink({
+	            object: grip
+	          }, grip.class + " ")
+	        );
+	      }
+	      return "";
+	    },
+
+	    getTooltip: function (doc) {
+	      return doc.location.href;
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+
+	      return (
+	        span({className: "objectBox objectBox-object"},
+	          this.getTitle(grip),
+	          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__));
+
+
+/***/ },
+/* 59 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { rep } = createFactories(__webpack_require__(54).Grip);
+
+	  /**
+	   * Renders DOM event objects.
+	   */
+	  let Event = React.createClass({
+	    displayName: "event",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+
+	    render: function () {
+	      // Use `Object.assign` to keep `this.props` without changes because:
+	      // 1. JSON.stringify/JSON.parse is slow.
+	      // 2. Immutable.js is planned for the future.
+	      let props = Object.assign({}, this.props);
+	      props.object = Object.assign({}, this.props.object);
+	      props.object.preview = Object.assign({}, this.props.object.preview);
+	      props.object.preview.ownProperties = props.object.preview.properties;
+	      delete props.object.preview.properties;
+	      props.object.ownPropertyLength =
+	        Object.keys(props.object.preview.ownProperties).length;
+
+	      switch (props.object.class) {
+	        case "MouseEvent":
+	          props.isInterestingProp = (type, value, name) => {
+	            return (name == "clientX" ||
+	                    name == "clientY" ||
+	                    name == "layerX" ||
+	                    name == "layerY");
+	          };
+	          break;
+	        case "KeyboardEvent":
+	          props.isInterestingProp = (type, value, name) => {
+	            return (name == "key" ||
+	                    name == "charCode" ||
+	                    name == "keyCode");
+	          };
+	          break;
+	        case "MessageEvent":
+	          props.isInterestingProp = (type, value, name) => {
+	            return (name == "isTrusted" ||
+	                    name == "data");
+	          };
+	          break;
+	      }
+	      return rep(props);
+	    }
+	  });
+
+	  // 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__));
+
+
+/***/ },
+/* 60 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip, cropString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * This component represents a template for Function objects.
+	   */
+	  let Func = React.createClass({
+	    displayName: "Func",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired
+	    },
+
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: grip
+	        }, "function ");
+	      }
+	      return "";
+	    },
+
+	    summarizeFunction: function (grip) {
+	      let name = grip.userDisplayName || grip.displayName || grip.name || "function";
+	      return cropString(name + "()", 100);
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+
+	      return (
+	        span({className: "objectBox objectBox-function"},
+	          this.getTitle(grip),
+	          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__));
+
+
+/***/ },
+/* 61 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a grip object with regular expression.
+	   */
+	  let RegExp = React.createClass({
+	    displayName: "regexp",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+
+	    getSource: function (grip) {
+	      return grip.displayString;
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      let objectLink = this.props.objectLink || span;
+
+	      return (
+	        span({className: "objectBox objectBox-regexp"},
+	          objectLink({
+	            object: grip,
+	            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__));
+
+
+/***/ },
+/* 62 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const DOM = React.DOM;
+
+	  /**
+	   * Renders a grip representing CSSStyleSheet
+	   */
+	  let StyleSheet = React.createClass({
+	    displayName: "object",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+
+	    getTitle: function (grip) {
+	      let title = "StyleSheet ";
+	      if (this.props.objectLink) {
+	        return DOM.span({className: "objectBox"},
+	          this.props.objectLink({
+	            object: grip
+	          }, title)
+	        );
+	      }
+	      return title;
+	    },
+
+	    getLocation: function (grip) {
+	      // Embedded stylesheets don't have URL and so, no preview.
+	      let url = grip.preview ? grip.preview.url : "";
+	      return url ? getURLDisplayString(url) : "";
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+
+	      return (
+	        DOM.span({className: "objectBox objectBox-object"},
+	          this.getTitle(grip),
+	          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__));
+
+
+/***/ },
+/* 63 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip, cropMultipleLines } = __webpack_require__(45);
+
+	  // 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 (grip) {
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: grip
+	        }, "#text");
+	      }
+	      return "";
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      let mode = this.props.mode || "short";
+
+	      if (mode == "short" || mode == "tiny") {
+	        return (
+	          DOM.span({className: "objectBox objectBox-textNode"},
+	            this.getTitle(grip),
+	            "\"" + this.getTextContent(grip) + "\""
+	          )
+	        );
+	      }
+
+	      let objectLink = this.props.objectLink || DOM.span;
+	      return (
+	        DOM.span({className: "objectBox objectBox-textNode"},
+	          this.getTitle(grip),
+	          objectLink({
+	            object: grip
+	          }, "<"),
+	          DOM.span({className: "nodeTag"}, "TextNode"),
+	          " textContent=\"",
+	          DOM.span({className: "nodeValue"},
+	            this.getTextContent(grip)
+	          ),
+	          "\"",
+	          objectLink({
+	            object: 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__));
+
+
+/***/ },
+/* 64 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const DOM = React.DOM;
+
+	  /**
+	   * Renders a grip representing a window.
+	   */
+	  let Window = React.createClass({
+	    displayName: "Window",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	      mode: React.PropTypes.string
+	    },
+
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return DOM.span({className: "objectBox"},
+	          this.props.objectLink({
+	            object: grip
+	          }, grip.class + " ")
+	        );
+	      }
+	      return "";
+	    },
+
+	    getLocation: function (grip) {
+	      return getURLDisplayString(grip.preview.url);
+	    },
+
+	    getDisplayValue: function (grip) {
+	      if (this.props.mode === "tiny") {
+	        return grip.isGlobal ? "Global" : "Window";
+	      } else {
+	        return this.getLocation(grip);
+	      }
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+
+	      return (
+	        DOM.span({className: "objectBox objectBox-Window"},
+	          this.getTitle(grip),
+	          DOM.span({className: "objectPropValue"},
+	            this.getDisplayValue(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__));
+
+
+/***/ },
+/* 65 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a grip object with textual data.
+	   */
+	  let ObjectWithText = React.createClass({
+	    displayName: "ObjectWithText",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return span({className: "objectBox"},
+	          this.props.objectLink({
+	            object: grip
+	          }, this.getType(grip) + " ")
+	        );
+	      }
+	      return "";
+	    },
+
+	    getType: function (grip) {
+	      return grip.class;
+	    },
+
+	    getDescription: function (grip) {
+	      return "\"" + grip.preview.text + "\"";
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        span({className: "objectBox objectBox-" + this.getType(grip)},
+	          this.getTitle(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__));
+
+
+/***/ },
+/* 66 */
+/***/ 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__(6);
+
+	  // Reps
+	  const { isGrip, getURLDisplayString } = __webpack_require__(45);
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+
+	  /**
+	   * Renders a grip object with URL data.
+	   */
+	  let ObjectWithURL = React.createClass({
+	    displayName: "ObjectWithURL",
+
+	    propTypes: {
+	      object: React.PropTypes.object.isRequired,
+	    },
+
+	    getTitle: function (grip) {
+	      if (this.props.objectLink) {
+	        return span({className: "objectBox"},
+	          this.props.objectLink({
+	            object: grip
+	          }, this.getType(grip) + " ")
+	        );
+	      }
+	      return "";
+	    },
+
+	    getType: function (grip) {
+	      return grip.class;
+	    },
+
+	    getDescription: function (grip) {
+	      return getURLDisplayString(grip.preview.url);
+	    },
+
+	    render: function () {
+	      let grip = this.props.object;
+	      return (
+	        span({className: "objectBox objectBox-" + this.getType(grip)},
+	          this.getTitle(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__));
+
+
+/***/ },
+/* 67 */
+/***/ 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__(6);
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+
+	  // Shortcuts
+	  const { 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) {
+	      let objectLink = this.props.objectLink || span;
+	      if (this.props.mode != "tiny") {
+	        return objectLink({
+	          object: object
+	        }, object.class + " ");
+	      }
+	      return "";
+	    },
+
+	    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;
+	      // number of grip.preview.items is limited to 10, but we may have more
+	      // items in grip-array
+	      let delimMax = grip.preview.length > array.length ?
+	        array.length : array.length - 1;
+	      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 == delimMax ? "" : ", ");
+
+	          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 || grip.preview.length > array.length) {
+	        let objectLink = this.props.objectLink || span;
+	        let leftItemNum = grip.preview.length - max > 0 ?
+	          grip.preview.length - max : grip.preview.length - array.length;
+	        items.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: this.props.object
+	          }, leftItemNum + " more…")
+	        }));
+	      }
+
+	      return items;
+	    },
+
+	    render: function () {
+	      let mode = this.props.mode || "short";
+	      let object = this.props.object;
+
+	      let items;
+	      let brackets;
+	      let needSpace = function (space) {
+	        return space ? { left: "[ ", right: " ]"} : { left: "[", right: "]"};
+	      };
+
+	      if (mode == "tiny") {
+	        let objectLength = this.getLength(object);
+	        let isEmpty = objectLength === 0;
+	        items = span({className: "length"}, isEmpty ? "" : objectLength);
+	        brackets = needSpace(false);
+	      } else {
+	        let max = (mode == "short") ? 3 : 300;
+	        items = this.arrayIterator(object, max);
+	        brackets = needSpace(items.length > 0);
+	      }
+
+	      let objectLink = this.props.objectLink || span;
+	      let title = this.getTitle(object);
+
+	      return (
+	        span({
+	          className: "objectBox objectBox-array"},
+	          title,
+	          objectLink({
+	            className: "arrayLeftBracket",
+	            object: object
+	          }, brackets.left),
+	          items,
+	          objectLink({
+	            className: "arrayRightBracket",
+	            object: object
+	          }, brackets.right),
+	          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__(44));
+
+	      return (
+	        span({},
+	          Rep(Object.assign({}, this.props, {
+	            mode: "tiny"
+	          })),
+	          this.props.delim
+	        )
+	      );
+	    }
+	  }));
+
+	  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__));
+
+
+/***/ },
+/* 68 */
+/***/ 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__(6);
+	  const { createFactories, isGrip } = __webpack_require__(45);
+	  const { Caption } = createFactories(__webpack_require__(51));
+	  const { PropRep } = createFactories(__webpack_require__(53));
+
+	  // Shortcuts
+	  const { span } = React.DOM;
+	  /**
+	   * Renders an map. A map is represented by a list of its
+	   * entries enclosed in curly brackets.
+	   */
+	  const GripMap = React.createClass({
+	    displayName: "GripMap",
+
+	    propTypes: {
+	      object: React.PropTypes.object,
+	      mode: React.PropTypes.string,
+	    },
+
+	    getTitle: function (object) {
+	      let title = object && object.class ? object.class : "Map";
+	      if (this.props.objectLink) {
+	        return this.props.objectLink({
+	          object: object
+	        }, title);
+	      }
+	      return title;
+	    },
+
+	    safeEntriesIterator: function (object, max) {
+	      max = (typeof max === "undefined") ? 3 : max;
+	      try {
+	        return this.entriesIterator(object, max);
+	      } catch (err) {
+	        console.error(err);
+	      }
+	      return [];
+	    },
+
+	    entriesIterator: function (object, max) {
+	      // Entry filter. Show only interesting entries to the user.
+	      let isInterestingEntry = this.props.isInterestingEntry || ((type, value) => {
+	        return (
+	          type == "boolean" ||
+	          type == "number" ||
+	          (type == "string" && value.length != 0)
+	        );
+	      });
+
+	      let mapEntries = object.preview && object.preview.entries
+	        ? object.preview.entries : [];
+
+	      let indexes = this.getEntriesIndexes(mapEntries, max, isInterestingEntry);
+	      if (indexes.length < max && indexes.length < mapEntries.length) {
+	        // There are not enough entries yet, so we add uninteresting entries.
+	        indexes = indexes.concat(
+	          this.getEntriesIndexes(mapEntries, max - indexes.length, (t, value, name) => {
+	            return !isInterestingEntry(t, value, name);
+	          })
+	        );
+	      }
+
+	      let entries = this.getEntries(mapEntries, indexes);
+	      if (entries.length < mapEntries.length) {
+	        // There are some undisplayed entries. Then display "more…".
+	        let objectLink = this.props.objectLink || span;
+
+	        entries.push(Caption({
+	          key: "more",
+	          object: objectLink({
+	            object: object
+	          }, `${mapEntries.length - max} more…`)
+	        }));
+	      }
+
+	      return entries;
+	    },
+
+	    /**
+	     * Get entries ordered by index.
+	     *
+	     * @param {Array} entries Entries array.
+	     * @param {Array} indexes Indexes of entries.
+	     * @return {Array} Array of PropRep.
+	     */
+	    getEntries: function (entries, indexes) {
+	      // Make indexes ordered by ascending.
+	      indexes.sort(function (a, b) {
+	        return a - b;
+	      });
+
+	      return indexes.map((index, i) => {
+	        let [key, entryValue] = entries[index];
+	        let value = entryValue.value !== undefined ? entryValue.value : entryValue;
+
+	        return PropRep({
+	          // key,
+	          name: key,
+	          equal: ": ",
+	          object: value,
+	          // Do not add a trailing comma on the last entry
+	          // if there won't be a "more..." item.
+	          delim: (i < indexes.length - 1 || indexes.length < entries.length) ? ", " : "",
+	          mode: "tiny",
+	          objectLink: this.props.objectLink,
+	        });
+	      });
+	    },
+
+	    /**
+	     * Get the indexes of entries in the map.
+	     *
+	     * @param {Array} entries Entries array.
+	     * @param {Number} max The maximum length of indexes array.
+	     * @param {Function} filter Filter the entry you want.
+	     * @return {Array} Indexes of filtered entries in the map.
+	     */
+	    getEntriesIndexes: function (entries, max, filter) {
+	      return entries
+	        .reduce((indexes, [key, entry], i) => {
+	          if (indexes.length < max) {
+	            let value = (entry && entry.value !== undefined) ? entry.value : entry;
+	            // Type is specified in grip's "class" field and for primitive
+	            // values use typeof.
+	            let type = (value && value.class ? value.class : typeof value).toLowerCase();
+
+	            if (filter(type, value, key)) {
+	              indexes.push(i);
+	            }
+	          }
+
+	          return indexes;
+	        }, []);
+	    },
+
+	    render: function () {
+	      let object = this.props.object;
+	      let props = this.safeEntriesIterator(object,
+	        (this.props.mode == "long") ? 100 : 3);
+
+	      let objectLink = this.props.objectLink || span;
+	      if (this.props.mode == "tiny") {
+	        return (
+	          span({className: "objectBox objectBox-object"},
+	            this.getTitle(object),
+	            objectLink({
+	              className: "objectLeftBrace",
+	              object: object
+	            }, "")
+	          )
+	        );
+	      }
+
+	      return (
+	        span({className: "objectBox objectBox-object"},
+	          this.getTitle(object),
+	          objectLink({
+	            className: "objectLeftBrace",
+	            object: object
+	          }, " { "),
+	          props,
+	          objectLink({
+	            className: "objectRightBrace",
+	            object: object
+	          }, " }")
+	        )
+	      );
+	    },
+	  });
+
+	  function supportsObject(grip, type) {
+	    if (!isGrip(grip)) {
+	      return false;
+	    }
+	    return (grip.preview && grip.preview.kind == "MapLike");
+	  }
+
+	  // Exports from this module
+	  exports.GripMap = {
+	    rep: GripMap,
+	    supportsObject: supportsObject
+	  };
+	}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+
+
+/***/ },
+/* 69 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/**
+	 * Copyright (c) 2007-2016, Alexandru Marasteanu <hello [at) alexei (dot] ro>
+	 * All rights reserved.
+	 *
+	 * Redistribution and use in source and binary forms, with or without
+	 * modification, are permitted provided that the following conditions are met:
+	 * * Redistributions of source code must retain the above copyright
+	 *   notice, this list of conditions and the following disclaimer.
+	 * * Redistributions in binary form must reproduce the above copyright
+	 *   notice, this list of conditions and the following disclaimer in the
+	 *   documentation and/or other materials provided with the distribution.
+	 * * Neither the name of this software nor the names of its contributors may be
+	 *   used to endorse or promote products derived from this software without
+	 *   specific prior written permission.
+	 *
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+	 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+	 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+	 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+	 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+	 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+	 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+	 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+	 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	 *
+	 */
+
+	/* globals window, exports, define */
+
+	(function(window) {
+	    'use strict'
+
+	    var re = {
+	        not_string: /[^s]/,
+	        not_bool: /[^t]/,
+	        not_type: /[^T]/,
+	        not_primitive: /[^v]/,
+	        number: /[diefg]/,
+	        numeric_arg: /bcdiefguxX/,
+	        json: /[j]/,
+	        not_json: /[^j]/,
+	        text: /^[^\x25]+/,
+	        modulo: /^\x25{2}/,
+	        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosStTuvxX])/,
+	        key: /^([a-z_][a-z_\d]*)/i,
+	        key_access: /^\.([a-z_][a-z_\d]*)/i,
+	        index_access: /^\[(\d+)\]/,
+	        sign: /^[\+\-]/
+	    }
+
+	    function sprintf() {
+	        var key = arguments[0], cache = sprintf.cache
+	        if (!(cache[key] && cache.hasOwnProperty(key))) {
+	            cache[key] = sprintf.parse(key)
+	        }
+	        return sprintf.format.call(null, cache[key], arguments)
+	    }
+
+	    sprintf.format = function(parse_tree, argv) {
+	        var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = ''
+	        for (i = 0; i < tree_length; i++) {
+	            node_type = get_type(parse_tree[i])
+	            if (node_type === 'string') {
+	                output[output.length] = parse_tree[i]
+	            }
+	            else if (node_type === 'array') {
+	                match = parse_tree[i] // convenience purposes only
+	                if (match[2]) { // keyword argument
+	                    arg = argv[cursor]
+	                    for (k = 0; k < match[2].length; k++) {
+	                        if (!arg.hasOwnProperty(match[2][k])) {
+	                            throw new Error(sprintf('[sprintf] property "%s" does not exist', match[2][k]))
+	                        }
+	                        arg = arg[match[2][k]]
+	                    }
+	                }
+	                else if (match[1]) { // positional argument (explicit)
+	                    arg = argv[match[1]]
+	                }
+	                else { // positional argument (implicit)
+	                    arg = argv[cursor++]
+	                }
+
+	                if (re.not_type.test(match[8]) && re.not_primitive.test(match[8]) && get_type(arg) == 'function') {
+	                    arg = arg()
+	                }
+
+	                if (re.numeric_arg.test(match[8]) && (get_type(arg) != 'number' && isNaN(arg))) {
+	                    throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg)))
+	                }
+
+	                if (re.number.test(match[8])) {
+	                    is_positive = arg >= 0
+	                }
+
+	                switch (match[8]) {
+	                    case 'b':
+	                        arg = parseInt(arg, 10).toString(2)
+	                    break
+	                    case 'c':
+	                        arg = String.fromCharCode(parseInt(arg, 10))
+	                    break
+	                    case 'd':
+	                    case 'i':
+	                        arg = parseInt(arg, 10)
+	                    break
+	                    case 'j':
+	                        arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0)
+	                    break
+	                    case 'e':
+	                        arg = match[7] ? parseFloat(arg).toExponential(match[7]) : parseFloat(arg).toExponential()
+	                    break
+	                    case 'f':
+	                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)
+	                    break
+	                    case 'g':
+	                        arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg)
+	                    break
+	                    case 'o':
+	                        arg = arg.toString(8)
+	                    break
+	                    case 's':
+	                    case 'S':
+	                        arg = String(arg)
+	                        arg = (match[7] ? arg.substring(0, match[7]) : arg)
+	                    break
+	                    case 't':
+	                        arg = String(!!arg)
+	                        arg = (match[7] ? arg.substring(0, match[7]) : arg)
+	                    break
+	                    case 'T':
+	                        arg = get_type(arg)
+	                        arg = (match[7] ? arg.substring(0, match[7]) : arg)
+	                    break
+	                    case 'u':
+	                        arg = parseInt(arg, 10) >>> 0
+	                    break
+	                    case 'v':
+	                        arg = arg.valueOf()
+	                        arg = (match[7] ? arg.substring(0, match[7]) : arg)
+	                    break
+	                    case 'x':
+	                        arg = parseInt(arg, 10).toString(16)
+	                    break
+	                    case 'X':
+	                        arg = parseInt(arg, 10).toString(16).toUpperCase()
+	                    break
+	                }
+	                if (re.json.test(match[8])) {
+	                    output[output.length] = arg
+	                }
+	                else {
+	                    if (re.number.test(match[8]) && (!is_positive || match[3])) {
+	                        sign = is_positive ? '+' : '-'
+	                        arg = arg.toString().replace(re.sign, '')
+	                    }
+	                    else {
+	                        sign = ''
+	                    }
+	                    pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' '
+	                    pad_length = match[6] - (sign + arg).length
+	                    pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : '') : ''
+	                    output[output.length] = match[5] ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
+	                }
+	            }
+	        }
+	        return output.join('')
+	    }
+
+	    sprintf.cache = {}
+
+	    sprintf.parse = function(fmt) {
+	        var _fmt = fmt, match = [], parse_tree = [], arg_names = 0
+	        while (_fmt) {
+	            if ((match = re.text.exec(_fmt)) !== null) {
+	                parse_tree[parse_tree.length] = match[0]
+	            }
+	            else if ((match = re.modulo.exec(_fmt)) !== null) {
+	                parse_tree[parse_tree.length] = '%'
+	            }
+	            else if ((match = re.placeholder.exec(_fmt)) !== null) {
+	                if (match[2]) {
+	                    arg_names |= 1
+	                    var field_list = [], replacement_field = match[2], field_match = []
+	                    if ((field_match = re.key.exec(replacement_field)) !== null) {
+	                        field_list[field_list.length] = field_match[1]
+	                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+	                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
+	                                field_list[field_list.length] = field_match[1]
+	                            }
+	                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
+	                                field_list[field_list.length] = field_match[1]
+	                            }
+	                            else {
+	                                throw new SyntaxError("[sprintf] failed to parse named argument key")
+	                            }
+	                        }
+	                    }
+	                    else {
+	                        throw new SyntaxError("[sprintf] failed to parse named argument key")
+	                    }
+	                    match[2] = field_list
+	                }
+	                else {
+	                    arg_names |= 2
+	                }
+	                if (arg_names === 3) {
+	                    throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported")
+	                }
+	                parse_tree[parse_tree.length] = match
+	            }
+	            else {
+	                throw new SyntaxError("[sprintf] unexpected placeholder")
+	            }
+	            _fmt = _fmt.substring(match[0].length)
+	        }
+	        return parse_tree
+	    }
+
+	    var vsprintf = function(fmt, argv, _argv) {
+	        _argv = (argv || []).slice(0)
+	        _argv.splice(0, 0, fmt)
+	        return sprintf.apply(null, _argv)
+	    }
+
+	    /**
+	     * helpers
+	     */
+	    function get_type(variable) {
+	        if (typeof variable === 'number') {
+	            return 'number'
+	        }
+	        else if (typeof variable === 'string') {
+	            return 'string'
+	        }
+	        else {
+	            return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()
+	        }
+	    }
+
+	    var preformattedPadding = {
+	        '0': ['', '0', '00', '000', '0000', '00000', '000000', '0000000'],
+	        ' ': ['', ' ', '  ', '   ', '    ', '     ', '      ', '       '],
+	        '_': ['', '_', '__', '___', '____', '_____', '______', '_______'],
+	    }
+	    function str_repeat(input, multiplier) {
+	        if (multiplier >= 0 && multiplier <= 7 && preformattedPadding[input]) {
+	            return preformattedPadding[input][multiplier]
+	        }
+	        return Array(multiplier + 1).join(input)
+	    }
+
+	    /**
+	     * export to either browser or node.js
+	     */
+	    if (true) {
+	        exports.sprintf = sprintf
+	        exports.vsprintf = vsprintf
+	    }
+	    else {
+	        window.sprintf = sprintf
+	        window.vsprintf = vsprintf
+
+	        if (typeof define === 'function' && define.amd) {
+	            define(function() {
+	                return {
+	                    sprintf: sprintf,
+	                    vsprintf: vsprintf
+	                }
+	            })
+	        }
+	    }
+	})(typeof window === 'undefined' ? this : window);
+
+
+/***/ },
+/* 70 */
+/***/ 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/. */
+
+	/**
+	 * EventEmitter.
+	 */
+
+	var EventEmitter = function EventEmitter() {};
+	module.exports = EventEmitter;
+
+	const { Cu } = __webpack_require__(71);
+	const promise = __webpack_require__(76);
+
+	/**
+	 * Decorate an object with event emitter functionality.
+	 *
+	 * @param Object aObjectToDecorate
+	 *        Bind all public methods of EventEmitter to
+	 *        the aObjectToDecorate object.
+	 */
+	EventEmitter.decorate = function EventEmitter_decorate (aObjectToDecorate) {
+	  let emitter = new EventEmitter();
+	  aObjectToDecorate.on = emitter.on.bind(emitter);
+	  aObjectToDecorate.off = emitter.off.bind(emitter);
+	  aObjectToDecorate.once = emitter.once.bind(emitter);
+	  aObjectToDecorate.emit = emitter.emit.bind(emitter);
+	};
+
+	EventEmitter.prototype = {
+	  /**
+	   * Connect a listener.
+	   *
+	   * @param string aEvent
+	   *        The event name to which we're connecting.
+	   * @param function aListener
+	   *        Called when the event is fired.
+	   */
+	  on: function EventEmitter_on(aEvent, aListener) {
+	    if (!this._eventEmitterListeners)
+	      this._eventEmitterListeners = new Map();
+	    if (!this._eventEmitterListeners.has(aEvent)) {
+	      this._eventEmitterListeners.set(aEvent, []);
+	    }
+	    this._eventEmitterListeners.get(aEvent).push(aListener);
+	  },
+
+	  /**
+	   * Listen for the next time an event is fired.
+	   *
+	   * @param string aEvent
+	   *        The event name to which we're connecting.
+	   * @param function aListener
+	   *        (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 aListener
+	   */
+	  once: function EventEmitter_once(aEvent, aListener) {
+	    let deferred = promise.defer();
+
+	    let handler = (aEvent, aFirstArg, ...aRest) => {
+	      this.off(aEvent, handler);
+	      if (aListener) {
+	        aListener.apply(null, [aEvent, aFirstArg, ...aRest]);
+	      }
+	      deferred.resolve(aFirstArg);
+	    };
+
+	    handler._originalListener = aListener;
+	    this.on(aEvent, handler);
+
+	    return deferred.promise;
+	  },
+
+	  /**
+	   * Remove a previously-registered event listener.  Works for events
+	   * registered with either on or once.
+	   *
+	   * @param string aEvent
+	   *        The event name whose listener we're disconnecting.
+	   * @param function aListener
+	   *        The listener to remove.
+	   */
+	  off: function EventEmitter_off(aEvent, aListener) {
+	    if (!this._eventEmitterListeners)
+	      return;
+	    let listeners = this._eventEmitterListeners.get(aEvent);
+	    if (listeners) {
+	      this._eventEmitterListeners.set(aEvent, listeners.filter(l => {
+	        return l !== aListener && l._originalListener !== aListener;
+	      }));
+	    }
+	  },
+
+	  /**
+	   * Emit an event.  All arguments to this method will
+	   * be sent to listener functions.
+	   */
+	  emit: function EventEmitter_emit(aEvent) {
+	    if (!this._eventEmitterListeners || !this._eventEmitterListeners.has(aEvent)) {
+	      return;
+	    }
+
+	    let originalListeners = this._eventEmitterListeners.get(aEvent);
+	    for (let listener of this._eventEmitterListeners.get(aEvent)) {
+	      // If the object was destroyed during event emission, stop
+	      // emitting.
+	      if (!this._eventEmitterListeners) {
+	        break;
+	      }
+
+	      // If listeners were removed during emission, make sure the
+	      // event handler we're going to fire wasn't removed.
+	      if (originalListeners === this._eventEmitterListeners.get(aEvent) ||
+	          this._eventEmitterListeners.get(aEvent).some(l => l === listener)) {
+	        try {
+	          listener.apply(null, arguments);
+	        }
+	        catch (ex) {
+	          // Prevent a bad listener from interfering with the others.
+	          let msg = ex + ": " + ex.stack;
+	          //console.error(msg);
+	          console.log(msg);
+	        }
+	      }
+	    }
+	  },
+	};
+
+
+/***/ },
+/* 71 */
+/***/ function(module, exports, __webpack_require__) {
+
+	/*
+	 * A sham for https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/chrome
+	 */
+
+	var { inDOMUtils } = __webpack_require__(72);
+
+	var ourServices = {
+	  inIDOMUtils: inDOMUtils,
+	  nsIClipboardHelper: {
+	    copyString: () => {}
+	  },
+	  nsIXULChromeRegistry: {
+	    isLocaleRTL: () => {return false;}
+	  },
+	  nsIDOMParser: {
+
+	  },
+	};
+
+	module.exports = {
+	  Cc: name => {
+	    if(typeof console !== "undefined") {
+	      console.log('Cc sham for', name);
+	    }
+	    return {
+	      getService: (name) => ourServices[name],
+	      createInstance: (iface) => ourServices[iface],
+	    };
+	  },
+	  CC: (name, iface, method) => {
+	    if(typeof console !== "undefined") {
+	      console.log('CC sham for', name, iface, method);
+	    }
+	    return {
+	    };
+	  },
+	  Ci: {
+	    nsIThread: {
+	      "DISPATCH_NORMAL":0,
+	      "DISPATCH_SYNC":1
+	    },
+	    nsIDOMNode: typeof HTMLElement !== "undefined" ? HTMLElement : null,
+	    nsIFocusManager: {
+	      MOVEFOCUS_BACKWARD: 2,
+	      MOVEFOCUS_FORWARD: 1,
+	    },
+	    nsIDOMKeyEvent: {
+
+	    },
+	    nsIDOMCSSRule: {"UNKNOWN_RULE":0,"STYLE_RULE":1,"CHARSET_RULE":2,"IMPORT_RULE":3,"MEDIA_RULE":4,"FONT_FACE_RULE":5,"PAGE_RULE":6,"KEYFRAMES_RULE":7,"KEYFRAME_RULE":8,"MOZ_KEYFRAMES_RULE":7,"MOZ_KEYFRAME_RULE":8,"NAMESPACE_RULE":10,"COUNTER_STYLE_RULE":11,"SUPPORTS_RULE":12,"FONT_FEATURE_VALUES_RULE":14},
+	    inIDOMUtils: "inIDOMUtils",
+	    nsIClipboardHelper: "nsIClipboardHelper",
+	    nsIXULChromeRegistry: "nsIXULChromeRegistry",
+	  },
+	  Cu: {
+	    reportError: msg => { (typeof console !== "undefined") ? console.error(msg) : dump(msg) },
+	    callFunctionWithAsyncStack: fn => fn(),
+	  },
+	  Cr: {},
+	  components: {
+	    isSuccessCode: () => (returnCode & 0x80000000) === 0,
+	  }
+	};
+
+
+/***/ },
+/* 72 */
+/***/ function(module, exports, __webpack_require__) {
+
+	// A sham for inDOMUtils.
+
+	"use strict";
+
+	var { CSSLexer } = __webpack_require__(73);
+	var { cssColors } = __webpack_require__(74);
+	var { cssProperties } = __webpack_require__(75);
+
+	var cssRGBMap;
+
+	// From inIDOMUtils.idl.
+	var EXCLUDE_SHORTHANDS = (1 << 0);
+	var INCLUDE_ALIASES = (1 << 1);
+	var TYPE_LENGTH = 0;
+	var TYPE_PERCENTAGE = 1;
+	var TYPE_COLOR = 2;
+	var TYPE_URL = 3;
+	var TYPE_ANGLE = 4;
+	var TYPE_FREQUENCY = 5;
+	var TYPE_TIME = 6;
+	var TYPE_GRADIENT = 7;
+	var TYPE_TIMING_FUNCTION = 8;
+	var TYPE_IMAGE_RECT = 9;
+	var TYPE_NUMBER = 10;
+
+	function getCSSLexer(text) {
+	  return new CSSLexer(text);
+	}
+
+	function rgbToColorName(r, g, b) {
+	  if (!cssRGBMap) {
+	    cssRGBMap = new Map();
+	    for (let name in cssColors) {
+	      cssRGBMap.set(JSON.stringify(cssColors[name]), name);
+	    }
+	  }
+	  let value = cssRGBMap.get(JSON.stringify([r, g, b]));
+	  if (!value) {
+	    throw new Error("no such color");
+	  }
+	  return value;
+	}
+
+	// Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js
+	function _hslValue(n1, n2, hue) {
+	  if (hue > 6.0) {
+	    hue -= 6.0;
+	  } else if (hue < 0.0) {
+	    hue += 6.0;
+	  }
+	  var val;
+	  if (hue < 1.0) {
+	    val = n1 + (n2 - n1) * hue;
+	  } else if (hue < 3.0) {
+	    val = n2;
+	  } else if (hue < 4.0) {
+	    val = n1 + (n2 - n1) * (4.0 - hue);
+	  } else {
+	    val = n1;
+	  }
+	  return val;
+	}
+
+	// Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js
+	// and then modified.
+	function hslToRGB([hue, saturation, lightness]) {
+	  var red;
+	  var green;
+	  var blue;
+	  if (saturation === 0) {
+	    red = lightness;
+	    green = lightness;
+	    blue = lightness;
+	  } else {
+	    var m2;
+	    if (lightness <= 0.5) {
+	      m2 = lightness * (1.0 + saturation);
+	    } else {
+	      m2 = lightness + saturation - (lightness * saturation);
+	    }
+	    var m1 = (2.0 * lightness) - m2;
+	    var f = _hslValue;
+	    var h6 = hue * 6.0;
+	    red = f(m1, m2, h6 + 2);
+	    green = f(m1, m2, h6);
+	    blue = f(m1, m2, h6 - 2);
+	  }
+	  return [red, green, blue];
+	}
+
+	function colorToRGBA(name) {
+	  name = name.trim().toLowerCase();
+	  if (name in cssColors) {
+	    return cssColors[name];
+	  }
+
+	  if (name === "transparent") {
+	    return [0, 0, 0, 0];
+	  }
+
+	  let lexer = getCSSLexer(name);
+
+	  let getToken = function() {
+	    while (true) {
+	      let token = lexer.nextToken();
+	      if (!token || token.tokenType !== "comment" ||
+	          token.tokenType !== "whitespace") {
+	        return token;
+	      }
+	    }
+	  };
+
+	  let requireComma = function(token) {
+	    if (token.tokenType !== "symbol" || token.text !== ",") {
+	      return null;
+	    }
+	    return getToken();
+	  };
+
+	  let func = getToken();
+	  if (!func || func.tokenType !== "function") {
+	    return null;
+	  }
+	  let alpha = false;
+	  if (func.text === "rgb" || func.text === "hsl") {
+	    // Nothing.
+	  } else if (func.text === "rgba" || func.text === "hsla") {
+	    alpha = true;
+	  } else {
+	    return null;
+	  }
+
+	  let vals = [];
+	  for (let i = 0; i < 3; ++i) {
+	    let token = getToken();
+	    if (i > 0) {
+	      token = requireComma(token);
+	    }
+	    if (token.tokenType !== "number" || !token.isInteger) {
+	      return null;
+	    }
+	    let num = token.number;
+	    if (num < 0) {
+	      num = 0;
+	    } else if (num > 255) {
+	      num = 255;
+	    }
+	    vals.push(num);
+	  }
+
+	  if (func.text === "hsl" || func.text === "hsla") {
+	    vals = hslToRGB(vals);
+	  }
+
+	  if (alpha) {
+	    let token = requireComma(getToken());
+	    if (token.tokenType !== "number") {
+	      return null;
+	    }
+	    let num = token.number;
+	    if (num < 0) {
+	      num = 0;
+	    } else if (num > 1) {
+	      num = 1;
+	    }
+	    vals.push(num);
+	  } else {
+	    vals.push(1);
+	  }
+
+	  let parenToken = getToken();
+	  if (!parenToken || parenToken.tokenType !== "symbol" ||
+	      parenToken.text !== ")") {
+	    return null;
+	  }
+	  if (getToken() !== null) {
+	    return null;
+	  }
+
+	  return vals;
+	}
+
+	function isValidCSSColor(name) {
+	  return colorToRGBA(name) !== null;
+	}
+
+	function isVariable(name) {
+	  return name.startsWith("--");
+	}
+
+	function cssPropertyIsShorthand(name) {
+	  if (isVariable(name)) {
+	    return false;
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  return !!cssProperties[name].subproperties;
+	}
+
+	function getSubpropertiesForCSSProperty(name) {
+	  if (isVariable(name)) {
+	    return [name];
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  if ("subproperties" in cssProperties[name]) {
+	    return cssProperties[name].subproperties.slice();
+	  }
+	  return [name];
+	}
+
+	function getCSSValuesForProperty(name) {
+	  if (isVariable(name)) {
+	    return ["initial", "inherit", "unset"];
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  return cssProperties[name].values.slice();
+	}
+
+	function getCSSPropertyNames(flags) {
+	  let names = Object.keys(cssProperties);
+	  if ((flags & EXCLUDE_SHORTHANDS) !== 0) {
+	    names = names.filter((name) => cssProperties[name].subproperties);
+	  }
+	  if ((flags & INCLUDE_ALIASES) === 0) {
+	    names = names.filter((name) => !cssProperties[name].alias);
+	  }
+	  return names;
+	}
+
+	function cssPropertySupportsType(name, type) {
+	  if (isVariable(name)) {
+	    return false;
+	  }
+	  if (!(name in cssProperties)) {
+	    throw Error("unknown property " + name);
+	  }
+	  return (cssProperties[name].supports & (1 << type)) !== 0;
+	}
+
+	function isInheritedProperty(name) {
+	  if (isVariable(name)) {
+	    return true;
+	  }
+	  if (!(name in cssProperties)) {
+	    return false;
+	  }
+	  return cssProperties[name].inherited;
+	}
+
+	function cssPropertyIsValid(name, value) {
+	  if (isVariable(name)) {
+	    return true;
+	  }
+	  if (!(name in cssProperties)) {
+	    return false;
+	  }
+	  let elt = document.createElement("div");
+	  elt.style = name + ":" + value;
+	  return elt.style.length > 0;
+	}
+
+	exports.inDOMUtils = {
+	  getCSSLexer,
+	  rgbToColorName,
+	  colorToRGBA,
+	  isValidCSSColor,
+	  cssPropertyIsShorthand,
+	  getSubpropertiesForCSSProperty,
+	  getCSSValuesForProperty,
+	  getCSSPropertyNames,
+	  cssPropertySupportsType,
+	  isInheritedProperty,
+	  cssPropertyIsValid,
+
+	  // Constants.
+	  EXCLUDE_SHORTHANDS,
+	  INCLUDE_ALIASES,
+	  TYPE_LENGTH,
+	  TYPE_PERCENTAGE,
+	  TYPE_COLOR,
+	  TYPE_URL,
+	  TYPE_ANGLE,
+	  TYPE_FREQUENCY,
+	  TYPE_TIME,
+	  TYPE_GRADIENT,
+	  TYPE_TIMING_FUNCTION,
+	  TYPE_IMAGE_RECT,
+	  TYPE_NUMBER,
+	};
+
+
+/***/ },
+/* 73 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict";
+
+	(function (root, factory) {
+	    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
+	    // Rhino, and plain browser loading.
+	    if (true) {
+	        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+	    } else if (typeof exports !== 'undefined') {
+	        factory(exports);
+	    } else {
+	        factory(root);
+	    }
+	}(this, function (exports) {
+
+	function between(num, first, last) { return num >= first && num <= last; }
+	function digit(code) { return between(code, 0x30,0x39); }
+	function hexdigit(code) { return digit(code) || between(code, 0x41,0x46) || between(code, 0x61,0x66); }
+	function uppercaseletter(code) { return between(code, 0x41,0x5a); }
+	function lowercaseletter(code) { return between(code, 0x61,0x7a); }
+	function letter(code) { return uppercaseletter(code) || lowercaseletter(code); }
+	function nonascii(code) { return code >= 0x80; }
+	function namestartchar(code) { return letter(code) || nonascii(code) || code == 0x5f; }
+	function namechar(code) { return namestartchar(code) || digit(code) || code == 0x2d; }
+	function nonprintable(code) { return between(code, 0,8) || code == 0xb || between(code, 0xe,0x1f) || code == 0x7f; }
+	function newline(code) { return code == 0xa; }
+	function whitespace(code) { return newline(code) || code == 9 || code == 0x20; }
+
+	var maximumallowedcodepoint = 0x10ffff;
+
+	var InvalidCharacterError = function(message) {
+		this.message = message;
+	};
+	InvalidCharacterError.prototype = new Error;
+	InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+
+	function stringFromCode(code) {
+		if(code <= 0xffff) return String.fromCharCode(code);
+		// Otherwise, encode astral char as surrogate pair.
+		code -= Math.pow(2, 20);
+		var lead = Math.floor(code/Math.pow(2, 10)) + 0xd800;
+		var trail = code % Math.pow(2, 10) + 0xdc00;
+		return String.fromCharCode(lead) + String.fromCharCode(trail);
+	}
+
+	function* tokenize(str, options) {
+		if (options === undefined) {
+			options = {};
+		}
+		if (options.loc === undefined) {
+			options.loc = false;
+		}
+		if (options.offsets === undefined) {
+			options.offsets = false;
+		}
+		if (options.keepComments === undefined) {
+			options.keepComments = false;
+		}
+		if (options.startOffset === undefined) {
+			options.startOffset = 0;
+		}
+
+		var i = options.startOffset - 1;
+		var code;
+
+		// Line number information.
+		var line = 0;
+		var column = 0;
+		// The only use of lastLineLength is in reconsume().
+		var lastLineLength = 0;
+		var incrLineno = function() {
+			line += 1;
+			lastLineLength = column;
+			column = 0;
+		};
+		var locStart = {line:line, column:column};
+		var offsetStart = i;
+
+		var codepoint = function(i) {
+			if(i >= str.length) {
+				return -1;
+			}
+			return str.charCodeAt(i);
+		};
+		var next = function(num) {
+			if(num === undefined)
+				num = 1;
+			if(num > 3)
+				throw "Spec Error: no more than three codepoints of lookahead.";
+
+			var rcode;
+			for (var offset = i + 1; num-- > 0; ++offset) {
+				rcode = codepoint(offset);
+				if (rcode === 0xd && codepoint(offset+1) === 0xa) {
+					++offset;
+					rcode = 0xa;
+				} else if (rcode === 0xd || rcode === 0xc) {
+					rcode = 0xa;
+				} else if (rcode === 0x0) {
+					rcode = 0xfffd;
+				}
+			}
+
+			return rcode;
+		};
+		var consume = function(num) {
+			if(num === undefined)
+				num = 1;
+			while(num-- > 0) {
+				++i;
+				code = codepoint(i);
+				if (code === 0xd && codepoint(i+1) === 0xa) {
+					++i;
+					code = 0xa;
+				} else if (code === 0xd || code === 0xc) {
+					code = 0xa;
+				} else if (code === 0x0) {
+					code = 0xfffd;
+				}
+				if(newline(code)) incrLineno();
+				else column++;
+			}
+			return true;
+		};
+		var reconsume = function() {
+			i -= 1;		// This is ok even in the \r\n case.
+			if (newline(code)) {
+				line -= 1;
+				column = lastLineLength;
+			} else {
+				column -= 1;
+			}
+			return true;
+		};
+		var eof = function(codepoint) {
+			if(codepoint === undefined) codepoint = code;
+			return codepoint == -1;
+		};
+		var donothing = function() {};
+		var parseerror = function() { console.log("Parse error at index " + i + ", processing codepoint 0x" + code.toString(16) + ".");return true; };
+
+		var consumeAToken = function() {
+			consume();
+			if (!options.keepComments) {
+				while(code == 0x2f && next() == 0x2a) {
+					consumeAComment();
+					consume();
+				}
+			}
+			locStart.line = line;
+			locStart.column = column;
+			offsetStart = i;
+			if(whitespace(code)) {
+				while(whitespace(next())) consume();
+				return new WhitespaceToken;
+			}
+			else if(code == 0x2f && next() == 0x2a) return consumeAComment();
+			else if(code == 0x22) return consumeAStringToken();
+			else if(code == 0x23) {
+				if(namechar(next()) || areAValidEscape(next(1), next(2))) {
+					var token = new HashToken();
+					if(wouldStartAnIdentifier(next(1), next(2), next(3))) {
+						token.type = "id";
+						token.tokenType = "id";
+					}
+					token.value = consumeAName();
+					token.text = token.value;
+					return token;
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x24) {
+				if(next() == 0x3d) {
+					consume();
+					return new SuffixMatchToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x27) return consumeAStringToken();
+			else if(code == 0x28) return new OpenParenToken();
+			else if(code == 0x29) return new CloseParenToken();
+			else if(code == 0x2a) {
+				if(next() == 0x3d) {
+					consume();
+					return new SubstringMatchToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x2b) {
+				if(startsWithANumber()) {
+					reconsume();
+					return consumeANumericToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x2c) return new CommaToken();
+			else if(code == 0x2d) {
+				if(startsWithANumber()) {
+					reconsume();
+					return consumeANumericToken();
+				} else if(next(1) == 0x2d && next(2) == 0x3e) {
+					consume(2);
+					return new CDCToken();
+				} else if(startsWithAnIdentifier()) {
+					reconsume();
+					return consumeAnIdentlikeToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x2e) {
+				if(startsWithANumber()) {
+					reconsume();
+					return consumeANumericToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x3a) return new ColonToken;
+			else if(code == 0x3b) return new SemicolonToken;
+			else if(code == 0x3c) {
+				if(next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {
+					consume(3);
+					return new CDOToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x40) {
+				if(wouldStartAnIdentifier(next(1), next(2), next(3))) {
+					return new AtKeywordToken(consumeAName());
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x5b) return new OpenSquareToken();
+			else if(code == 0x5c) {
+				if(startsWithAValidEscape()) {
+					reconsume();
+					return consumeAnIdentlikeToken();
+				} else {
+					parseerror();
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x5d) return new CloseSquareToken();
+			else if(code == 0x5e) {
+				if(next() == 0x3d) {
+					consume();
+					return new PrefixMatchToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x7b) return new OpenCurlyToken();
+			else if(code == 0x7c) {
+				if(next() == 0x3d) {
+					consume();
+					return new DashMatchToken();
+				// } else if(next() == 0x7c) {
+				// 	consume();
+				// 	return new ColumnToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(code == 0x7d) return new CloseCurlyToken();
+			else if(code == 0x7e) {
+				if(next() == 0x3d) {
+					consume();
+					return new IncludeMatchToken();
+				} else {
+					return new DelimToken(code);
+				}
+			}
+			else if(digit(code)) {
+				reconsume();
+				return consumeANumericToken();
+			}
+			else if(namestartchar(code)) {
+				reconsume();
+				return consumeAnIdentlikeToken();
+			}
+			else if(eof()) return new EOFToken();
+			else return new DelimToken(code);
+		};
+
+		var consumeAComment = function() {
+			consume();
+			var comment = "";
+			while(true) {
+				consume();
+				if(code == 0x2a && next() == 0x2f) {
+					consume();
+					break;
+				} else if(eof()) {
+					break;
+				}
+				comment += stringFromCode(code);
+			}
+			return new CommentToken(comment);
+		};
+
+		var consumeANumericToken = function() {
+			var num = consumeANumber();
+			var token;
+			if(wouldStartAnIdentifier(next(1), next(2), next(3))) {
+				token = new DimensionToken();
+				token.value = num.value;
+				token.repr = num.repr;
+				token.type = num.type;
+				token.unit = consumeAName();
+				token.text = token.unit;
+			} else if(next() == 0x25) {
+				consume();
+				token = new PercentageToken();
+				token.value = num.value;
+				token.repr = num.repr;
+			} else {
+				var token = new NumberToken();
+				token.value = num.value;
+				token.repr = num.repr;
+				token.type = num.type;
+			}
+			token.number = token.value;
+			token.isInteger = token.type === "integer";
+			// FIXME hasSign
+			return token;
+		};
+
+		var consumeAnIdentlikeToken = function() {
+			var str = consumeAName();
+			if(str.toLowerCase() == "url" && next() == 0x28) {
+				consume();
+				while(whitespace(next(1)) && whitespace(next(2)))
+					consume();
+				if((next() == 0x22 || next() == 0x27) ||
+				   (whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27))) {
+					while(whitespace(next()))
+						consume();
+					consume();
+					let str = consumeAStringToken();
+					while(whitespace(next()))
+						consume();
+					// The closing paren.
+					consume();
+					return new URLToken(str.text);
+				} else {
+					return consumeAURLToken();
+				}
+			} else if(next() == 0x28) {
+				consume();
+				return new FunctionToken(str);
+			} else {
+				return new IdentToken(str);
+			}
+		};
+
+		var consumeAStringToken = function(endingCodePoint) {
+			if(endingCodePoint === undefined) endingCodePoint = code;
+			var string = "";
+			while(consume()) {
+				if(code == endingCodePoint || eof()) {
+					return new StringToken(string);
+				} else if(newline(code)) {
+					reconsume();
+					return new BadStringToken(string);
+				} else if(code == 0x5c) {
+					if(eof(next())) {
+						donothing();
+					} else if(newline(next())) {
+						consume();
+					} else {
+						string += stringFromCode(consumeEscape());
+					}
+				} else {
+					string += stringFromCode(code);
+				}
+			}
+		};
+
+		var consumeAURLToken = function() {
+			var token = new URLToken("");
+			while(whitespace(next())) consume();
+			if(eof(next())) return token;
+			while(consume()) {
+				if(code == 0x29 || eof()) {
+					break;
+				} else if(whitespace(code)) {
+					while(whitespace(next()))
+						consume();
+					if(next() == 0x29 || eof(next())) {
+						consume();
+						break;
+					} else {
+						consumeTheRemnantsOfABadURL();
+						return new BadURLToken();
+					}
+				} else if(code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) {
+					parseerror();
+					consumeTheRemnantsOfABadURL();
+					return new BadURLToken();
+				} else if(code == 0x5c) {
+					if(startsWithAValidEscape()) {
+						token.value += stringFromCode(consumeEscape());
+					} else {
+						parseerror();
+						consumeTheRemnantsOfABadURL();
+						return new BadURLToken();
+					}
+				} else {
+					token.value += stringFromCode(code);
+				}
+			}
+			token.text = token.value;
+			return token;
+		};
+
+		var consumeEscape = function() {
+			// Assume the the current character is the \
+			// and the next code point is not a newline.
+			consume();
+			if(hexdigit(code)) {
+				// Consume 1-6 hex digits
+				var digits = [code];
+				for(var total = 0; total < 5; total++) {
+					if(hexdigit(next())) {
+						consume();
+						digits.push(code);
+					} else {
+						break;
+					}
+				}
+				if(whitespace(next())) consume();
+				var value = parseInt(digits.map(function(x){return String.fromCharCode(x);}).join(''), 16);
+				if( value > maximumallowedcodepoint ) value = 0xfffd;
+				return value;
+			} else if(eof()) {
+				return 0xfffd;
+			} else {
+				return code;
+			}
+		};
+
+		var areAValidEscape = function(c1, c2) {
+			if(c1 != 0x5c) return false;
+			if(newline(c2)) return false;
+			return true;
+		};
+		var startsWithAValidEscape = function() {
+			return areAValidEscape(code, next());
+		};
+
+		var wouldStartAnIdentifier = function(c1, c2, c3) {
+			if(c1 == 0x2d) {
+				return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3);
+			} else if(namestartchar(c1)) {
+				return true;
+			} else if(c1 == 0x5c) {
+				return areAValidEscape(c1, c2);
+			} else {
+				return false;
+			}
+		};
+		var startsWithAnIdentifier = function() {
+			return wouldStartAnIdentifier(code, next(1), next(2));
+		};
+
+		var wouldStartANumber = function(c1, c2, c3) {
+			if(c1 == 0x2b || c1 == 0x2d) {
+				if(digit(c2)) return true;
+				if(c2 == 0x2e && digit(c3)) return true;
+				return false;
+			} else if(c1 == 0x2e) {
+				if(digit(c2)) return true;
+				return false;
+			} else if(digit(c1)) {
+				return true;
+			} else {
+				return false;
+			}
+		};
+		var startsWithANumber = function() {
+			return wouldStartANumber(code, next(1), next(2));
+		};
+
+		var consumeAName = function() {
+			var result = "";
+			while(consume()) {
+				if(namechar(code)) {
+					result += stringFromCode(code);
+				} else if(startsWithAValidEscape()) {
+					result += stringFromCode(consumeEscape());
+				} else {
+					reconsume();
+					return result;
+				}
+			}
+		};
+
+		var consumeANumber = function() {
+			var repr = [];
+			var type = "integer";
+			if(next() == 0x2b || next() == 0x2d) {
+				consume();
+				repr += stringFromCode(code);
+			}
+			while(digit(next())) {
+				consume();
+				repr += stringFromCode(code);
+			}
+			if(next(1) == 0x2e && digit(next(2))) {
+				consume();
+				repr += stringFromCode(code);
+				consume();
+				repr += stringFromCode(code);
+				type = "number";
+				while(digit(next())) {
+					consume();
+					repr += stringFromCode(code);
+				}
+			}
+			var c1 = next(1), c2 = next(2), c3 = next(3);
+			if((c1 == 0x45 || c1 == 0x65) && digit(c2)) {
+				consume();
+				repr += stringFromCode(code);
+				consume();
+				repr += stringFromCode(code);
+				type = "number";
+				while(digit(next())) {
+					consume();
+					repr += stringFromCode(code);
+				}
+			} else if((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) {
+				consume();
+				repr += stringFromCode(code);
+				consume();
+				repr += stringFromCode(code);
+				consume();
+				repr += stringFromCode(code);
+				type = "number";
+				while(digit(next())) {
+					consume();
+					repr += stringFromCode(code);
+				}
+			}
+			var value = convertAStringToANumber(repr);
+			return {type:type, value:value, repr:repr};
+		};
+
+		var convertAStringToANumber = function(string) {
+			// CSS's number rules are identical to JS, afaik.
+			return +string;
+		};
+
+		var consumeTheRemnantsOfABadURL = function() {
+			while(consume()) {
+				if(code == 0x2d || eof()) {
+					return;
+				} else if(startsWithAValidEscape()) {
+					consumeEscape();
+					donothing();
+				} else {
+					donothing();
+				}
+			}
+		};
+
+
+
+		var iterationCount = 0;
+		while(!eof(next())) {
+			var token = consumeAToken();
+			if (options.loc) {
+				token.loc = {};
+				token.loc.start = {line:locStart.line, column:locStart.column};
+				token.loc.end = {line:line, column:column};
+			}
+			if (options.offsets) {
+				token.startOffset = offsetStart;
+				token.endOffset = i + 1;
+			}
+			yield token;
+			iterationCount++;
+			if(iterationCount > str.length*2) return "I'm infinite-looping!";
+		}
+	}
+
+	function CSSParserToken() { throw "Abstract Base Class"; }
+	CSSParserToken.prototype.toJSON = function() {
+		return {token: this.tokenType};
+	};
+	CSSParserToken.prototype.toString = function() { return this.tokenType; };
+	CSSParserToken.prototype.toSource = function() { return ''+this; };
+
+	function BadStringToken(text) {
+		this.text = text;
+		return this;
+	}
+	BadStringToken.prototype = Object.create(CSSParserToken.prototype);
+	BadStringToken.prototype.tokenType = "bad_string";
+
+	function BadURLToken() { return this; }
+	BadURLToken.prototype = Object.create(CSSParserToken.prototype);
+	BadURLToken.prototype.tokenType = "bad_url";
+
+	function WhitespaceToken() { return this; }
+	WhitespaceToken.prototype = Object.create(CSSParserToken.prototype);
+	WhitespaceToken.prototype.tokenType = "whitespace";
+	WhitespaceToken.prototype.toString = function() { return "WS"; };
+	WhitespaceToken.prototype.toSource = function() { return " "; };
+
+	function CDOToken() { return this; }
+	CDOToken.prototype = Object.create(CSSParserToken.prototype);
+	CDOToken.prototype.tokenType = "htmlcomment";
+	CDOToken.prototype.toSource = function() { return "<!--"; };
+
+	function CDCToken() { return this; }
+	CDCToken.prototype = Object.create(CSSParserToken.prototype);
+	CDCToken.prototype.tokenType = "htmlcomment";
+	CDCToken.prototype.toSource = function() { return "-->"; };
+
+	function ColonToken() { return this; }
+	ColonToken.prototype = Object.create(CSSParserToken.prototype);
+	ColonToken.prototype.tokenType = "symbol";
+	ColonToken.prototype.text = ":";
+
+	function SemicolonToken() { return this; }
+	SemicolonToken.prototype = Object.create(CSSParserToken.prototype);
+	SemicolonToken.prototype.tokenType = "symbol";
+	SemicolonToken.prototype.text = ";";
+
+	function CommaToken() { return this; }
+	CommaToken.prototype = Object.create(CSSParserToken.prototype);
+	CommaToken.prototype.tokenType = "symbol";
+	CommaToken.prototype.text = ",";
+
+	function GroupingToken() { throw "Abstract Base Class"; }
+	GroupingToken.prototype = Object.create(CSSParserToken.prototype);
+
+	function OpenCurlyToken() { this.value = "{"; this.mirror = "}"; return this; }
+	OpenCurlyToken.prototype = Object.create(GroupingToken.prototype);
+	OpenCurlyToken.prototype.tokenType = "symbol";
+	OpenCurlyToken.prototype.text = "{";
+
+	function CloseCurlyToken() { this.value = "}"; this.mirror = "{"; return this; }
+	CloseCurlyToken.prototype = Object.create(GroupingToken.prototype);
+	CloseCurlyToken.prototype.tokenType = "symbol";
+	CloseCurlyToken.prototype.text = "}";
+
+	function OpenSquareToken() { this.value = "["; this.mirror = "]"; return this; }
+	OpenSquareToken.prototype = Object.create(GroupingToken.prototype);
+	OpenSquareToken.prototype.tokenType = "symbol";
+	OpenSquareToken.prototype.text = "[";
+
+	function CloseSquareToken() { this.value = "]"; this.mirror = "["; return this; }
+	CloseSquareToken.prototype = Object.create(GroupingToken.prototype);
+	CloseSquareToken.prototype.tokenType = "symbol";
+	CloseSquareToken.prototype.text = "]";
+
+	function OpenParenToken() { this.value = "("; this.mirror = ")"; return this; }
+	OpenParenToken.prototype = Object.create(GroupingToken.prototype);
+	OpenParenToken.prototype.tokenType = "symbol";
+	OpenParenToken.prototype.text = "(";
+
+	function CloseParenToken() { this.value = ")"; this.mirror = "("; return this; }
+	CloseParenToken.prototype = Object.create(GroupingToken.prototype);
+	CloseParenToken.prototype.tokenType = "symbol";
+	CloseParenToken.prototype.text = ")";
+
+	function IncludeMatchToken() { return this; }
+	IncludeMatchToken.prototype = Object.create(CSSParserToken.prototype);
+	IncludeMatchToken.prototype.tokenType = "includes";
+
+	function DashMatchToken() { return this; }
+	DashMatchToken.prototype = Object.create(CSSParserToken.prototype);
+	DashMatchToken.prototype.tokenType = "dashmatch";
+
+	function PrefixMatchToken() { return this; }
+	PrefixMatchToken.prototype = Object.create(CSSParserToken.prototype);
+	PrefixMatchToken.prototype.tokenType = "beginsmatch";
+
+	function SuffixMatchToken() { return this; }
+	SuffixMatchToken.prototype = Object.create(CSSParserToken.prototype);
+	SuffixMatchToken.prototype.tokenType = "endsmatch";
+
+	function SubstringMatchToken() { return this; }
+	SubstringMatchToken.prototype = Object.create(CSSParserToken.prototype);
+	SubstringMatchToken.prototype.tokenType = "containsmatch";
+
+	function ColumnToken() { return this; }
+	ColumnToken.prototype = Object.create(CSSParserToken.prototype);
+	ColumnToken.prototype.tokenType = "||";
+
+	function EOFToken() { return this; }
+	EOFToken.prototype = Object.create(CSSParserToken.prototype);
+	EOFToken.prototype.tokenType = "EOF";
+	EOFToken.prototype.toSource = function() { return ""; };
+
+	function DelimToken(code) {
+		this.value = stringFromCode(code);
+		this.text = this.value;
+		return this;
+	}
+	DelimToken.prototype = Object.create(CSSParserToken.prototype);
+	DelimToken.prototype.tokenType = "symbol";
+	DelimToken.prototype.toString = function() { return "DELIM("+this.value+")"; };
+	DelimToken.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.value = this.value;
+		return json;
+	};
+	DelimToken.prototype.toSource = function() {
+		if(this.value == "\\")
+			return "\\\n";
+		else
+			return this.value;
+	};
+
+	function StringValuedToken() { throw "Abstract Base Class"; }
+	StringValuedToken.prototype = Object.create(CSSParserToken.prototype);
+	StringValuedToken.prototype.ASCIIMatch = function(str) {
+		return this.value.toLowerCase() == str.toLowerCase();
+	};
+	StringValuedToken.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.value = this.value;
+		return json;
+	};
+
+	function IdentToken(val) {
+		this.value = val;
+		this.text = val;
+	}
+	IdentToken.prototype = Object.create(StringValuedToken.prototype);
+	IdentToken.prototype.tokenType = "ident";
+	IdentToken.prototype.toString = function() { return "IDENT("+this.value+")"; };
+	IdentToken.prototype.toSource = function() {
+		return escapeIdent(this.value);
+	};
+
+	function FunctionToken(val) {
+		this.value = val;
+		this.text = val;
+		this.mirror = ")";
+	}
+	FunctionToken.prototype = Object.create(StringValuedToken.prototype);
+	FunctionToken.prototype.tokenType = "function";
+	FunctionToken.prototype.toString = function() { return "FUNCTION("+this.value+")"; };
+	FunctionToken.prototype.toSource = function() {
+		return escapeIdent(this.value) + "(";
+	};
+
+	function AtKeywordToken(val) {
+		this.value = val;
+		this.text = val;
+	}
+	AtKeywordToken.prototype = Object.create(StringValuedToken.prototype);
+	AtKeywordToken.prototype.tokenType = "at";
+	AtKeywordToken.prototype.toString = function() { return "AT("+this.value+")"; };
+	AtKeywordToken.prototype.toSource = function() {
+		return "@" + escapeIdent(this.value);
+	};
+
+	function HashToken(val) {
+		this.value = val;
+		this.text = val;
+		this.type = "unrestricted";
+	}
+	HashToken.prototype = Object.create(StringValuedToken.prototype);
+	HashToken.prototype.tokenType = "hash";
+	HashToken.prototype.toString = function() { return "HASH("+this.value+")"; };
+	HashToken.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.value = this.value;
+		json.type = this.type;
+		return json;
+	};
+	HashToken.prototype.toSource = function() {
+		if(this.type == "id") {
+			return "#" + escapeIdent(this.value);
+		} else {
+			return "#" + escapeHash(this.value);
+		}
+	};
+
+	function StringToken(val) {
+		this.value = val;
+		this.text = val;
+	}
+	StringToken.prototype = Object.create(StringValuedToken.prototype);
+	StringToken.prototype.tokenType = "string";
+	StringToken.prototype.toString = function() {
+		return '"' + escapeString(this.value) + '"';
+	};
+
+	function CommentToken(val) {
+		this.value = val;
+	}
+	CommentToken.prototype = Object.create(StringValuedToken.prototype);
+	CommentToken.prototype.tokenType = "comment";
+	CommentToken.prototype.toString = function() {
+		return '/*' + this.value + '*/';
+	}
+	CommentToken.prototype.toSource = CommentToken.prototype.toString;
+
+	function URLToken(val) {
+		this.value = val;
+		this.text = val;
+	}
+	URLToken.prototype = Object.create(StringValuedToken.prototype);
+	URLToken.prototype.tokenType = "url";
+	URLToken.prototype.toString = function() { return "URL("+this.value+")"; };
+	URLToken.prototype.toSource = function() {
+		return 'url("' + escapeString(this.value) + '")';
+	};
+
+	function NumberToken() {
+		this.value = null;
+		this.type = "integer";
+		this.repr = "";
+	}
+	NumberToken.prototype = Object.create(CSSParserToken.prototype);
+	NumberToken.prototype.tokenType = "number";
+	NumberToken.prototype.toString = function() {
+		if(this.type == "integer")
+			return "INT("+this.value+")";
+		return "NUMBER("+this.value+")";
+	};
+	NumberToken.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.value = this.value;
+		json.type = this.type;
+		json.repr = this.repr;
+		return json;
+	};
+	NumberToken.prototype.toSource = function() { return this.repr; };
+
+	function PercentageToken() {
+		this.value = null;
+		this.repr = "";
+	}
+	PercentageToken.prototype = Object.create(CSSParserToken.prototype);
+	PercentageToken.prototype.tokenType = "percentage";
+	PercentageToken.prototype.toString = function() { return "PERCENTAGE("+this.value+")"; };
+	PercentageToken.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.value = this.value;
+		json.repr = this.repr;
+		return json;
+	};
+	PercentageToken.prototype.toSource = function() { return this.repr + "%"; };
+
+	function DimensionToken() {
+		this.value = null;
+		this.type = "integer";
+		this.repr = "";
+		this.unit = "";
+	}
+	DimensionToken.prototype = Object.create(CSSParserToken.prototype);
+	DimensionToken.prototype.tokenType = "dimension";
+	DimensionToken.prototype.toString = function() { return "DIM("+this.value+","+this.unit+")"; };
+	DimensionToken.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.value = this.value;
+		json.type = this.type;
+		json.repr = this.repr;
+		json.unit = this.unit;
+		return json;
+	};
+	DimensionToken.prototype.toSource = function() {
+		var source = this.repr;
+		var unit = escapeIdent(this.unit);
+		if(unit[0].toLowerCase() == "e" && (unit[1] == "-" || between(unit.charCodeAt(1), 0x30, 0x39))) {
+			// Unit is ambiguous with scinot
+			// Remove the leading "e", replace with escape.
+			unit = "\\65 " + unit.slice(1, unit.length);
+		}
+		return source+unit;
+	};
+
+	function escapeIdent(string) {
+		string = ''+string;
+		var result = '';
+		var firstcode = string.charCodeAt(0);
+		for(var i = 0; i < string.length; i++) {
+			var code = string.charCodeAt(i);
+			if(code === 0x0) {
+				throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
+			}
+
+			if(
+				between(code, 0x1, 0x1f) || code == 0x7f ||
+				(i === 0 && between(code, 0x30, 0x39)) ||
+				(i == 1 && between(code, 0x30, 0x39) && firstcode == 0x2d)
+			) {
+				result += '\\' + code.toString(16) + ' ';
+			} else if(
+				code >= 0x80 ||
+				code == 0x2d ||
+				code == 0x5f ||
+				between(code, 0x30, 0x39) ||
+				between(code, 0x41, 0x5a) ||
+				between(code, 0x61, 0x7a)
+			) {
+				result += string[i];
+			} else {
+				result += '\\' + string[i];
+			}
+		}
+		return result;
+	}
+
+	function escapeHash(string) {
+		// Escapes the contents of "unrestricted"-type hash tokens.
+		// Won't preserve the ID-ness of "id"-type hash tokens;
+		// use escapeIdent() for that.
+		string = ''+string;
+		var result = '';
+		for(var i = 0; i < string.length; i++) {
+			var code = string.charCodeAt(i);
+			if(code === 0x0) {
+				throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
+			}
+
+			if(
+				code >= 0x80 ||
+				code == 0x2d ||
+				code == 0x5f ||
+				between(code, 0x30, 0x39) ||
+				between(code, 0x41, 0x5a) ||
+				between(code, 0x61, 0x7a)
+			) {
+				result += string[i];
+			} else {
+				result += '\\' + code.toString(16) + ' ';
+			}
+		}
+		return result;
+	}
+
+	function escapeString(string) {
+		string = ''+string;
+		var result = '';
+		for(var i = 0; i < string.length; i++) {
+			var code = string.charCodeAt(i);
+
+			if(code === 0x0) {
+				throw new InvalidCharacterError('Invalid character: the input contains U+0000.');
+			}
+
+			if(between(code, 0x1, 0x1f) || code == 0x7f) {
+				result += '\\' + code.toString(16) + ' ';
+			} else if(code == 0x22 || code == 0x5c) {
+				result += '\\' + string[i];
+			} else {
+				result += string[i];
+			}
+		}
+		return result;
+	}
+
+	// Exportation.
+	exports.tokenize = tokenize;
+	exports.IdentToken = IdentToken;
+	exports.FunctionToken = FunctionToken;
+	exports.AtKeywordToken = AtKeywordToken;
+	exports.HashToken = HashToken;
+	exports.StringToken = StringToken;
+	exports.BadStringToken = BadStringToken;
+	exports.URLToken = URLToken;
+	exports.BadURLToken = BadURLToken;
+	exports.DelimToken = DelimToken;
+	exports.NumberToken = NumberToken;
+	exports.PercentageToken = PercentageToken;
+	exports.DimensionToken = DimensionToken;
+	exports.IncludeMatchToken = IncludeMatchToken;
+	exports.DashMatchToken = DashMatchToken;
+	exports.PrefixMatchToken = PrefixMatchToken;
+	exports.SuffixMatchToken = SuffixMatchToken;
+	exports.SubstringMatchToken = SubstringMatchToken;
+	exports.ColumnToken = ColumnToken;
+	exports.WhitespaceToken = WhitespaceToken;
+	exports.CDOToken = CDOToken;
+	exports.CDCToken = CDCToken;
+	exports.ColonToken = ColonToken;
+	exports.SemicolonToken = SemicolonToken;
+	exports.CommaToken = CommaToken;
+	exports.OpenParenToken = OpenParenToken;
+	exports.CloseParenToken = CloseParenToken;
+	exports.OpenSquareToken = OpenSquareToken;
+	exports.CloseSquareToken = CloseSquareToken;
+	exports.OpenCurlyToken = OpenCurlyToken;
+	exports.CloseCurlyToken = CloseCurlyToken;
+	exports.EOFToken = EOFToken;
+	exports.CSSParserToken = CSSParserToken;
+	exports.GroupingToken = GroupingToken;
+
+	function TokenStream(tokens) {
+		// Assume that tokens is a iterator.
+		this.tokens = tokens;
+		this.token = undefined;
+		this.stored = [];
+	}
+	TokenStream.prototype.consume = function(num) {
+		if(num === undefined) num = 1;
+		while (num-- > 0) {
+			if (this.stored.length > 0) {
+				this.token = this.stored.shift();
+			} else {
+				var n = this.tokens.next();
+				while (!n.done && n.value instanceof CommentToken) {
+					n = this.tokens.next();
+				}
+				if (n.done) {
+					this.token = new EOFToken();
+					break;
+				}
+				this.token = n.value;
+			}
+		}
+		//console.log(this.i, this.token);
+		return true;
+	};
+	TokenStream.prototype.next = function() {
+		if (this.stored.length === 0) {
+			var n = this.tokens.next();
+			while (!n.done && n.value instanceof CommentToken) {
+				n = this.tokens.next();
+			}
+			if (n.done)
+				return new EOFToken();
+			this.stored.push(n.value);
+		}
+		return this.stored[0];
+	};
+	TokenStream.prototype.reconsume = function() {
+		this.stored.unshift(this.token);
+	};
+
+	function parseerror(s, msg) {
+		console.log("Parse error at token " + s.i + ": " + s.token + ".\n" + msg);
+		return true;
+	}
+	function donothing(){ return true; }
+
+	function consumeAListOfRules(s, topLevel) {
+		var rules = [];
+		var rule;
+		while(s.consume()) {
+			if(s.token instanceof WhitespaceToken) {
+				continue;
+			} else if(s.token instanceof EOFToken) {
+				return rules;
+			} else if(s.token instanceof CDOToken || s.token instanceof CDCToken) {
+				if(topLevel == "top-level") continue;
+				s.reconsume();
+				if(rule = consumeAQualifiedRule(s)) rules.push(rule);
+			} else if(s.token instanceof AtKeywordToken) {
+				s.reconsume();
+				if(rule = consumeAnAtRule(s)) rules.push(rule);
+			} else {
+				s.reconsume();
+				if(rule = consumeAQualifiedRule(s)) rules.push(rule);
+			}
+		}
+	}
+
+	function consumeAnAtRule(s) {
+		s.consume();
+		var rule = new AtRule(s.token.value);
+		while(s.consume()) {
+			if(s.token instanceof SemicolonToken || s.token instanceof EOFToken) {
+				return rule;
+			} else if(s.token instanceof OpenCurlyToken) {
+				rule.value = consumeASimpleBlock(s);
+				return rule;
+			} else {
+				s.reconsume();
+				rule.prelude.push(consumeAComponentValue(s));
+			}
+		}
+	}
+
+	function consumeAQualifiedRule(s) {
+		var rule = new QualifiedRule();
+		while(s.consume()) {
+			if(s.token instanceof EOFToken) {
+				parseerror(s, "Hit EOF when trying to parse the prelude of a qualified rule.");
+				return;
+			} else if(s.token instanceof OpenCurlyToken) {
+				rule.value = consumeASimpleBlock(s);
+				return rule;
+			} else {
+				s.reconsume();
+				rule.prelude.push(consumeAComponentValue(s));
+			}
+		}
+	}
+
+	function consumeAListOfDeclarations(s) {
+		var decls = [];
+		while(s.consume()) {
+			if(s.token instanceof WhitespaceToken || s.token instanceof SemicolonToken) {
+				donothing();
+			} else if(s.token instanceof EOFToken) {
+				return decls;
+			} else if(s.token instanceof AtKeywordToken) {
+				s.reconsume();
+				decls.push(consumeAnAtRule(s));
+			} else if(s.token instanceof IdentToken) {
+				var temp = [s.token];
+				while(!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken))
+					temp.push(consumeAComponentValue(s));
+				var decl;
+				if(decl = consumeADeclaration(new TokenStream(temp))) decls.push(decl);
+			} else {
+				parseerror(s);
+				s.reconsume();
+				while(!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken))
+					consumeAComponentValue(s);
+			}
+		}
+	}
+
+	function consumeADeclaration(s) {
+		// Assumes that the next input token will be an ident token.
+		s.consume();
+		var decl = new Declaration(s.token.value);
+		while(s.next() instanceof WhitespaceToken) s.consume();
+		if(!(s.next() instanceof ColonToken)) {
+			parseerror(s);
+			return;
+		} else {
+			s.consume();
+		}
+		while(!(s.next() instanceof EOFToken)) {
+			decl.value.push(consumeAComponentValue(s));
+		}
+		var foundImportant = false;
+		for(var i = decl.value.length - 1; i >= 0; i--) {
+			if(decl.value[i] instanceof WhitespaceToken) {
+				continue;
+			} else if(decl.value[i] instanceof IdentToken && decl.value[i].ASCIIMatch("important")) {
+				foundImportant = true;
+			} else if(foundImportant && decl.value[i] instanceof DelimToken && decl.value[i].value == "!") {
+				decl.value.splice(i, decl.value.length);
+				decl.important = true;
+				break;
+			} else {
+				break;
+			}
+		}
+		return decl;
+	}
+
+	function consumeAComponentValue(s) {
+		s.consume();
+		if(s.token instanceof OpenCurlyToken || s.token instanceof OpenSquareToken || s.token instanceof OpenParenToken)
+			return consumeASimpleBlock(s);
+		if(s.token instanceof FunctionToken)
+			return consumeAFunction(s);
+		return s.token;
+	}
+
+	function consumeASimpleBlock(s) {
+		var mirror = s.token.mirror;
+		var block = new SimpleBlock(s.token.value);
+		block.startToken = s.token;
+		while(s.consume()) {
+			if(s.token instanceof EOFToken || (s.token instanceof GroupingToken && s.token.value == mirror))
+				return block;
+			else {
+				s.reconsume();
+				block.value.push(consumeAComponentValue(s));
+			}
+		}
+	}
+
+	function consumeAFunction(s) {
+		var func = new Func(s.token.value);
+		while(s.consume()) {
+			if(s.token instanceof EOFToken || s.token instanceof CloseParenToken)
+				return func;
+			else {
+				s.reconsume();
+				func.value.push(consumeAComponentValue(s));
+			}
+		}
+	}
+
+	function normalizeInput(input) {
+		if(typeof input == "string")
+			return new TokenStream(tokenize(input));
+		if(input instanceof TokenStream)
+			return input;
+		if(typeof (input.next) == "function")
+			return new TokenStream(input);
+		if(input.length !== undefined)
+			return new TokenStream(input[Symbol.iterator]());
+		else throw SyntaxError(input);
+	}
+
+	function parseAStylesheet(s) {
+		s = normalizeInput(s);
+		var sheet = new Stylesheet();
+		sheet.value = consumeAListOfRules(s, "top-level");
+		return sheet;
+	}
+
+	function parseAListOfRules(s) {
+		s = normalizeInput(s);
+		return consumeAListOfRules(s);
+	}
+
+	function parseARule(s) {
+		s = normalizeInput(s);
+		while(s.next() instanceof WhitespaceToken) s.consume();
+		if(s.next() instanceof EOFToken) throw SyntaxError();
+		var rule;
+		var startToken = s.next();
+		if(startToken instanceof AtKeywordToken) {
+			rule = consumeAnAtRule(s);
+		} else {
+			rule = consumeAQualifiedRule(s);
+			if(!rule) throw SyntaxError();
+		}
+		rule.startToken = startToken;
+		rule.endToken = s.token;
+		return rule;
+	}
+
+	function parseADeclaration(s) {
+		s = normalizeInput(s);
+		while(s.next() instanceof WhitespaceToken) s.consume();
+		if(!(s.next() instanceof IdentToken)) throw SyntaxError();
+		var decl = consumeADeclaration(s);
+		if(decl)
+			return decl;
+		else
+			throw SyntaxError();
+	}
+
+	function parseAListOfDeclarations(s) {
+		s = normalizeInput(s);
+		return consumeAListOfDeclarations(s);
+	}
+
+	function parseAComponentValue(s) {
+		s = normalizeInput(s);
+		while(s.next() instanceof WhitespaceToken) s.consume();
+		if(s.next() instanceof EOFToken) throw SyntaxError();
+		var val = consumeAComponentValue(s);
+		if(!val) throw SyntaxError();
+		while(s.next() instanceof WhitespaceToken) s.consume();
+		if(s.next() instanceof EOFToken)
+			return val;
+		throw SyntaxError();
+	}
+
+	function parseAListOfComponentValues(s) {
+		s = normalizeInput(s);
+		var vals = [];
+		while(true) {
+			var val = consumeAComponentValue(s);
+			if(val instanceof EOFToken)
+				return vals;
+			else
+				vals.push(val);
+		}
+	}
+
+	function parseACommaSeparatedListOfComponentValues(s) {
+		s = normalizeInput(s);
+		var listOfCVLs = [];
+		while(true) {
+			var vals = [];
+			while(true) {
+				var val = consumeAComponentValue(s);
+				if(val instanceof EOFToken) {
+					listOfCVLs.push(vals);
+					return listOfCVLs;
+				} else if(val instanceof CommaToken) {
+					listOfCVLs.push(vals);
+					break;
+				} else {
+					vals.push(val);
+				}
+			}
+		}
+	}
+
+
+	function CSSParserRule() { throw "Abstract Base Class"; }
+	CSSParserRule.prototype.toString = function(indent) {
+		return JSON.stringify(this,null,indent);
+	};
+	CSSParserRule.prototype.toJSON = function() {
+		return {type:this.type, value:this.value};
+	};
+
+	function Stylesheet() {
+		this.value = [];
+		return this;
+	}
+	Stylesheet.prototype = Object.create(CSSParserRule.prototype);
+	Stylesheet.prototype.type = "STYLESHEET";
+
+	function AtRule(name) {
+		this.name = name;
+		this.prelude = [];
+		this.value = null;
+		return this;
+	}
+	AtRule.prototype = Object.create(CSSParserRule.prototype);
+	AtRule.prototype.type = "AT-RULE";
+	AtRule.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.name = this.name;
+		json.prelude = this.prelude;
+		return json;
+	};
+
+	function QualifiedRule() {
+		this.prelude = [];
+		this.value = [];
+		return this;
+	}
+	QualifiedRule.prototype = Object.create(CSSParserRule.prototype);
+	QualifiedRule.prototype.type = "QUALIFIED-RULE";
+	QualifiedRule.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.prelude = this.prelude;
+		return json;
+	};
+
+	function Declaration(name) {
+		this.name = name;
+		this.value = [];
+		this.important = false;
+		return this;
+	}
+	Declaration.prototype = Object.create(CSSParserRule.prototype);
+	Declaration.prototype.type = "DECLARATION";
+	Declaration.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.name = this.name;
+		json.important = this.important;
+		return json;
+	};
+
+	function SimpleBlock(type) {
+		this.name = type;
+		this.value = [];
+		return this;
+	}
+	SimpleBlock.prototype = Object.create(CSSParserRule.prototype);
+	SimpleBlock.prototype.type = "BLOCK";
+	SimpleBlock.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.name = this.name;
+		return json;
+	};
+
+	function Func(name) {
+		this.name = name;
+		this.value = [];
+		return this;
+	}
+	Func.prototype = Object.create(CSSParserRule.prototype);
+	Func.prototype.type = "FUNCTION";
+	Func.prototype.toJSON = function() {
+		var json = this.constructor.prototype.constructor.prototype.toJSON.call(this);
+		json.name = this.name;
+		return json;
+	};
+
+	function CSSLexer(text) {
+		this.stream = tokenize(text, {
+			loc: true,
+			offsets: true,
+			keepComments: true
+		});
+		this.lineNumber = 0;
+		this.columnNumber = 0;
+		return this;
+	}
+
+	CSSLexer.prototype.performEOFFixup = function(input, preserveBackslash) {
+		// Just lie for now.
+		return "";
+	};
+
+	CSSLexer.prototype.nextToken = function() {
+		if (!this.stream) {
+			return null;
+		}
+		let v = this.stream.next();
+		if (v.done || v.value.tokenType === "EOF") {
+			this.stream = null;
+			return null;
+		}
+		this.lineNumber = v.value.loc.start.line;
+		this.columnNumber = v.value.loc.start.column;
+		return v.value;
+	};
+
+	// Exportation.
+	exports.CSSParserRule = CSSParserRule;
+	exports.Stylesheet = Stylesheet;
+	exports.AtRule = AtRule;
+	exports.QualifiedRule = QualifiedRule;
+	exports.Declaration = Declaration;
+	exports.SimpleBlock = SimpleBlock;
+	exports.Func = Func;
+	exports.parseAStylesheet = parseAStylesheet;
+	exports.parseAListOfRules = parseAListOfRules;
+	exports.parseARule = parseARule;
+	exports.parseADeclaration = parseADeclaration;
+	exports.parseAListOfDeclarations = parseAListOfDeclarations;
+	exports.parseAComponentValue = parseAComponentValue;
+	exports.parseAListOfComponentValues = parseAListOfComponentValues;
+	exports.parseACommaSeparatedListOfComponentValues = parseACommaSeparatedListOfComponentValues;
+	exports.CSSLexer = CSSLexer;
+
+	}));
+
+
+/***/ },
+/* 74 */
+/***/ function(module, exports) {
+
+	// auto-generated from nsColorNameList.h
+	var cssColors = {
+	  aliceblue: [240, 248, 255],
+	  antiquewhite: [250, 235, 215],
+	  aqua: [0, 255, 255],
+	  aquamarine: [127, 255, 212],
+	  azure: [240, 255, 255],
+	  beige: [245, 245, 220],
+	  bisque: [255, 228, 196],
+	  black: [0, 0, 0],
+	  blanchedalmond: [255, 235, 205],
+	  blue: [0, 0, 255],
+	  blueviolet: [138, 43, 226],
+	  brown: [165, 42, 42],
+	  burlywood: [222, 184, 135],
+	  cadetblue: [95, 158, 160],
+	  chartreuse: [127, 255, 0],
+	  chocolate: [210, 105, 30],
+	  coral: [255, 127, 80],
+	  cornflowerblue: [100, 149, 237],
+	  cornsilk: [255, 248, 220],
+	  crimson: [220, 20, 60],
+	  cyan: [0, 255, 255],
+	  darkblue: [0, 0, 139],
+	  darkcyan: [0, 139, 139],
+	  darkgoldenrod: [184, 134, 11],
+	  darkgray: [169, 169, 169],
+	  darkgreen: [0, 100, 0],
+	  darkgrey: [169, 169, 169],
+	  darkkhaki: [189, 183, 107],
+	  darkmagenta: [139, 0, 139],
+	  darkolivegreen: [85, 107, 47],
+	  darkorange: [255, 140, 0],
+	  darkorchid: [153, 50, 204],
+	  darkred: [139, 0, 0],
+	  darksalmon: [233, 150, 122],
+	  darkseagreen: [143, 188, 143],
+	  darkslateblue: [72, 61, 139],
+	  darkslategray: [47, 79, 79],
+	  darkslategrey: [47, 79, 79],
+	  darkturquoise: [0, 206, 209],
+	  darkviolet: [148, 0, 211],
+	  deeppink: [255, 20, 147],
+	  deepskyblue: [0, 191, 255],
+	  dimgray: [105, 105, 105],
+	  dimgrey: [105, 105, 105],
+	  dodgerblue: [30, 144, 255],
+	  firebrick: [178, 34, 34],
+	  floralwhite: [255, 250, 240],
+	  forestgreen: [34, 139, 34],
+	  fuchsia: [255, 0, 255],
+	  gainsboro: [220, 220, 220],
+	  ghostwhite: [248, 248, 255],
+	  gold: [255, 215, 0],
+	  goldenrod: [218, 165, 32],
+	  gray: [128, 128, 128],
+	  grey: [128, 128, 128],
+	  green: [0, 128, 0],
+	  greenyellow: [173, 255, 47],
+	  honeydew: [240, 255, 240],
+	  hotpink: [255, 105, 180],
+	  indianred: [205, 92, 92],
+	  indigo: [75, 0, 130],
+	  ivory: [255, 255, 240],
+	  khaki: [240, 230, 140],
+	  lavender: [230, 230, 250],
+	  lavenderblush: [255, 240, 245],
+	  lawngreen: [124, 252, 0],
+	  lemonchiffon: [255, 250, 205],
+	  lightblue: [173, 216, 230],
+	  lightcoral: [240, 128, 128],
+	  lightcyan: [224, 255, 255],
+	  lightgoldenrodyellow: [250, 250, 210],
+	  lightgray: [211, 211, 211],
+	  lightgreen: [144, 238, 144],
+	  lightgrey: [211, 211, 211],
+	  lightpink: [255, 182, 193],
+	  lightsalmon: [255, 160, 122],
+	  lightseagreen: [32, 178, 170],
+	  lightskyblue: [135, 206, 250],
+	  lightslategray: [119, 136, 153],
+	  lightslategrey: [119, 136, 153],
+	  lightsteelblue: [176, 196, 222],
+	  lightyellow: [255, 255, 224],
+	  lime: [0, 255, 0],
+	  limegreen: [50, 205, 50],
+	  linen: [250, 240, 230],
+	  magenta: [255, 0, 255],
+	  maroon: [128, 0, 0],
+	  mediumaquamarine: [102, 205, 170],
+	  mediumblue: [0, 0, 205],
+	  mediumorchid: [186, 85, 211],
+	  mediumpurple: [147, 112, 219],
+	  mediumseagreen: [60, 179, 113],
+	  mediumslateblue: [123, 104, 238],
+	  mediumspringgreen: [0, 250, 154],
+	  mediumturquoise: [72, 209, 204],
+	  mediumvioletred: [199, 21, 133],
+	  midnightblue: [25, 25, 112],
+	  mintcream: [245, 255, 250],
+	  mistyrose: [255, 228, 225],
+	  moccasin: [255, 228, 181],
+	  navajowhite: [255, 222, 173],
+	  navy: [0, 0, 128],
+	  oldlace: [253, 245, 230],
+	  olive: [128, 128, 0],
+	  olivedrab: [107, 142, 35],
+	  orange: [255, 165, 0],
+	  orangered: [255, 69, 0],
+	  orchid: [218, 112, 214],
+	  palegoldenrod: [238, 232, 170],
+	  palegreen: [152, 251, 152],
+	  paleturquoise: [175, 238, 238],
+	  palevioletred: [219, 112, 147],
+	  papayawhip: [255, 239, 213],
+	  peachpuff: [255, 218, 185],
+	  peru: [205, 133, 63],
+	  pink: [255, 192, 203],
+	  plum: [221, 160, 221],
+	  powderblue: [176, 224, 230],
+	  purple: [128, 0, 128],
+	  rebeccapurple: [102, 51, 153],
+	  red: [255, 0, 0],
+	  rosybrown: [188, 143, 143],
+	  royalblue: [65, 105, 225],
+	  saddlebrown: [139, 69, 19],
+	  salmon: [250, 128, 114],
+	  sandybrown: [244, 164, 96],
+	  seagreen: [46, 139, 87],
+	  seashell: [255, 245, 238],
+	  sienna: [160, 82, 45],
+	  silver: [192, 192, 192],
+	  skyblue: [135, 206, 235],
+	  slateblue: [106, 90, 205],
+	  slategray: [112, 128, 144],
+	  slategrey: [112, 128, 144],
+	  snow: [255, 250, 250],
+	  springgreen: [0, 255, 127],
+	  steelblue: [70, 130, 180],
+	  tan: [210, 180, 140],
+	  teal: [0, 128, 128],
+	  thistle: [216, 191, 216],
+	  tomato: [255, 99, 71],
+	  turquoise: [64, 224, 208],
+	  violet: [238, 130, 238],
+	  wheat: [245, 222, 179],
+	  white: [255, 255, 255],
+	  whitesmoke: [245, 245, 245],
+	  yellow: [255, 255, 0],
+	  yellowgreen: [154, 205, 50],
+	};
+	module.exports = { cssColors };
+
+
+/***/ },
+/* 75 */
+/***/ function(module, exports) {
+
+	// auto-generated by means you would rather not know
+	var cssProperties = {
+	  "-moz-appearance": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-small", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window", ],
+	  },
+	  "-moz-outline-radius-topleft": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-outline-radius-topright": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-outline-radius-bottomright": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-outline-radius-bottomleft": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-tab-size": {
+	    inherited: true,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "animation-delay": {
+	    inherited: false,
+	    supports: 64,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "animation-direction": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset", ],
+	  },
+	  "animation-duration": {
+	    inherited: false,
+	    supports: 64,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "animation-fill-mode": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["backwards", "both", "forwards", "inherit", "initial", "none", "unset", ],
+	  },
+	  "animation-iteration-count": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["infinite", "inherit", "initial", "unset", ],
+	  },
+	  "animation-name": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "none", "unset", ],
+	  },
+	  "animation-play-state": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "paused", "running", "unset", ],
+	  },
+	  "animation-timing-function": {
+	    inherited: false,
+	    supports: 256,
+	    values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ],
+	  },
+	  "background-attachment": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["fixed", "inherit", "initial", "local", "scroll", "unset", ],
+	  },
+	  "background-clip": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ],
+	  },
+	  "background-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "background-image": {
+	    inherited: false,
+	    supports: 648,
+	    values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ],
+	  },
+	  "background-blend-mode": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset", ],
+	  },
+	  "background-origin": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ],
+	  },
+	  "background-position": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "background-repeat": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "unset", ],
+	  },
+	  "background-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-binding": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "none", "unset", "url", ],
+	  },
+	  "block-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "border-block-end-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "border-block-end-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-block-end-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-block-start-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "border-block-start-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-block-start-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-bottom-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "-moz-border-bottom-colors": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-bottom-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-bottom-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-collapse": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["collapse", "inherit", "initial", "separate", "unset", ],
+	  },
+	  "border-image-source": {
+	    inherited: false,
+	    supports: 648,
+	    values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ],
+	  },
+	  "border-image-slice": {
+	    inherited: false,
+	    supports: 1026,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-image-width": {
+	    inherited: false,
+	    supports: 1027,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-image-outset": {
+	    inherited: false,
+	    supports: 1025,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-image-repeat": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-inline-end-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "border-inline-end-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-inline-end-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-inline-start-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "border-inline-start-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-inline-start-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-left-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "-moz-border-left-colors": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-left-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-left-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-right-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "-moz-border-right-colors": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-right-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-right-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-spacing": {
+	    inherited: true,
+	    supports: 1,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-top-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "-moz-border-top-colors": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-top-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "border-top-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "border-top-left-radius": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-top-right-radius": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-bottom-right-radius": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "border-bottom-left-radius": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "bottom": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "box-decoration-break": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["clone", "inherit", "initial", "slice", "unset", ],
+	  },
+	  "box-shadow": {
+	    inherited: false,
+	    supports: 5,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "box-sizing": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ],
+	  },
+	  "caption-side": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset", ],
+	  },
+	  "clear": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset", ],
+	  },
+	  "clip": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "color": {
+	    inherited: true,
+	    supports: 4,
+	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "-moz-column-count": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["auto", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-column-fill": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "balance", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-column-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-column-gap": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "-moz-column-rule-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "-moz-column-rule-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "-moz-column-rule-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "contain": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "layout", "none", "paint", "strict", "style", "unset", ],
+	  },
+	  "content": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-control-character-visibility": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["hidden", "inherit", "initial", "unset", "visible", ],
+	  },
+	  "counter-increment": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "counter-reset": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "cursor": {
+	    inherited: true,
+	    supports: 8,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "direction": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "ltr", "rtl", "unset", ],
+	  },
+	  "display": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset", ],
+	  },
+	  "empty-cells": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["hide", "inherit", "initial", "show", "unset", ],
+	  },
+	  "align-content": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "align-items": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "align-self": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "flex-basis": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "flex-direction": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset", ],
+	  },
+	  "flex-grow": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "flex-shrink": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "flex-wrap": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse", ],
+	  },
+	  "order": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "justify-content": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "justify-items": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "justify-self": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "float": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset", ],
+	  },
+	  "-moz-float-edge": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["content-box", "inherit", "initial", "margin-box", "unset", ],
+	  },
+	  "font-family": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-feature-settings": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-kerning": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "none", "normal", "unset", ],
+	  },
+	  "font-language-override": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "normal", "unset", ],
+	  },
+	  "font-size": {
+	    inherited: true,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small", ],
+	  },
+	  "font-size-adjust": {
+	    inherited: true,
+	    supports: 1024,
+	    values: ["inherit", "initial", "none", "unset", ],
+	  },
+	  "font-stretch": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset", ],
+	  },
+	  "font-style": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "italic", "normal", "oblique", "unset", ],
+	  },
+	  "font-synthesis": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-variant-alternates": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-variant-caps": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset", ],
+	  },
+	  "font-variant-east-asian": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-variant-ligatures": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-variant-numeric": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "font-variant-position": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "normal", "sub", "super", "unset", ],
+	  },
+	  "font-weight": {
+	    inherited: true,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-force-broken-image-icon": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-auto-flow": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-auto-columns": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-auto-rows": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-template-areas": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-template-columns": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-template-rows": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-column-start": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-column-end": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-row-start": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-row-end": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "grid-column-gap": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "grid-row-gap": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "height": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "image-orientation": {
+	    inherited: true,
+	    supports: 16,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-image-region": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "ime-mode": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "inline-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "left": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "letter-spacing": {
+	    inherited: true,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "line-height": {
+	    inherited: true,
+	    supports: 1027,
+	    values: ["-moz-block-height", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "list-style-image": {
+	    inherited: true,
+	    supports: 8,
+	    values: ["inherit", "initial", "none", "unset", "url", ],
+	  },
+	  "list-style-position": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "inside", "outside", "unset", ],
+	  },
+	  "list-style-type": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "margin-block-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-block-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-bottom": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-inline-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-inline-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-left": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-right": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "margin-top": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "marker-offset": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "max-block-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "none", "unset", ],
+	  },
+	  "max-height": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ],
+	  },
+	  "max-inline-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ],
+	  },
+	  "max-width": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ],
+	  },
+	  "min-height": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "min-block-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "min-inline-size": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "min-width": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "mix-blend-mode": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset", ],
+	  },
+	  "isolation": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "isolate", "unset", ],
+	  },
+	  "object-fit": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset", ],
+	  },
+	  "object-position": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "offset-block-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "offset-block-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "offset-inline-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "offset-inline-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "opacity": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-orient": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical", ],
+	  },
+	  "outline-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "outline-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ],
+	  },
+	  "outline-width": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ],
+	  },
+	  "outline-offset": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "overflow-x": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ],
+	  },
+	  "overflow-y": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ],
+	  },
+	  "padding-block-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-block-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-bottom": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-inline-end": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-inline-start": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-left": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-right": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "padding-top": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "page-break-after": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset", ],
+	  },
+	  "page-break-before": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset", ],
+	  },
+	  "page-break-inside": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "avoid", "inherit", "initial", "unset", ],
+	  },
+	  "paint-order": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "pointer-events": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke", ],
+	  },
+	  "position": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset", ],
+	  },
+	  "quotes": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "resize": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical", ],
+	  },
+	  "right": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "ruby-align": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["center", "inherit", "initial", "space-around", "space-between", "start", "unset", ],
+	  },
+	  "ruby-position": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "over", "under", "unset", ],
+	  },
+	  "scroll-behavior": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "smooth", "unset", ],
+	  },
+	  "scroll-snap-coordinate": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-destination": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-points-x": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-points-y": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "scroll-snap-type-x": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ],
+	  },
+	  "scroll-snap-type-y": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ],
+	  },
+	  "table-layout": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["auto", "fixed", "inherit", "initial", "unset", ],
+	  },
+	  "text-align": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset", ],
+	  },
+	  "-moz-text-align-last": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset", ],
+	  },
+	  "text-decoration-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "text-decoration-line": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "text-decoration-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy", ],
+	  },
+	  "text-indent": {
+	    inherited: true,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "text-orientation": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright", ],
+	  },
+	  "text-overflow": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "text-shadow": {
+	    inherited: true,
+	    supports: 5,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-text-size-adjust": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "none", "unset", ],
+	  },
+	  "text-transform": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase", ],
+	  },
+	  "transform": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "transform-box": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["border-box", "fill-box", "inherit", "initial", "unset", "view-box", ],
+	  },
+	  "transform-origin": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "perspective-origin": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "perspective": {
+	    inherited: false,
+	    supports: 1,
+	    values: ["inherit", "initial", "none", "unset", ],
+	  },
+	  "transform-style": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["flat", "inherit", "initial", "preserve-3d", "unset", ],
+	  },
+	  "backface-visibility": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["hidden", "inherit", "initial", "unset", "visible", ],
+	  },
+	  "top": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "transition-delay": {
+	    inherited: false,
+	    supports: 64,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "transition-duration": {
+	    inherited: false,
+	    supports: 64,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "transition-property": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["all", "inherit", "initial", "none", "unset", ],
+	  },
+	  "transition-timing-function": {
+	    inherited: false,
+	    supports: 256,
+	    values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ],
+	  },
+	  "unicode-bidi": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "-moz-user-focus": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset", ],
+	  },
+	  "-moz-user-input": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset", ],
+	  },
+	  "-moz-user-modify": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["inherit", "initial", "read-only", "read-write", "unset", "write-only", ],
+	  },
+	  "-moz-user-select": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset", ],
+	  },
+	  "vertical-align": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset", ],
+	  },
+	  "visibility": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["collapse", "hidden", "inherit", "initial", "unset", "visible", ],
+	  },
+	  "white-space": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset", ],
+	  },
+	  "width": {
+	    inherited: false,
+	    supports: 3,
+	    values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-window-dragging": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["drag", "inherit", "initial", "no-drag", "unset", ],
+	  },
+	  "word-break": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["break-all", "inherit", "initial", "keep-all", "normal", "unset", ],
+	  },
+	  "word-spacing": {
+	    inherited: true,
+	    supports: 3,
+	    values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "word-wrap": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["break-word", "inherit", "initial", "normal", "unset", ],
+	  },
+	  "hyphens": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "manual", "none", "unset", ],
+	  },
+	  "writing-mode": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl", ],
+	  },
+	  "z-index": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["auto", "inherit", "initial", "unset", ],
+	  },
+	  "-moz-box-align": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset", ],
+	  },
+	  "-moz-box-direction": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["inherit", "initial", "normal", "reverse", "unset", ],
+	  },
+	  "-moz-box-flex": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-box-orient": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical", ],
+	  },
+	  "-moz-box-pack": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["center", "end", "inherit", "initial", "justify", "start", "unset", ],
+	  },
+	  "-moz-box-ordinal-group": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "-moz-stack-sizing": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["ignore", "inherit", "initial", "stretch-to-fit", "unset", ],
+	  },
+	  "clip-path": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "clip-rule": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["evenodd", "inherit", "initial", "nonzero", "unset", ],
+	  },
+	  "color-interpolation": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "linearrgb", "srgb", "unset", ],
+	  },
+	  "color-interpolation-filters": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "inherit", "initial", "linearrgb", "srgb", "unset", ],
+	  },
+	  "dominant-baseline": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script", ],
+	  },
+	  "fill": {
+	    inherited: true,
+	    supports: 12,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "fill-opacity": {
+	    inherited: true,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "fill-rule": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["evenodd", "inherit", "initial", "nonzero", "unset", ],
+	  },
+	  "filter": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "flood-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "flood-opacity": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "image-rendering": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset", ],
+	  },
+	  "lighting-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "marker-end": {
+	    inherited: true,
+	    supports: 8,
+	    values: ["inherit", "initial", "none", "unset", "url", ],
+	  },
+	  "marker-mid": {
+	    inherited: true,
+	    supports: 8,
+	    values: ["inherit", "initial", "none", "unset", "url", ],
+	  },
+	  "marker-start": {
+	    inherited: true,
+	    supports: 8,
+	    values: ["inherit", "initial", "none", "unset", "url", ],
+	  },
+	  "mask": {
+	    inherited: false,
+	    supports: 8,
+	    values: ["inherit", "initial", "none", "unset", "url", ],
+	  },
+	  "mask-type": {
+	    inherited: false,
+	    supports: 0,
+	    values: ["alpha", "inherit", "initial", "luminance", "unset", ],
+	  },
+	  "shape-rendering": {
+	    inherited: true,
+	    supports: 0,
+	    values: ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset", ],
+	  },
+	  "stop-color": {
+	    inherited: false,
+	    supports: 4,
+	    values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ],
+	  },
+	  "stop-opacity": {
+	    inherited: false,
+	    supports: 1024,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "stroke": {
+	    inherited: true,
+	    supports: 12,
+	    values: ["inherit", "initial", "unset", ],
+	  },
+	  "stroke-dasharray": {
+	    inherited: true,
+	    supports: 1027,